2015-04-17 66 views
0

我目前正在使用libgdx并创建一个只有shaperenderer的游戏,但在我的脑海中有一个问题。是开始,因为我用的每一个实体开始不只是一个开始为游戏Libgdx ShapeRenderer性能

public void render() { 

    sr.setProjectionMatrix(Game.cam.combined); 

    // Render Board 
    board.render(sr); 

    // Render Balls 
    for (int i = 0; i < balls.size(); i++) { 
     balls.get(i).render(sr); 
    } 

    // Render Players 
    player1.render(sr); 
    if (player2 != null) { 
     player2.render(sr); 
    } 

    // Render Cannons 
    downCannon.render(sr); 
    if (upCannon != null) { 
     upCannon.render(sr); 
    } 

    // Render Particles 
    for (int i = 0; i < particles.size(); i++) { 
     particles.get(i).render(sr); 
    } 

    // Render BigRainParticles 
    for (int i = 0; i < bigRainParticles.size(); i++) { 
     bigRainParticles.get(i).render(sr); 
    } 

    // Render SmallRainParticles 
    for (int i = 0; i < smallRainParticles.size(); i++) { 
     smallRainParticles.get(i).render(sr); 
    } 

    // Render Gui 
    gui.render(sr); 
} 

其余正如你可以看到我给的shaperenderer到实体end方法降低FPS。而实体内:

public void render(ShapeRenderer sr) { 

    sr.begin(ShapeType.Line); 
    sr.setColor(0, 0, 0, 1); 
    sr.line(x, y, ballX, ballY); 
    sr.end(); 

    sr.begin(ShapeType.Filled); 
    sr.setColor(0, 0, 0, 1); 
    sr.circle(ballX, ballY, radius); 
    sr.end(); 

    if (rect) { 
     sr.begin(ShapeType.Filled); 
     sr.setColor(0, 0, 0, 1); 
     sr.rect(rectX - 5, rectY - 5, 10, 10); 
     sr.setColor(1, 1, 1, 1); 
     sr.rect(rectX - 4, rectY - 4, 8, 8); 
     sr.end(); 
    } 
} 

约性能自动任何帮助表示赞赏:)

+1

如果你拿一个看看源代码(https://github.com/libgdx/libgdx/blob/master/gdx/src/com/badlogic/gdx/graphics/glutils/ShapeRenderer.java),你会看到'end'调用了渲染器.end()'这使得''renderer'刷新它对GPU的东西,这是一个相当“重”的操作。因此,只有在绝对必要时才应该调用'flush'或'end'。 – Springrbua

回答

0

由于您使用的是相同的ShapeRenderer对象所有对象调用开始在主要的开始渲染方法,并在年底结束了。所以你打电话开始和结束一次。

您希望早些时候结束ShapeRenderer的唯一原因是如果您想使用不同的批处理或渲染器进行绘制,在您的情况下它看起来不是。

例如: 通常我使用scene2d,并且我在绘图方法中有舞台批处理。当我想使用ShapeRender进行原始绘图时,我需要调用batch.end()然后调用shapeRenderer()。begin - >绘制东西 - > shapeRenderer.end(),最后是batch.begin()