簡體   English   中英

LibGDX:渲染基於可縮放矢量的形狀的最快方法是什么?

[英]LibGDX: What's the fastest way to render scalable-vector-based shapes?

在我的游戲(使用LibGDX創建)中,我的游戲世界充滿了很多不斷改變其大小圓圈 因為有太多的圓圈,所以我想最大化其渲染性能 :我聽說過ShapeRenderer,但似乎在性能方面並不是最好的。 PixMap也不是解決方案,因為我的圈子應該基於矢量 他們也是另一個更快的解決方案嗎? ShapeRenderer真的那么慢嗎?

PS:我已經在使用塊來減少渲染時間。

對於ShapeRenderer(特別是圓形),如果我們看一下方法,半徑不會影響性能,分段就是工作所在。 隨着尺寸的擴大,增加細分的細節,這很可能會傷害您。

我也不確定是否存在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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM