在libgdx中,正确放置ShapeRenderer的开始和结束

时间:2015-11-14 12:56:42

标签: libgdx

我的问题是我是否应将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());
    }
}

1 个答案:

答案 0 :(得分:0)

每当您拨打begin()identity()translate()rotate()等时,它会在您下次绘制内容时触发GPU的新刷新使用形状渲染器。因此,在您的情况下,将begin()end()移出循环不会产生非常重大的影响。

如果这是一个瓶颈,您可以尝试独立于形状渲染器计算矩形角,并使用世界空间坐标而不是像您现在所做的本地坐标一样将四条线提交给形状渲染器。然后像您建议的那样将begin()end()移出循环并对差异进行基准测试。我不确定哪种情况会更快。这会减少绘制调用,但您也可以在CPU上转换更多的点。