0

私は答えを探していましたが、それについて具体的なことは何も見つかりませんでした。

これらの2つの例のどちらが、速度とパフォーマンスに関連しているのかを知りたいです。前もって感謝します!

openGL ES1.0Androidゲームを2Dで作成しています。キャラクターをアニメートするために、私はさまざまなテクスチャを使用します。テクスチャには2つの可能性があります。

1つ目は、各テクスチャを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ボックスを使用)そして、それらの座標はテクスチャの周りを移動する必要があります。

どれが一番速いのか知りたいのですが。また、3番目に良い方法があれば私はそれについて知りたいです。

御時間ありがとうございます。質問の詳細が必要な場合は、私に聞いてください。

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()
  }
  ...
}

この場合、テクスチャを変更せずに複数のキャラクターを異なるアニメーション状態で表示できるため、2 番目の方法を利用できます。

OpenGl ES 1.0 に実際の代替手段があるかどうかはわかりません。ES 2.0 では、複数のアニメーション状態 (2 番目のアプローチのように) に 1 つのテクスチャを使用し、シェーダー内でテクスチャ座標オフセットを計算するオプションがあります (したがって、複数のテクスチャ座標配列は必要ありません)。

于 2012-07-20T22:20:42.600 に答える