2012-04-26 14 views
0

私はOpenGL ES 2.0を使用する非常に小さなゲームエンジンで作業しています。私は、VBOをメッシュクラスに統合するという設計上の問題が少しあります。複数のメッシュオブジェクト間でVBOを共有する

問題は、各メッシュに新しいVBOをインスタンス化したくないということです.VBOサイズを2MBなどの固定サイズだけでなく、ロードするメッシュ数によって決定したいのです)。

VBOのためのrealloc機能がないので、すべての頂点データを一度にバッチロードする必要があります。私は4つか5つの小さなメッシュしか持っていないのでこれは大丈夫です。そこで私はMeshListクラスを作成しました。

私はMeshList.AddMesh(メッシュメッシュ)を呼び出し、メッシュオブジェクトの頂点/インデックスデータを集計し、そのオフセットを追加さ​​れたメッシュに戻って頂点データ/インデックスデータの配列に返します。このようにして、メッシュはVBO内のどこにあるかを知ることができます(VBOはどこに入っているのかわかりません)。

しかし、MeshList.BindToVBO()を呼び出すまで、MeshListデータはVBOにアップロードされません。しかし今、私のメッシュの中にはどのVBOが入っているのか分からないので、VBOハンドルを保持する各Meshクラスの整数メンバ変数を指すポインタの配列をMeshListに作成することを考えていました。このようにして、BindToVBO()が呼び出されると、ポインタ配列を反復処理して、メッシュオブジェクト内のVBOハンドルを更新します。

私はこのようにして、異なるVBOで異なるメッシュオブジェクトを持つか、すべて1つのVBOで柔軟にすることができました。私が持っている唯一の懸念は、これが良いデザインであるかどうかである。

MeshList.BindToVBO()がメッシュオブジェクトの全体を更新しているというコードを見ている人には、明らかではありません。つまり、MeshListはBindToVBO()呼び出しの前にすべてのMeshオブジェクトとやりとりしますが、MeshオブジェクトをMeshList.AddMesh()に渡すことで、VBOHandleメンバーを基本的に購読して、未来。

私はこれをできる限り明確にしようとしました。何か明確化が必要な場合は教えてください。

+0

このアプローチでは、メッシュデータの存続期間をバインドすることが1つの結果として生じます。あるメッシュを別のメッシュに置き換える場合はどうなりますか?変更に合わせてメッシュデータ全体をアップロードするか、VBOデータバッファを分割します。 –

答えて

0

私には正直なところ、疑わしい報酬のために多くの問題があるように思えます。同じバッファに複数のメッシュを配置すると、パフォーマンスが顕著になると考えられる理由はありますか?

私は早すぎる最適化のようです。

もしパーティクルシステムが50,000個のパーティクルを持っていたら、それを共有バッファに入れたいと思うかもしれませんが、一般的に2つのメッシュを同じバッファに格納する利点があるかどうかはわかりません。バグや頭痛の巨大な可能性のように聞こえるだけです。

+0

メッシュを1つのVBOにバインドすることと、各ドローコールのVBOをバインドすることの価値があるかどうかを判断するために、コスト/メリットの分析が確実に行われることは間違いありません。しかし私は自分のプログラムを設計しようとしているので、メッシュごとに別々のVBOを使うのではなく、どちらのVBOにどのメッシュが入るかを決めることができます。 – Legion

+0

@Legionここでは正確に何が質問ですか? – Tim

+0

基本的には、クラスBのメンバー変数へのポインタのリストを含むクラスAを持つことが悪い設計であると考えられているのでしょうか?クラスAはこれらのポインタを使用してクラスBのメンバーの値を更新できます。私の懸念は、クラスBの状態の明白でない変化につながる可能性があるということです。 ClassA.doSomething()はクラスBに影響します。 – Legion

関連する問題