Vertex Buffer Objects (VBO) について何年も聞いた後、最終的にそれらを試してみることにしました (私のものは通常、パフォーマンスが重要ではないことは明らかです...)
以下で私の実験について説明しますが、簡単に言うと、「単純な」ダイレクト モード (glBegin()/glEnd())、頂点配列 (CPU 側)、および VBO (GPU 側) の間で見分けがつかないパフォーマンスが見られます。レンダリング モード。これがなぜなのか、どのような条件下で、VBO が原始的な (しゃれを意図した) 先祖よりもはるかに優れていると期待できるかを理解しようとしています。
実験の詳細
実験のために、多数のポイントからなる (静的) 3D ガウス クラウドを生成しました。各ポイントには、それに関連付けられた頂点と色の情報があります。次に、一連のフレームでカメラを雲の周りで「周回」動作のように回転させました。繰り返しますが、ポイントは静的で、目だけが動きます (gluLookAt() を介して)。データは、レンダリングの前に 1 回生成され、レンダリング ループで使用するために 2 つの配列に格納されます。
直接レンダリングの場合、データセット全体が単一の glBegin()/glEnd() ブロックでレンダリングされ、ループには glColor3fv() と glVertex3fv() への単一の呼び出しが含まれます。
頂点配列と VBO レンダリングの場合、データ セット全体が単一の glDrawArrays() 呼び出しでレンダリングされます。
次に、タイトなループで 1 分程度実行し、高性能タイマーで平均 FPS を測定します。
パフォーマンス結果 ##
前述のように、デスクトップ マシン (XP x64、8 GB RAM、512 MB Quadro 1700) とラップトップ (XP32、4 GB RAM、256 MB Quadro NVS 110) の両方でパフォーマンスに違いはありませんでした。ただし、ポイント数で予想どおりにスケーリングしました。明らかに、vsync も無効にしました。
ラップトップの実行からの特定の結果 (GL_POINTS を使用したレンダリング):
glBegin()/glEnd():
- 1K ポイント --> 603 FPS
- 10K ポイント --> 401 FPS
- 100K ポイント --> 97 FPS
- 1M ポイント --> 14 FPS
頂点配列 (CPU 側):
- 1K ポイント --> 603 FPS
- 10K ポイント --> 402 FPS
- 100K ポイント --> 97 FPS
- 1M ポイント --> 14 FPS
頂点バッファ オブジェクト (GPU 側):
- 1K ポイント --> 604 FPS
- 10K ポイント --> 399 FPS
- 100K ポイント --> 95 FPS
- 1M ポイント --> 14 FPS
GL_TRIANGLE_STRIP を使用して同じデータをレンダリングしたところ、同様に見分けがつきませんでした (ただし、追加のラスタライズにより予想どおり遅くなりました)。誰かがそれらを望むなら、私もそれらの番号を投稿できます. .
質問
- 何を与える?
- VBO の約束されたパフォーマンスの向上を実現するには、何をしなければなりませんか?
- 私は何が欠けていますか?