シミュレートされた世界でオブジェクトを作成および破壊する典型的なゲームを想像してみてください。これらのオブジェクトが作成されると、それらの頂点データが 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