我的问题是我是否应将sRenderer.begin(ShapeType.Filled);
和sRenderer.end();
放在Shape
之外?所以每个Shape.draw()
或者在性能方面的方法是否正常?
我的一个Shape
s ..
private Body body; // initialized elsewhere
private float width = 1.0f;
private float height = 1.0f;
public void draw(ShapeRenderer sRenderer) {
sRenderer.begin(ShapeType.Filled);
sRenderer.setColor(1.0f, 0.0f, 0.0f, 1.0f);
sRenderer.identity();
sRenderer.translate(getBody().getPosition().x, getBody().getPosition().y, 0);
sRenderer.rotate(0.0f, 0.0f, 1.0f, (float) Math.toDegrees(getBody().getAngle()));
sRenderer.rect(-getWidth(), -getHeight(), getWidth() * 2, getHeight() * 2);
sRenderer.end();
}
在我的Level
课程中,每个框架都会调用一个draw()
方法,例如
for (Body body : bodies) {
if (body.getUserData() instanceof Shape){
((Shape) body.getUserData()).draw(getShapeRenderer());
}
}
答案 0 :(得分:0)
每当您拨打begin()
,identity()
,translate()
,rotate()
等时,它会在您下次绘制内容时触发GPU的新刷新使用形状渲染器。因此,在您的情况下,将begin()
和end()
移出循环不会产生非常重大的影响。
如果这是一个瓶颈,您可以尝试独立于形状渲染器计算矩形角,并使用世界空间坐标而不是像您现在所做的本地坐标一样将四条线提交给形状渲染器。然后像您建议的那样将begin()
和end()
移出循环并对差异进行基准测试。我不确定哪种情况会更快。这会减少绘制调用,但您也可以在CPU上转换更多的点。