2012-12-16 27 views
2

好吧,看了這個問題三次後,發現沒有什麼真正與我的問題相關,我現在要問。 簡單的落沙玩具滯後


我很好奇,決定嘗試看看我能否在帆布上製作一款非常基本的落砂玩具。

我成功地做到了,因爲「沙子」會像地面一樣堆積在地面上,但由於空氣中的顆粒和地面顆粒之間的碰撞檢測,它會非常迅速地減速。

See for yourself編輯:可能是死鏈接,here's a JsFiddle instead

通過單擊並按住鼠標按鈕來生成粒子。當你產生了大約200個粒子後,它就會癱倒在地。

for(i in P){ 
    if(P[i].Y<canvas.height-1){ 
     P[i].Y++ 
     for(j in G){//This loop seems to cause the lag 
      if(P[i].X==G[j].X&&P[i].Y==G[j].Y-1){ 
       G[G.length]={X:P[i].X,Y:P[i].Y} 
      } 
     } 
    }else{ 
     G[G.length]={X:P[i].X,Y:P[i].Y} 
    } 
} 

我只是想知道是否有什麼我在做可怕的錯誤;我很確定它不應該滯後那麼糟糕。我也想知道是否有一種方法可以在沒有嵌套循環的情況下做到這一點,但是似乎我能夠完成這項工作的唯一方法是通過檢查每個單個空氣中的顆粒與每個單獨的地面顆粒,從而使其滯後。

如果鏈接被破壞,說出這個詞,我會在這裏發佈整個代碼。

感謝

+0

鏈接轉到的代碼已更改。 –

+0

哦,我應該更新那個不太可能腐爛的鏈接。我會快點做一個jsfiddle。 –

回答

2

更容易記住的沙子每根樁的高度(例如爲每列或帆布x座標),並覈對。你可以直接使用索引(應該與x座標相同),所以你不需要遍歷所有的地面位置來找到正確的。

您只需要爲每個空降砂塊檢查一次,即檢查相應立柱的樁的高度。

此外,當沙子撞到一堆時,將它從「活動粒子」列表中刪除,因此您無需每次都檢查一次,並儘可能保持外部的圈數儘可能小/短。

使用樁的高度(當沙粒有不同的顏色......不好用)或將在一個單獨的存儲結構並沒有塌下來了正確重繪堆沙重繪每根樁。

+0

聽起來很不錯,像Raycasting vs Raytracing。我會在有空的時候稍後測試它,如果它有效,我會給你最好的答案。謝謝:) –

+0

只是想到了一些想法,可能有更多的優化左邊的可能性:) :) – Veger

+0

測試它,性能大幅提高。 [見這裏](http://cocialocialist.com/#/?s=b4)。謝謝。我爲你的答案+1了,並將其標記 –