OpenGL ESの大きなスクロール背景
-
03-07-2019 - |
質問
iPhone用の2Dスクロールゲームに取り組んでいます。大きな画像の背景、たとえば480&#; 215; 6000ピクセルがあり、一部のみが表示されています(正確に1画面分、480× 320ピクセル)。このような背景を画面に表示する最良の方法は何ですか?
現在、背景をいくつかのテクスチャに分割し(最大テクスチャサイズの制限を回避するため)、各フレームの背景全体をテクスチャ付きの三角形のストリップとして描画しています。スクロールは、modelviewマトリックスを変換することにより行われます。シザーボックスは、ウィンドウサイズ480× 320ピクセルに設定されています。これは高速であることを意図したものではなく、最適化する前に動作するコードが欲しかったのです。
OpenGLの実装は、背景の不可視部分を破棄するのに十分賢いのではないかと考えましたが、私が書いた測定コードによると、背景の描画には平均で7ミリ秒、最大で84ミリ秒かかります。 (これはシミュレータで測定されます。)これは、レンダリングループ全体の約半分です。私にとってはかなり遅い。
背景の描画は、VRAMのある部分から別の部分に480× 320ピクセルをコピーするのと同じくらい簡単である必要があります。そのようなパフォーマンスに近づくための最良の方法は何ですか?
解決
それはそれを行うための高速な方法です。パフォーマンスを改善するためにできること:
- さまざまなテクスチャ形式を試してください。おそらく、SDKドキュメントには推奨される形式の詳細が記載されており、おそらく小さい方が良いと思われます。
- 完全にオフスクリーンタイルを自分で切り取る
- 画像を小さなテクスチャに分割します
あなたは1:1のズームレベルで描画していると仮定しています。そうですか?
編集:エラー。あなたの質問をもっと注意深く読んで、別のアドバイスを提供しなければなりません:シミュレータで行われたタイミングは価値がありません。
他のヒント
簡単な解決策:
-
タイルのジオメトリマトリックス(できればクワッド)を作成して、表示可能領域のすべての面にオフスクリーンタイルの行/列が少なくとも1つあるようにします。
-
テクスチャをこれらすべてのタイルにマップします。
-
1つのタイルが表示可能領域の外側にあるとすぐに、このテクスチャを解放して新しいテクスチャをバインドできます。
-
タイルの幅とタイルの高さのモジュロを位置として使用してタイルを移動します(タイルの長さがちょうど1つ移動したときに、タイルが開始位置に再配置されます)。また、その操作中にテクスチャを再マップすることを忘れないでください。これにより、いつでも非常に小さなグリッド/非常に小さなテクスチャメモリをロードできます。 GL ESでは特に重要だと思います。
メモリに余裕があり、それでも遅いロード速度に悩まされている場合(ただし、その量のテクスチャを使用すべきではありません)。新しい領域に到達したときに、テクスチャを高速メモリ(ターゲットデバイス上にあるものは何でも)にプリロードするテクスチャストリーミングエンジンを構築できます。その場合、テクスチャとしてのマッピングは、必要に応じて高速メモリから行われます。すべてのメモリを使い果たすことなくプリロードできることを確認し、不要な場合は動的に解放することを忘れないでください。
これは、GL(ESではない)タイルエンジンへのリンクです。私は自分で使ったことがないので、その機能を保証することはできませんが、あなたを助けることができるかもしれません: http://www.mesa3d.org/brianp/TR.html