0

私は OpenGL ES 2.0 について少し混乱しており、2D タイリングを処理するための正しい手順に関する信頼できる情報を見つけることができません (または、知っていて理解していなかったのかもしれません)。

簡単に言うと、私は現在、Canvas をベースにしたいくつかのゲームを持っています (実際、人々が言うほど悪くはありません。1 GHz の CPU で 30 ~ 40 の FPS が得られます)。パフォーマンスは素晴らしいですが、いくつかの新しいアイデアがあり、まばゆいばかりの特殊効果を表示するために必要なパフォーマンスを得るには、OpenGL が唯一の方法だと思います。

私は何千時間ものゲームエンジンを持っているので、避けられれば「テスト」するためだけに大きなアーキテクチャの変更を行うことに少し抵抗があります (特に私は OpenGL に慣れていないため、 1 か月かけて最高のパフォーマンスを得るのに費やす時間 (時間 = お金)。

テクスチャの切り替えは非常にコストがかかることを理解しています。また、テクスチャ領域を単一のテクスチャに保持するためのシステムがすでに用意されています。また、どのオブジェクトが画面上にあるかを追跡するので、シーンを表示するために必要な描画呼び出しのみが GPU に送信されます。

そのため、フレームごとに再描画する必要がある画面上に大量のタイル/タイルのレイヤーがあります。次のようにしたほうがよいでしょうか:

  1. レベル ファイルを解析し、各タイルを兄弟などにリンクされたポリゴン (クワッド) に変換し、読み込み時に UV マップを作成しますか? (これには、各タイルを Rectangle として格納することから、隣接するタイルのポイントを追跡してリンクできるようにするアーキテクチャの変更が必要になります)。
  2. 単一の QUAD を作成し、同じテクスチャを使用して同じパスでレンダリングできるタイルをレンダリングするように注意しながら、画面上ですべての位置に移動します。
  3. タイルごとに QUAD を作成し、各タイルで draw() メソッドを呼び出すだけです (テクスチャスワップを最小限に抑えるか、完全になくすようにします)。

画面上のオブジェクトを再配置するには、glTranslate を使用する必要がありますか (GPU に負担がかかることを理解しています)、または QUAD の座標を保持する FloatBuffer を更新する方がよいでしょうか?

ありがとうございます!

4

1 に答える 1

0

まず、OpenGL ES 2.0を使用している場合、glTranslate()は使用できません。OpenGLES1.Xでのみサポートされています。

最高のパフォーマンスを発揮するソリューションは、使用しているプラ​​ットフォームによって異なります。特に、GPUの基盤となるグラフィックスアーキテクチャ(即時レンダリングシステムかタイルレンダリングシステムか)によって、シーンで回避できる描画呼び出しの数が決まります。OpenGL ESには四辺形プリミティブ(たとえば、デスクトップOpenGLの互換性プロファイルで使用できるGL_QUADS)がないため、三角形のペアのシーケンスを描画する必要があります(それぞれが独自の描画を必要とする三角ストリップ)。呼び出し)、または三角形の各ペアが単一の四角形を構成する独立した三角形のコレクションとして(このモードはより多くの位置を変換しますが、描画呼び出しの数を減らします)、または1.提案で実行できる場合は、追跡します同じテクスチャを使用するすべてのクワッド、縮退した三角形(画面にラスタライズされない面積がゼロの三角ストリップ)を含む1つの長い三角ストリップを描画できます。これにはより多くのジオメトリ作業が必要になりますが、実行する必要のあるテクスチャスワッピングの量を減らすことができます。

最後に、頂点位置のバッファを更新するという質問に対しては、これもプラットフォームに依存するソリューションになりますが、頂点バッファオブジェクト(VBO)を使用することに注意してください。ほとんどすべてのモバイルGPUは、頂点データをそのように保存することで恩恵を受けます。

于 2013-01-20T22:53:27.953 に答える