Для ShapeRenderer (в частности, круг), если мы посмотрим на метод, радиус не влияет на производительность, сегменты - это то, где работа.И это, скорее всего, то, что вам больно, когда вы увеличиваете размер, вы увеличиваете сегменты для детализации.
Я не уверен в том, что в OpenGL есть и нативная векторная графика ... Я думаю, что в конечном итоге достичьвидеокарта, вы должны в конечном итоге стать вершинами и полигонами (если вы заполняете).Так что, на самом деле, я думаю, что решение Pixmap - это то, что вам нужно.Вы вычисляете сегменты и многоугольники для рисования один раз (с самым высоким разрешением, которое вам нужно).
С Pixmap вы сможете сделать это таким же образом, как и любой другой рендеринг текстуры, которыйВы изменяете размеры, используя переменные масштабирования (которые должны быть такими же эффективными, как и изменение масштаба).Как вы можете видеть из метода рисования круга, который использует ShapeRenderer, круг по-прежнему на самом деле просто описывает многоугольник (вы просто вычисляете его геометрию каждый раз).
Если вы хотите, чтобы опцию Pixmap опробовалиВот код для загрузки.
Вот функция kotlin для сборки PolygonSprite.Вы должны будете сделать математику для построения вершин вашего круга, но вы, вероятно, можете использовать метод рисования круга, чтобы получить представление об этом.Если вы вычислите свою геометрию для радиуса 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