2014-10-12 37 views
0

我最近開始嘗試使用webgl。處理越來越多的對象的最佳方法

我見過很多演示,創建數以萬計的對象,他們流利地工作(60fps)。

我需要創建一個場景,我從一開始就沒有對象,隨着時間的推移,這個數字會上升到幾千個對象。如何處理這樣的情況呢?

我曾經想過在開始時將對象創建爲一個巨大的對象,並且只需修改它們的頂點以將它們放置到相機視野中,以便它們需要「天生」時;但是這種解決方法似乎有太多工作要做。

下面是一個例子: http://codepen.io/anon/pen/fmsqB?editors=001

試圖使代碼儘可能明確,但檢查出這部分

function populate(){ 
    if (count < maxcount){ 
    sph = sphere.clone(); 
    scene.add(sph); 
    sphere.position.x = Rand(-10,10); 
    sphere.position.y = Rand(-10,10); 
    sphere.position.z = Rand(-10,10); 
    count +=1; 
    console.log(count); 
    }; 
}; 

你可以看到,即使有幾千最低的細分領域, FPS下降的速度非常快(對於我現在使用的機器,它可以降低至20 fps,5-6k球體)

歡迎提出建議。

回答

0

那麼,你正在創建單Three.Meshes。 您正在尋找的是一種回撥繪圖調用和/或使用更好的內部結構(即Buffergeometry)的方法。請參閱Three.js附帶的示例。

您也可以在創建球體後嘗試合併球體。看到這裏

http://learningthreejs.com/blog/2011/10/05/performance-merging-geometry/

+0

我似乎無法找到buffergeometry清楚地解釋發生了什麼事情的任何適當的例子。大多數緩衝幾何示例只是隨機發送三角形。如果我們想複製一個立方體或球體呢? – Mia 2014-10-13 16:47:17

+0

此外,同樣適用於合併幾何體。如果我爲在for循環中創建的每個項目合併幾何體和「創建的其餘部分」,則在填充所有內容之前需要半分鐘。有沒有其他解決方法? – Mia 2014-10-13 16:48:25

+0

以及我不知道你的用例。關於BufferGeometry:它只是一些存儲信息的數組。深入挖掘以獲得不錯的表現,但這是一個陡峭的學習曲線。該示例顯示如何設置數組以從中繪製數組。你必須閱讀代碼和WebGL緩衝區瞭解 http://learningwebgl.com/blog/?p=370 至於合併:也許不合並每個幾何創建,也許每50個網格?你需要在那裏找到一個甜蜜的地方,這也取決於你的用例和你想做的事情。 – GuyGood 2014-10-13 20:27:47