0

我一直在寻找答案,但没有找到任何具体的答案。

我想知道这两个示例中哪一个与速度和性能更相关。提前致谢!

我正在制作一个 2D 的 openGL ES 1.0 Android 游戏。对于动画角色,我使用不同的纹理。我对纹理有两种可能性:

第一个是将每个纹理放在一个 int 数组中,并根据框架更改选择哪个纹理:

gl.glBindTexture(GL10.GL_TEXTURE_2D, texture[actual_id]);

另一方面,我们可以有一个包含所有图像的“大”纹理,并且只需修改纹理坐标。在这种情况下,而不是:

private float textures[] = {
    // Mapping coordinates for the vertices
    0.0f, 1.0f,     // top left     (V2)
    0.0f, 0.0f,     // bottom left  (V1)
    1.0f, 1.0f,     // top right    (V4)
    1.0f, 0.0f      // bottom right (V3)
};

(这将是第一种情况)它将是:

private float textures[] = {
    // Mapping coordinates for the vertices
    0.0f, 0.5f,     // top left     (V2)
    0.0f, 0.0f,     // bottom left  (V1)
    0.5f, 0.5f,     // top right    (V4)
    0.5f, 0.0f      // bottom right (V3)
};

(使用 2x2 框)并且这些坐标应该在纹理周围移动。

我想知道哪个可能是最快的。另外,如果有第三个最好的方法,我很想知道它。

谢谢你的时间。如果我必须详细说明问题,请问我。

4

1 回答 1

0

我认为这个问题没有一般的答案,因为它取决于其他一些事情。

我假设除了要绘制的字符之外,您还有很多其他对象。让我们假设你有一个看起来像这样的游戏循环:

while (gameNotFinished) {
  changeToTerrainTexture()
  drawTerrain()
  changeToCharacterTexture()
  drawCharacter() // the character you want to draw
  changeToHouseTexture()
  drawHouse()
  ...
}

在这种情况下,无论如何您都必须更改为角色纹理。第一种方法是更好的解决方案,因为较小的纹理需要较少的纹理内存。

但是如果你的循环看起来像这样:

while (gameNotFinished) {
  changeToTerrainTexture()
  drawTerrain()
  changeToCharacterTexture()
  for (int i = 0; i < characters.size(); i++) {
    characters.get(i).draw()
  }
  ...
}

在这种情况下,您可以从第二种方式中获益,因为您可以在不更改纹理的情况下以不同的动画状态显示多个角色。

我不知道 OpenGL ES 1.0 是否有任何真正的替代方案。使用 ES 2.0,您可以选择将一个纹理用于​​多个动画状态(如您的第二种方法)并计算着色器内的纹理坐标偏移量(因此您不需要多个纹理坐标数组)。

于 2012-07-20T22:20:42.600 回答