2

シミュレートされた世界でオブジェクトを作成および破壊する典型的なゲームを想像してみてください。これらのオブジェクトが作成されると、それらの頂点データが VBO に格納されます。この VBO は、フレームごとに 1 回レンダリングされます。

死んだオブジェクトを処理するためのベスト プラクティスはありますか? つまり、オブジェクトが破棄されてレンダリングする必要がなくなった場合、対応する VBO データはどうなりますか?

他のオブジェクトが将来使用できるように、そのメモリを「解放」したいようです。そうしないと、最終的に VBO がほとんど完全に無効なデータでいっぱいになってしまいます。

これを実装するための 1 つのアイデアがあります。個々のバイトが空きまたは使用中としてマークされる VBO メモリのマップです。(このマップは、GPU ではなく、通常の配列として CPU に存在します。) オブジェクトが作成されると、そのデータは、マップによって決定された空き領域にバッファリングされます。その地域を地図上で使用済みとしてマークします。次に、オブジェクトが破棄されたときに、その同じ領域を空きとしてマークします。怠惰な場合はブール値の配列としてマップを保存するか、正しく行いたい場合は VBO バイトごとに 1 つのマップ ビットとしてパックすることを考えています。

これまでのところ、これが最善のアプローチのように聞こえますか? 私が見ていないより一般的なアプローチはありますか?

これらの質問の多くは、レンダリングしているシーンの特性に依存していることを知っているので、ここにコンテキストを示します。私のシーンは数百のオブジェクトで構成されています。各オブジェクトには約 8 つの頂点があります。各頂点には、float として格納された位置とテクスチャ座標があります。したがって、おおよそ次のようになります。

4 bytes per float * 6 floats per vert * 8 verts per object * 500 objects
= 96,000 bytes of vertex data
4

1 に答える 1

3

プールアロケータの使用を考えているようです。それらに関しては多くの既存の作業が行われており、VBO 内の割り当てにも非常によく適用されるはずです。

すべての要素が同じサイズであれば、それは非常に簡単です。それ以外の場合は、断片化について心配する必要がありますが、ヒープ マネージャーはよく知られています。

私が提供する最も簡単な改善は、常に最初からではなく、最後に満たされたスロットから空きスロットのスキャンを開始することです.

スタイルのデータ構造を使用して空き場所のリストを格納することにより、スペースと速度を交換できdequeます。これにより、空き場所をスキャンする必要がなくなります。

VBO に保存されているデータのサイズは、マネージャーにはまったく影響しません。個別に再利用できるスロットの数のみ。

于 2012-11-12T18:51:41.233 に答える