【问题标题】:LibGDX: What's the fastest way to render scalable-vector-based shapes?LibGDX:渲染基于可缩放矢量的形状的最快方法是什么?
【发布时间】:2018-11-12 06:09:55
【问题描述】:

在我的游戏(使用 LibGDX 创建)中,我的游戏世界充满了许多不断变化大小的圆圈。因为有这么多很多圈我想最大化他们的rendering-performance:我听说过ShapeRenderer,但它似乎不是最好的情况表现。 PixMap 也不是解决方案,因为我的圈子应该基于矢量。 他们也是另一种更快的解决方案吗? ShapeRenderer 真的那么慢吗?

PS:我已经在使用块来减少渲染时间。

【问题讨论】:

    标签: java performance opengl libgdx rendering


    【解决方案1】:

    对于ShapeRenderer(特别是圆形),如果我们看方法,radius 不会影响性能,segments 是工作所在。这很可能是伤害您的原因,当您扩大规模时,您会增加细分以获得详细信息。

    我也不确定是否有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
        }
    

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

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-10
      • 1970-01-01
      相关资源
      最近更新 更多