2011-09-14 37 views
6

我正在編寫一個算法生成幾何的WebGL應用程序。幾何圖形將由4到150個對象組成,每個對象由16到2048點之間的某個點組成,通過drawElements繪製爲TRIANGLE_STRIP。幾何將是靜態的大多數幀,但需要根據用戶輸入進行動畫。在這些框架中,幾何圖形更新時,點/ tris可能會被添加或刪除。對象還需要在程序的整個生命週期中添加/刪除。在WebGL中高效的VBO分配

在這種情況下分配/更新VBO的最有效方式是什麼?我很確定我應該使用DYNAMIC_DRAW和bufferSubData來更新每個對象,但是我想過度分配幾個大的VBO(假設每個對象的最壞情況),並將每個對象定義爲偏移量(對象編號*每個對象的最大大小),然後在最佳情況下有大量分配的未使用的VBO內存?還是有另一種方法我應該嘗試?還是這足夠小的內存足跡,我過度思考?

回答

8

在這種情況下分配/更新VBO的最有效方法是什麼?我很確定我應該使用DYNAMIC_DRAW和bufferSubData來更新每個對象。

這確實是要走的路。實際上,您希望爲對象使用雙緩衝或三重緩衝,即使用一個VBO綁定繪圖,而用另一個新數據更新另一個VBO的內容。經過glMapBuffer可以從進程中的所有線程訪問內存映射,因此您可以讓工作線程更新「後退」頂點緩衝區,而渲染線程正忙於繪製當前幀。

或者是我足以想象的足夠小的內存空間?

您是否評估過您正在處理的最差情況下的內存佔用情況?給定你的數字,我敢打賭它將低於16MiB(150個對象* 2048點*每點3個雙精度浮點數*每雙8個字節= 7.4MB,如果使用單精度浮點數,則只有3.7MiB)。比較這與幾百MiB的RAM現代顯卡產品(我的2006年GeForce 8800GTX有768MiB RAM,我的Radeon HD6570有1024MiB(= 1GiB)。