【发布时间】:2014-01-16 12:12:02
【问题描述】:
在类似 3D 拼字游戏的游戏中,我遇到了只能获得 8 FPS 的性能问题。将其缩小到字母瓷砖。它们有 100 个,减少它们的数量会迅速提高性能。我排除了纹理绑定,因为即使所有图块都具有与屏幕截图相同的纹理,速度也不会提高。
这是我创建每个盒子的方式:
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);
我在第一个代码中做错了什么?创建仅在一侧有纹理的盒子的正确方法是什么?
【问题讨论】:
-
你是部署在桌面还是安卓/iOS?如果您在桌面上进行部署,请确保正在使用您的专用 GPU。我目前在 Ubuntu 上运行类似的东西(使用行,而不是 rects),我遇到了大约 1000 行的类似问题。我相信运行该应用程序的是我的英特尔卡,而不是我的 Nvidia 卡,因此对性能有很大影响。不过,还没有深究。
-
我写的 FPS 值在三星 Galaxy Tab 2 10.1 上,虽然模拟器值也很接近(选中使用主机 GPU 选项)。