2011-09-14 13 views
6

私はアルゴリズム的にジオメトリを生成するWebGLアプリケーションを作成しています。ジオメトリは、それぞれが16〜2048ポイントの間にある4-150個のオブジェクトで構成され、drawElementsを通じてTRIANGLE_STRIPとして描画されます。ジオメトリはほとんどのフレームで静的ですが、ユーザーの入力に応じてアニメートする必要があります。ジオメトリが更新されるこれらのフレームでは、ポイント/トリスが追加または削除されることがあります。オブジェクトはまた、プログラムの存続期間にわたって追加/削除する必要があります。WebGLでの効率的なVBO割り当て

このコンテキストでVBOを割り当てる/更新する最も効率的な方法は何ですか?私はDYNAMIC_DRAWとbufferSubDataを使って各オブジェクトを更新する必要があると確信していますが、いくつかの巨大なVBO(オブジェクトごとの点で最悪の場合)を過剰に割り当てて、各オブジェクトをオフセット(オブジェクト番号*オブジェクトあたりの最大サイズ)し、ベストケースで多くの割り当てられた使用されていないVBOメモリを持っていますか?それとも、私が試してみるべき別のアプローチがありますか?それとも、これは私が過度に考えているメモリフットプリントの面で十分に小さいのですか?

答えて

8

このコンテキストでVBOを割り当てる/更新する最も効率的な方法は何ですか? DYNAMIC_DRAWとbufferSubDataを使って各オブジェクトを更新する必要があると私は確信しています。

これは確かに行く方法です。実際には、新しいデータでもう一方の内容を更新しながら、オブジェクトに対してダブルバッファリングまたはトリプルバッファリングを使用したい、つまり1つのVBOを描画にバインドする必要があります。 の後glMapBufferメモリマップはプロセス内のすべてのスレッドからアクセスできるため、レンダリングスレッドが現在のフレームを描画している間にワーカースレッドが「バック」頂点バッファを更新することができます。

これは私が過度に考えているメモリフットプリントの点で十分ですか?

対処しているワーストケースのメモリフットプリントを評価しましたか?あなたの数値を考えれば、16MiB以下になります(150オブジェクト* 2048ポイント*ポイントあたり3倍精度浮動小数点* 8倍精度浮動小数点= 7.4Mバイト、単精度浮動小数点使用時は3.7MiBのみ)。これを私の2006年のGeForce 8800GTXには768MiBのRAMがあり、私のRadeon HD6570には1024MiB(= 1GiB)のRAMを搭載した数百のMiBのRAMと比較してください。

関連する問題