CPU で実際にスプライトをアニメーション化すると仮定します。これは、質問に照らして理解できる唯一のことだからです (そうでなければ、最初にイミディエイト モードでスプライトを描画する方法と、いくつかの描画をスキップする方法)。 )。
AGP/PCIe は、パフォーマンスの観点から見ると、ハードディスクのように動作します。帯域幅は巨大ですが、アクセス時間はかなり顕著です。言い換えれば、転送を行うのはまったく苦痛ですが、一度行うと、数キロバイト多くても実際には何の違いもありません. 500 個のスプライトをアップロードすることと、1000 個のスプライトをアップロードすることは同じことです。
CPU でスプライトをアニメートするため、フレームごとに1 回の転送 (または) を行う必要があり、他に方法はありません。glBufferSubData
glMapBuffer/glUnmapBuffer
glBufferData(null)
イディオムを適用するなどして、必ず「新鮮な」バッファを使用してください。これにより、OpenGL がバッファーを使用 (描画) し続け、同時に (知らないうちに) 別のバッファーを提供できるようになるため、パイプラインの停止が回避されます。後で描画が完了すると、密かにバッファを反転させ、古いものを捨てます。こうすることで、適切な並列処理を実現できます (これはパフォーマンスの鍵であり、数千の頂点をカリングするよりもはるかに重要です)。
また、グラフィックス カードは、ジオメトリのカリングがかなり得意です (これには、フラグメントが生成される前に画面外にある三角形全体を破棄することが含まれます)。何百?数千?何十万?問題ない。グラフィックカードに任せましょう。
一度に半分が表示され、残りの半分が表示されない 100 万個のスプライトがある場合を除き、バッファ全体を連続してブランチなしで書き込むことが同じくらい高速であるだけでなく、キャッシュとキャッシュによってさらに高速になる可能性は低くありません。パイプライン効果。