2012-11-17 59 views
0

我正在用「gameQuery」jQuery插件寫一個js遊戲,一款射擊遊戲。Javascript(gameQuery遊戲)objs太多無法正常運行

雖然有許多子彈(例如100或更多),但動畫會變得非常緩慢。

我使用循環移動DOM代碼打擊,意味着執行功能每20毫秒。所有子彈儲存在一個陣列中,

$.playground().registerCallback(function(){ 
    for(var i = 0; i < bulletList.length; i++) { 
    //move bullet 
    ... 
    } 
}, 20); 

我該如何優化我的代碼以提高效率?謝謝!

+0

您可以使用CSS3爲項目符號設置動畫,如果您還沒有。 CSS3動畫利用GPU。此外,計算一次,而不是每次迭代。 'for(var i = 0,len = bulletList.length; i

+0

'var len = bulletList.length; while(len - ){// move bullet}'但是tbh我認爲你對微觀優化過於關注。 – Loktar

回答

1

這裏有幾件事情我能想到的:

  1. 你在做碰撞檢測與子彈。如果是這是 可能是因爲顯示數百個精靈的數字 本身應該是一個問題。
  2. 是那些子彈動畫(與多個幀?)如果是的話,你可能會嘗試不動畫,看看如何影響 表演。
  3. 如果所有項目符號以相同的速度向相同的方向移動,您可以將它們全部放入一個組中,然後移動該組。
  4. 如果他們不在同一個方向上移動,你仍然可以將它們放到一個組中。然後您將在移動它們之前分離這個組。 一旦你完成了,你可以將你的羣組再次添加到遊戲中。
  5. 這是一個更復雜的實現,但你可以嘗試 檢測玩家每隔一定間隔 在給定方向發射了一系列的子彈,並用一個單一的 精靈有子彈的重複圖像代表他們。
+0

Thx! @Selim。所有的子彈都是敵人的子彈,我沒有做任何碰撞檢測。 2.雖然所有子彈都放在一個組中,但每顆子彈都有自己的方向。所以我必須每次都用「for」或「while」聲明來移動,我認爲這是事情放慢的一點。 我仍然想不出一個解決方案。 – janekey

+1

你嘗試過嗎?假設你所有的子彈都進入了一個名爲「子彈」的小組。您可以使用以下命令將組分離:bullets = $(「#bullets」)。detach(); 然後,您將像以前一樣更改所有項目符號的位置。 最後,您將通過bullets.appendTo(parentGroup)將子彈組返回到文檔。 告訴我,如果有幫助。 –

+0

我用過你的方法,使用detach()效果不明顯。而且,detach()util後我無法刪除外部子彈,我再次追加它。 :)我想出了一個更好的方法:window.setTimeout(function(){bulletMove(bullet)},50);在遞歸中使用setTimeout,結果非常好,我放棄了「while」語句,因爲這裏的效率很低。現在,即使屏幕上有300或400個子彈,事情也不會減慢。謝謝你的幫助!哈哈〜 – janekey