对于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