2012-04-26 92 views
0

我正在研究一個使用OpenGL ES 2.0的非常小的遊戲引擎。將VBO集成到我的網格類中,我遇到了一些設計問題。跨多個網格對象共享VBO

問題是我不想爲每個網格實例化一個新的VBO,並且我希望VBO的大小由我加載的網格數決定(不僅僅是一個2MB的固定大小或者某個東西)。

由於沒有VBO的realloc函數,我需要一次批量加載所有頂點數據。這是好的,因爲我只有4或5個小網格。所以我創建了一個MeshList類。

我調用MeshList.AddMesh(Mesh網格),它聚合網格對象的頂點/索引數據,並將頂點數據/索引數據的偏移量返回到添加的網格。這樣網格就知道它在VBO中的位置(但不知道它在哪個VBO中)。

但是,在調用MeshList.BindToVBO()之前,沒有任何MeshList數據上傳到VBO。但是現在,我的網格中沒有一個知道它們在哪個VBO中。所以我正在考慮在MeshList中創建一個指向數組的指針,它指向每個Mesh類中的整數成員變量,它們將保存VBO句柄。這樣,當調用BindToVBO()時,它遍歷指針數組並更新網格對象中的VBO句柄。

我想通過這種方式,我可以靈活地在不同的維修機構或不同的維修機構中使用不同的網格對象。我唯一擔心的是這是否是一個好設計。

對於那些對MeshList.BindToVBO()更新整個網格對象的代碼進行一番審視並不清楚。我的意思是,MeshList確實在BindToVBO()調用之前與所有Mesh對象進行交互,但沒有任何明確說明通過將Mesh對象傳遞給MeshList.AddMesh(),它本質上是訂閱它的VBOHandle成員以在某些時刻更新未來。

我試過儘可能地澄清這一點。讓我知道是否需要澄清。

+0

這種方法引發的一個後果就是將網格數據的生命週期綁定在一起。如果你想更換一個網格與另一個?您可以上傳完整的網格數據,也可以對VBO數據緩衝區進行分段。 – 2012-04-27 05:20:06

回答

0

老實說對我來說聽起來像一個可疑的回報很多麻煩。您是否有理由相信將多個網格放入同一個緩衝區將會使您的性能顯着提升?

這聽起來像是對我不成熟的優化。

當然,如果你有一個含有50,000個粒子的粒子系統,我可以看到它想要在一個共享緩衝區中,但是總的來說,我不知道在同一個緩衝區中存儲兩個任意網格是否有好處。這聽起來像是一個巨大的潛在的錯誤和頭痛。

+0

我同意肯定有一個成本/收益分析要做,以確定是否值得將網格放在一個VBO與每個繪製調用綁定VBO的努力。但是我正在設計我的程序,所以我可以決定將哪個網格放在哪個VBO中,而不是每個網格都有一個單獨的VBO,或者總是在一個VBO中包含所有網格。 – Legion 2012-04-27 14:07:54

+0

@Legion所以這裏有什麼問題呢? – Tim 2012-04-27 16:10:53

+0

基本上我想知道是否它被認爲是不好的設計有一個類A包含指向B類成員變量的指針列表。類A可以使用這些指針來更新B類成員的值。我擔心的是,它可能會導致B類國家的非明顯變化。所以ClassA.doSomething()會影響B類。 – Legion 2012-04-27 16:53:22