2012-11-23 91 views
1

我想用canvas在html5中創建一個遊戲。javascript中的腳本性能

但是我有一個性能問題之前

是更好地每次我需要一個

var game = ... 
var car = ... 
var monster = ... 

還是更只有一個var在腳本的開始實例,並創建一個變量這樣做:

var game = {} 
game.car = ... 
game.monster = {} 
game.monster.attack = function(){...} 

感謝您的幫助

+2

只要您保護全球範圍內的變量,這並不重要。我不會爲此擔心,這是微不足道的微觀優化。 – elclanrs

+2

1)http://jsperf.com 2)爲正確性優化,然後爲速度 –

+2

如果有差異,你可能不會注意到它。 –

回答

3

正如在評論中看到的,你不會真的需要對這個問題有太多的想法。執行javascript遊戲編程最大的問題是你將擁有不同的計算機,它們將具有不同的硬件。因此,如果你不插入你的引擎,幀率對於它們都是不同的。一個例子是

// Updated drawing code for our objects 
Rect.prototype.draw = function(context, interpolation) { 
    context.fillRect(this.x, this.y + this.velocity * interpolation, 30, 30); 
}; 

Game.draw = function(interpolation) { 
    this.context.clearRect(0, 0, 640, 480); 

    for (var i=0; i < this.entities.length; i++) { 
    this.entities[i].draw(this.context, interpolation); 
    } 
}; 

Game.run = (function() { 
    var loops = 0, skipTicks = 1000/Game.fps, 
     maxFrameSkip = 10, 
     nextGameTick = (new Date).getTime(), 
     lastGameTick; 

    return function() { 
    loops = 0; 

    while ((new Date).getTime() > nextGameTick) { 
     Game.update(); 
     nextGameTick += skipTicks; 
     loops++; 
    } 

    if (!loops) { 
     Game.draw((nextGameTick - (new Date).getTime())/skipTicks); 
    } else { 
     Game.draw(0); 
    } 
    }; 
})(); 

這將保持你的Game.fps的遊戲邏輯。你可能想要避免的另一件事是在繪圖邏輯中使用jQuery。這是因爲jQuery的動畫隊列非常緩慢,並且最終將動畫堆棧放到無限的位置,給每個幀帶來更大的延遲。

2

差異應該很小,以至於你可以忽略它。通常,您可以依靠解釋器在後臺爲您執行任何此類微觀優化。你需要關注的是你的算法。

遊戲開發經驗法則是:性能瓶頸始終是圖形引擎。這就是你必須優化的地方。避免過度繪製,避免重新繪製,避免繪製無敵的東西,緩存,緩存,緩存。

2

這個測試(http://jsperf.com/to-scope-or-not-to-scope)顯示,使用本地範圍是迄今爲止走的最快方法,但創建一個自調用函數只是一個範圍遠遠抵消它更多。

你可以做的最好的就是使用你手邊的任何範圍。你可以做的最糟糕的事情(除了使用關鍵字with)在性能方面是在緊密循環中使用一個自調用函數(如果你想關閉迭代變量,你應該這樣做,即創建一個新函數無論如何)。其他任何事情都比僅使用本地範圍慢得多。

請注意,JavaScript不會而不是使用塊範圍 - 任何var可用範圍爲其封閉函數。

另請注意,您應該儘量減少圖形操作的數量,而不是圍繞它們的代碼開銷。

另外請注意,您應該確保程序可以維護,然後關心性能。