LibGDX:渲染基于可伸缩矢量的形状的最快方法是什么?

时间:2018-06-02 07:38:34

标签: java performance opengl libgdx rendering

在我的游戏中(使用LibGDX创建)我有一个游戏世界充满了许多圈子不断改变他们的大小。因为有很多很多圈子,我想最大化它们的渲染性能:我听说过ShapeRenderer,但似乎它不是最好的情况下性能。 PixMap也没有解决方案,因为我的圈子应该是基于矢量。 他们是另一个更快的解决方案吗ShapeRenderer真的很慢吗?

PS:我已经在使用块来缩短渲染时间。

1 个答案:

答案 0 :(得分:1)

对于ShapeRenderer(特别是圆),如果我们查看方法,radius不会影响性能,segment就是工作的地方。这很可能会伤到你,当你扩大规模时,你会增加细分的细分。

我不确定是否有opengl原生矢量图形...我认为最终要到达显卡,你需要最终成为顶点和多边形(如果你正在填充)。实际上,我认为Pixmap解决方案是您可能正在寻找的解决方案。您计算要绘制的线段和多边形一次(以您需要的最高分辨率)。

使用Pixmap,您应该能够以与使用缩放变量更改大小的纹理的任何其他渲染一样高效的方式执行此操作(这应该与不改变比例一样高效)。正如你从ShapeRenderer使用的圆绘制方法中看到的那样,圆圈仍然只是描述一个多边形(你每次只计算它的几何形状)。

如果你想给Pixmap选项一个去,这里有一些代码可以让你自我引导。

这是用于构建PolygonSprite的kotlin函数。您将不得不进行绘制圆的顶点的数学运算,但您可以使用圆绘制方法来了解它。如果计算半径为1的几何体,则可以使用x / y比例将半径设置为所需的任何大小。

    fun polygonSprite(points: Array<Vector2>): PolygonSprite {
        val pix = Pixmap(1, 1, Pixmap.Format.RGBA8888)
        pix.setColor(0xFFFFFFFF.toInt())
        pix.fill()
        val textureSolid = Texture(pix)
        val vertices = FloatArray(points.size * 2)
        val triangleIndices = triangulator.computeTriangles(vertices)
        for (i in 0..points.size - 1) {
            val point = points.get(i)
            val offset = i * 2
            vertices[offset] = point.x
            vertices[offset + 1] = point.y
        }
        val polyReg = PolygonRegion(TextureRegion(textureSolid),
                vertices, triangleIndices.toArray())
        val poly = PolygonSprite(polyReg)
        return poly
    }

这是一些渲染代码。它考虑了父体的形状和其他一些东西的相对位置:

fun render(camera: OrthographicCamera) {
    val parentRotation = (me().physicsRoot.rotationR() * MathUtils.radDeg) 
    val parentTransform = me().physicsRoot.transform
    val myPosition = vec2(offsetX, offsetY)
    parentTransform.mul(myPosition)
    poly.color = color.get()
    poly.setOrigin(0f, 0f)
    poly.setPosition(myPosition.x, myPosition.y)
    poly.rotation = parentRotation + rotationD
    poly.setScale(scaleX, scaleY)
    poly.draw(JJ.B.renderWorld.polyBatch)
    recycle(myPosition)
}

另外,不要为每个人制作新的,尝试并重复使用它们。

PS:另一种选择是制作圆形着色器:D

相关问题