私は小さなタイル/スプライトベースのPCゲームをチームで作業していますが、パフォーマンスの問題に直面しています。前回OpenGLを使用したのは2004年頃でしたので、コアプロファイルの使用方法を自分で教えてきましたが、少し混乱しているように感じます。
フレームごとに250〜750の48x48タイルと、約50のスプライトを画面に描画する必要があります。タイルは新しいレベルがロードされたときにのみ変化し、スプライトは常に変化しています。タイルの一部は4つの24x24ピースで構成されており、ほとんどの(ただしすべてではない)スプライトはタイルと同じサイズです。多くのタイルとスプライトはアルファブレンディングを使用します。
現在、私はこれらすべてを即時モードで行っていますが、これは悪い考えです。それでも同じように、チームメンバーの1人がそれを実行しようとすると、非常に悪いフレームレート(〜20-30 fps)を取得します。さらに多くのタイルがある場合、特にこれらのタイルの多くが切り分けられます。これはすべて、私が問題が行われている描画呼び出しの数であると思うようになります。
私はこれに対するいくつかの可能な解決策を考えましたが、私は愚かなことに時間を無駄にしないように、彼らが話していることを知っている一部の人々によってそれらを実行したかったです:
タイル:
- レベルがロードされたら、すべてのタイルを一度大きなホーンテクスチャにアタッチされたフレームバッファに描画し、各フレーム上にそのテクスチャを含む大きな長方形を描画します。
- レベルがロードされたら、すべてのタイルを静的な頂点バッファーに入れて、そのように描画します。glDrawElementsを1回呼び出すだけで、異なるテクスチャのオブジェクトを描画する方法があるのか、それとも私がやりたいことなのかわかりません。たぶん、すべてのタイルを大きな巨大なテクスチャに配置し、VBOで面白いテクスチャ座標を使用しますか?
スプライト:
- glDrawElementsを個別に呼び出して、各スプライトを描画します。これには多くのテクスチャ切り替えが関係しているようですが、これは悪いと言われています。ここでテクスチャ配列は便利でしょうか?
- 動的VBOを何らかの方法で使用します。上記の番号2と同じテクスチャの質問。
- ポイントスプライト?これはおそらくばかげています。
これらのアイデアのいずれかが理にかなっていますか?私が見渡せるどこかに良い実装はありますか?