Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在libgdx中构建一侧带有纹理的长方体-性能_Android_Opengl Es_Libgdx - Fatal编程技术网

Android 在libgdx中构建一侧带有纹理的长方体-性能

Android 在libgdx中构建一侧带有纹理的长方体-性能,android,opengl-es,libgdx,Android,Opengl Es,Libgdx,在一个3D拼字游戏中,我有一个只有8帧的性能问题。把它缩小到字母瓷砖。它们有100个,减少它们的数量可以快速提高性能。我排除了纹理绑定,因为即使所有的瓷砖都具有与屏幕截图相同的纹理,速度也不会提高 以下是我创建每个框的方式: public static void createModel() { matWhite = new Material(ColorAttribute.createDiffuse(Color.WHITE)); ModelBuilder modelBuilder = n

在一个3D拼字游戏中,我有一个只有8帧的性能问题。把它缩小到字母瓷砖。它们有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);

在第一个代码中我做错了什么?创建只在一侧具有纹理的长方体的正确方法是什么?

每次调用
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范围:

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);
...

现在,如果您仍然体验性能问题,您可以考虑将多个瓦片组合成单个模型(部分:绘制调用)。但这可能不需要立即进行上述更改


更多信息:

您是在桌面上部署还是在Android/iOS上部署?如果要在桌面上部署,请确保正在使用专用GPU。我目前正在Ubuntu上运行类似的东西(使用行,而不是rects),我在大约1000行中遇到了类似的问题。我相信是我的Intel卡在运行应用程序,而不是我的Nvidia卡,因此性能受到了很大的影响。我写的FPS值在三星Galaxy Tab 2 10.1上,虽然emulator值也很接近(选中使用主机GPU选项)。25 FPS,耶!现在读你的博客,非常感谢!