2014-01-16 18 views
5

在3D拼图游戏中,我的性能问题只有8个FPS。将其缩小为字母瓦片。有100个,减少他们的数量迅速提高性能。我排除了纹理绑定,因为即使所有拼贴具有与截图一样的纹理,速度也不会提高。在libgdx的一边建立一个纹理的框 - 性能

​​

这是我创建的每个盒子:

public static void createModel() { 
    matWhite = new Material(ColorAttribute.createDiffuse(Color.WHITE)); 
    ModelBuilder modelBuilder = new ModelBuilder(); 
    modelBuilder.begin(); 
    MeshPartBuilder tileBuilder; 
    tileBuilder = modelBuilder.part("top", GL10.GL_TRIANGLES, Usage.Position | Usage.Normal | Usage.TextureCoordinates, matWhite); 
    tileBuilder.rect(-0.45f, 0.1f, 0.45f, 0.45f, 0.1f, 0.45f, 0.45f, 0.1f, -0.45f, -0.45f, 0.1f, -0.45f, 0f, 1f, 0f); 
    tileBuilder = modelBuilder.part("bottom", GL10.GL_TRIANGLES, Usage.Position | Usage.Normal, matWhite); 
    tileBuilder.rect(-0.45f, 0f, -0.45f, 0.45f, 0f, -0.45f,  0.45f, 0f, 0.45f,  -0.45f, 0f, 0.45f, 0f, -1f, 0f); 
    tileBuilder = modelBuilder.part("front", GL10.GL_TRIANGLES, Usage.Position | Usage.Normal, matWhite); 
    tileBuilder.rect(-0.45f, 0.1f, 0.45f, -0.45f, 0f, 0.45f,  0.45f, 0f, 0.45f,  0.45f, 0.1f, 0.45f, 0f, 0f, 1f); 
    tileBuilder = modelBuilder.part("left", GL10.GL_TRIANGLES, Usage.Position | Usage.Normal, matWhite); 
    tileBuilder.rect(-0.45f, 0.1f, 0.45f, -0.45f, 0.1f, -0.45f, -0.45f, 0f, -0.45f, -0.45f, 0f, 0.45f, -1f, 0f, 0f); 
    tileBuilder = modelBuilder.part("right", GL10.GL_TRIANGLES, Usage.Position | Usage.Normal, matWhite); 
    tileBuilder.rect(0.45f, 0.1f, 0.45f, 0.45f, 0f, 0.45f,  0.45f, 0f, -0.45f,  0.45f, 0.1f, -0.45f, 0f, 0f, 1f); 
    tileBuilder = modelBuilder.part("back", GL10.GL_TRIANGLES, Usage.Position | Usage.Normal, matWhite); 
    tileBuilder.rect(-0.45f, 0.1f, -0.45f, 0.45f, 0.1f, -0.45f, 0.45f, 0f, -0.45f, -0.45f, 0f, -0.45f, 0f, 0f, 1f); 
    modelTile = modelBuilder.end(); 
} 

public void createModelInstance(com.badlogic.gdx.assets.AssetManager assetManager) { 
    Texture texTile = assetManager.get("textures/" + textureFile + ".jpg", Texture.class); 
    Material mat = new Material(TextureAttribute.createDiffuse(texTile)); 
    modelInstance = new ModelInstance(modelTile); 
    modelInstance.nodes.get(0).parts.get(0).material.set(mat); 
} 

虽然实验,我发现这样的速度上升到25 FPS(即使正在使用的所有100个纹理),如果我更换网部分建筑代码与创建一个简单的盒子(它显示了各方面的纹理,所以它不是非常有用的这个游戏)。他们的createBox方法也调用了rect()6次,但到目前为止我没有看到区别。

modelTile = modelBuilder.createBox(0.9f, 0.1f, 0.9f, matWhite, Usage.Position | Usage.Normal | Usage.TextureCoordinates); 

我在做第一个代码时出错了吗?只有一面创建具有纹理的框的正确方法是什么?

+0

您是在桌面上还是在Android/iOS上部署?如果您要在桌面上部署,请确保正在使用专用GPU。我目前在Ubuntu上运行类似的东西(使用行,而不是rects),并且我得到了大约1000行的类似问题。我相信这是我的英特尔卡运行的应用程序,而不是我的Nvidia卡,因此阻碍了性能相当多。尽管如此,还没有到底。 –

+0

我写的FPS值在三星Galaxy Tab 2 10.1上,尽管模拟器值也很接近(选中Use Host GPU选项)。 – Arthur

回答

5

每次拨打电话modelBuilder.part时,表示有平局。由于它们非常昂贵,因此您确实希望将绘制调用的次数降至最低。此外,由于您有不同的顶点属性,因此必须在第一个和其他部分之间切换网格和着色器。您还需要将网格和着色器开关的数量降至最低。

所以,开始优化,你可能会想的部件具有相同属性合并:

tileBuilder = modelBuilder.part("top", GL10.GL_TRIANGLES, Usage.Position | Usage.Normal | Usage.TextureCoordinates, matWhite); 
tileBuilder.rect(-0.45f, 0.1f, 0.45f, 0.45f, 0.1f, 0.45f, 0.45f, 0.1f, -0.45f, -0.45f, 0.1f, -0.45f, 0f, 1f, 0f); 
tileBuilder = modelBuilder.part("others", GL10.GL_TRIANGLES, Usage.Position | Usage.Normal, matWhite); 
tileBuilder.rect(-0.45f, 0f, -0.45f, 0.45f, 0f, -0.45f,  0.45f, 0f, 0.45f,  -0.45f, 0f, 0.45f, 0f, -1f, 0f); 
tileBuilder.rect(-0.45f, 0.1f, 0.45f, -0.45f, 0f, 0.45f,  0.45f, 0f, 0.45f,  0.45f, 0.1f, 0.45f, 0f, 0f, 1f); 
tileBuilder.rect(-0.45f, 0.1f, 0.45f, -0.45f, 0.1f, -0.45f, -0.45f, 0f, -0.45f, -0.45f, 0f, 0.45f, -1f, 0f, 0f); 
tileBuilder.rect(0.45f, 0.1f, 0.45f, 0.45f, 0f, 0.45f,  0.45f, 0f, -0.45f,  0.45f, 0.1f, -0.45f, 0f, 0f, 1f); 
tileBuilder.rect(-0.45f, 0.1f, -0.45f, 0.45f, 0.1f, -0.45f, 0.45f, 0f, -0.45f, -0.45f, 0f, -0.45f, 0f, 0f, 1f); 

并进一步优化(消除所有网交换机),您可以使用相同的顶点属性。当然,这会将纹理属性添加到没有纹理的边上。但只要材质没有纹理,就会被忽略。

tileBuilder = modelBuilder.part("top", GL10.GL_TRIANGLES, Usage.Position | Usage.Normal | Usage.TextureCoordinates, matTop); 
tileBuilder.rect(-0.45f, 0.1f, 0.45f, 0.45f, 0.1f, 0.45f, 0.45f, 0.1f, -0.45f, -0.45f, 0.1f, -0.45f, 0f, 1f, 0f); 
tileBuilder = modelBuilder.part("others", GL10.GL_TRIANGLES, Usage.Position | Usage.Normal | Usage.TextureCoordinates, matOthers); 
tileBuilder.rect(-0.45f, 0f, -0.45f, 0.45f, 0f, -0.45f,  0.45f, 0f, 0.45f,  -0.45f, 0f, 0.45f, 0f, -1f, 0f); 
... 

为了优化甚至更(消除所有着色器开关和减少绘制调用的数量),可以在单个像素添加到将由双方中使用的纹理,并设置UV范围accordingle:

tileBuilder = modelBuilder.part("top", GL10.GL_TRIANGLES, Usage.Position | Usage.Normal | Usage.TextureCoordinates, matWhite); 
tileBuilder.setUVRange(0,0,1,1); 
tileBuilder.rect(-0.45f, 0.1f, 0.45f, 0.45f, 0.1f, 0.45f, 0.45f, 0.1f, -0.45f, -0.45f, 0.1f, -0.45f, 0f, 1f, 0f); 
tileBuilder.setUVRange(0,0,0,0); // Assumes the top left pixel is the correct color for the other sides 
tileBuilder.rect(-0.45f, 0f, -0.45f, 0.45f, 0f, -0.45f,  0.45f, 0f, 0.45f,  -0.45f, 0f, 0.45f, 0f, -1f, 0f); 
... 

现在,如果您仍然遇到性能问题,可以考虑将多个贴图合并到一个模型中(部分:绘制调用)。但是,上述变化可能不会立即需要。

更多信息:http://blog.xoppa.com/behind-the-3d-scenes-part1/

+0

25 FPS,耶!现在阅读您的博客条目,非常感谢! – Arthur