opengl を使用して Android でゲームを開発していますが、パフォーマンスに少し問題があります。
たとえば、草の「茂み」で部分的に満たされた背景を描きたいとしましょう。茂みは異なる x、y、z、異なるサイズなどを持ち (各茂みは 2D スプライトです)、互いに部分的に隠れる可能性があります (私は遠近法カメラを使用しています)。これらのスプライトが大きい場合 (つまり、テクスチャ サイズ/解像度ではなくクワッド サイズ)、大きなパフォーマンスの問題が発生します。
(オーバードローを避けるために) 従来のフロントツーバック ドローを使用すると、(私が思うに) アルファ テストが原因で問題が発生します。茂みに不透明で完全に透明なピクセルしかなく (部分的な透明度はありません)、適切なアルファ テスト比較 (GL_EQUAL 1) を使用すると、多くのピクセルをアルファ テストする必要があるため、パフォーマンスが低下します (正しく理解している場合)。 .
アルファ テストを無効にしてバック ツー フロント ディスプレイを使用すると、デプス バッファの書き込みを無効にしてもパフォーマンスが大幅に低下します (ただし、今回はオーバードローの問題が原因です)。仕方)。
アルファ テストを行わずに前後を使用すると、パフォーマンスは良好ですが、もちろん、スプライトのカットアウトは完全になくなりました。これは非常に悪いことです。
すべての茂みは同じテクスチャを持ち、16 ビット カラー、ミップ マッピング、ジオメトリ バッチ処理、カリング フェース、シェーダーなしなどを使用します。テクスチャ圧縮を除いて、パフォーマンスを向上させるために考えられるすべてのこと (他の場合は悪くありません)。 . スプライトをフィルタリングして、スプライトが画面外に「表示」されないようにします。また、テクスチャを完全に不透明にする、テクスチャの解像度を大幅に下げる、ブレンドを無効にするなど、テスト目的でいくつかの「激しい最適化」を試みましたが、アルファ テストの削除を除いてパフォーマンス面で素晴らしいものはありませんでした。
パフォーマンスを助けるためにここに何かを忘れていたのではないかと思っていました。バックツーフロントはオーバードローを作成し、アルファテストのためにフロントツーバックは遅くなります(そして、茂みを「正方形」のイメージにしたくないので、アルファテストを無効にすることはできません)。小さいスプライトを作成すると、(スプライトの数が多くても) パフォーマンスははるかに向上しますが、これは回避策にすぎません。
要約すると、カットアウトが必要なオーバーラップする大きなクワッドを、パフォーマンスを損なうことなく表示するにはどうすればよいでしょうか?
PS:ネクサスでテストしています。
PS2 : いくつかの最適化では、クワッドを作成せずにジオメトリをテクスチャに「適合」させることを提案していますが、それは非常に面倒なプロセスのようで、あまり役に立たないと思います。