1

パフォーマンス上の理由から、即時モードの代わりに VBO を使用することを検討しています。スプライトで満たされた 2D 正投影シーンを作成しています。画面外のスプライトを描きたくありません。これは、画面サイズとカメラの位置に対してそれらの位置を確認することによって行います。

即時モードでは、これは簡単です。スプライトごとに draw メソッドがあります。VBO を使用すると、これは自明ではないようです。一度に VBO のセクション全体をレンダリングします。画面外にあるレンダリング スプライトから選択する (私が考えることができる) 方法はありません。

4

1 に答える 1

5

CPU で実際にスプライトをアニメーション化すると仮定します。これは、質問に照らして理解できる唯一のことだからです (そうでなければ、最初にイミディエイト モードでスプライトを描画する方法と、いくつかの描画をスキップする方法)。 )。

AGP/PCIe は、パフォーマンスの観点から見ると、ハードディスクのように動作します。帯域幅は巨大ですが、アクセス時間はかなり顕著です。言い換えれば、転送を行うのはまったく苦痛ですが、一度行うと、数キロバイト多くても実際には何の違いもありません. 500 個のスプライトをアップロードすることと、1000 個のスプライトをアップロードすることは同じことです。

CPU でスプライトをアニメートするため、フレームごとに1 回の転送 (または) を行う必要があり、他に方法はありません。glBufferSubDataglMapBuffer/glUnmapBuffer

glBufferData(null)イディオムを適用するなどして、必ず「新鮮な」バッファを使用してください。これにより、OpenGL がバッファーを使用 (描画) し続け、同時に (知らないうちに) 別のバッファーを提供できるようになるため、パイプラインの停止が回避されます。後で描画が完了すると、密かにバッファを反転させ、古いものを捨てます。こうすることで、適切な並列処理を実現できます (これはパフォーマンスの鍵であり、数千の頂点をカリングするよりもはるかに重要です)。

また、グラフィックス カードは、ジオメトリのカリングがかなり得意です (これには、フラグメントが生成される前に画面外にある三角形全体を破棄することが含まれます)。何百?数千?何十万?問題ない。グラフィックカードに任せましょう。

一度に半分が表示され、残りの半分が表示されない 100 万個のスプライトがある場合を除き、バッファ全体を連続してブランチなしで書き込むことが同じくらい高速であるだけでなく、キャッシュとキャッシュによってさらに高速になる可能性は低くありません。パイプライン効果。

于 2012-06-13T23:18:30.040 に答える