2

私のシステムは、クワッドを表すいくつかのオブジェクトで構成されています。各クワッドは同じ頂点で表されるため、各オブジェクトは、ワールドを介したオブジェクトの変換と独自のオブジェクト空間を表すマトリックスのみを格納します。各レンダー パス中に、これらの行列がフレーム変換で更新された後、現在のビューおよび投影行列と乗算されて、そのオブジェクトの MVP 行列が形成されます。次に、オブジェクトの頂点が MVP マトリックスと共にシェーダーに送信され、そこで頂点が MVP マトリックスで乗算されます。ここでの非効率性は、各クワッドが個別に描画されることです。つまり、クワッドごとに個別の呼び出し glDrawElements が存在します。任意の時点で、50 または 60 のクワッドが存在する可能性があり、一部は範囲外に移動して破壊されるか、アニメーションが完了する可能性があるため、reも破壊されますが、より多くがランダムに存在します。必要なすべての値を VBO に格納し、各パスで glDrawElements を 1 回呼び出すだけで、パフォーマンスが大幅に向上しますか?

4

2 に答える 2

1

最初に簡単な数学で理由を説明しましょう。

  • 現時点では、頂点データを GPU (各フレーム) にプッシュする必要はありませんが、12-16 はクワッドごとに行列データを浮動させ、CPU でクワッドごとに行列-行列乗算を実行します。
  • すべてを 1 つの VBO に入れる場合、クワッドごとに 4 つの頂点 (~12 個の float) を転送する必要がありますが、マトリックス データは転送せず (もちろん、グローバル VP を除く)、4 つのマトリックス - ベクトル乗算 (~1 マトリックス -行列乗算) を CPU 上で実行します。

そのため、転送される作業とデータの量はあまり変わりません。しかし、変更点は、転送されたデータが多くの小さな均一な更新から単一の大きな VBO 更新にシフトされることです。これはより高速である可能性が非常に高くなります (両方とも、バッファの更新は複数の均一な更新よりもハードウェア側から高速である可能性が高いためです)。 、しかし、それについて私を釘付けにしないでください.2番目は、ドライバーのオーバーヘッドが大幅に削減されるためです)。それに加えて、多数の小さな描画呼び出しの代わりに 1 つの大きな描画呼び出しを使用することで、オーバーヘッドがさらに削減されます。

そうです、確かに試してみる価値はありますが、特定のアプリケーションで本当に「大幅な」改善であるかどうかを評価する必要があります。

于 2013-04-17T08:37:01.013 に答える
1

必要なすべての値を VBO に格納し、各パスで glDrawElements を 1 回呼び出すだけで、パフォーマンスが大幅に向上しますか?

はい、それははるかに高速です。最初の理由は、あなたが正しく特定したように、単一のglDrawElements呼び出しになります。2 つ目は、VBO がデータを GPU 自体に保持するという事実です。

クワッドが範囲外に移動した場合、新しいクワッドにメモリを再利用できます。VBO を使用してバッファのサブ領域を描画できるため、メモリ割り当てなしで大きな柔軟性を得ることができます。

VBO を使用することで、GPU とのやり取りが最小限に抑えられるため、パフォーマンスが向上します。

于 2013-04-17T07:18:39.847 に答える