5

私はiPhone用の2Dスクロールゲームに取り組んでいます。たとえば 480×6000 ピクセルの大きな画像の背景がありますが、一部しか表示されません (ちょうど 1 画面分、480×320 ピクセル)。このような背景を画面に表示する最良の方法は何ですか?

現在、背景を複数のテクスチャに分割し (最大テクスチャ サイズの制限を回避するため)、各フレームの背景全体をテクスチャ付きの三角形のストリップとして描画します。スクロールは、モデル ビュー マトリックスを変換することによって行われます。シザー ボックスのウィンドウ サイズは 480×320 ピクセルに設定されています。これは高速であることを意図したものではありません。最適化を行う前に、動作するコードが欲しかっただけです。

おそらく OpenGL の実装は、背景の見えない部分を破棄するのに十分スマートであると考えていましたが、私が書いたいくつかの測定コードによると、背景の描画には平均で 7 ミリ秒、最大で 84 ミリ秒かかるようです。(これはシミュレーターで測定されます。) これは、レンダリング ループ全体の約半分です。私にとってはかなり遅いです。

背景の描画は、VRAM のある部分から別の部分に 480 x 320 ピクセルをコピーするのと同じくらい簡単です。つまり、非常に高速です。そのようなパフォーマンスに近づくための最良の方法は何ですか?

4

2 に答える 2

4

それはそれを行うための速い方法です。パフォーマンスを向上させるためにできること:

  • さまざまなテクスチャ形式を試してください。おそらく、SDKドキュメントには推奨される形式の詳細があり、おそらく小さい方が良いでしょう。
  • 自分で完全にオフスクリーンのタイルを切り出す
  • 画像を小さなテクスチャに分割します

1:1のズームレベルで描画していると仮定します。そうですか?

編集:おっと。あなたの質問をもっと注意深く読んだので、私は別のアドバイスを提供しなければなりません:シミュレーターで作られたタイミングは無価値です。

于 2008-10-20T09:21:11.730 に答える
3

簡単な解決策:

  • 表示可能領域のすべての側面に少なくとも 1 つの行/列のオフスクリーン タイルが存在するように、タイル (できれば四角形) のジオメトリ マトリックスを作成します。

  • それらすべてのタイルにテクスチャをマップします。

  • 1 つのタイルが表示可能領域の外に出たらすぐに、このテクスチャを解放して新しいテクスチャをバインドできます。

  • タイルの幅とタイルの高さのモジュロを位置として使用してタイルを移動します (タイルが正確に 1 つのタイルの長さを移動したときに、タイルが開始位置に再配置されるように)。また、その操作中にテクスチャを再マップすることを忘れないでください。これにより、非常に小さなグリッド/非常に小さなテクスチャ メモリをいつでもロードできます。これは GL ES では特に重要だと思います。

メモリに余裕があり、まだロード速度が遅いことに悩まされている場合 (ただし、その量のテクスチャでは問題ありません)。新しい領域に到達したときに、テクスチャをより高速なメモリ (ターゲット デバイスにあるものは何でも) にプリロードするテクスチャ ストリーミング エンジンを構築できます。その場合、テクスチャとしてのマッピングは、必要に応じてより高速なメモリから取得されます。すべてのメモリを使い果たすことなくプリロードできることを確認し、必要がない場合は動的に解放することを忘れないでください。

これは GL (ES ではない) タイル エンジンへのリンクです。私はそれを自分で使用していないので、その機能を保証することはできませんが、あなたを助けることができるかもしれません: http://www.mesa3d.org/brianp/TR.html

于 2008-10-20T09:59:13.980 に答える