我想用画布在 html5 中创建一个游戏。
但我之前有一个性能问题
每次我需要一个变量时创建一个变量会更好吗
var game = ...
var car = ...
var monster = ...
var
还是在脚本开头只实例化一个并执行以下操作会更好:
var game = {}
game.car = ...
game.monster = {}
game.monster.attack = function(){...}
谢谢你的帮助
我想用画布在 html5 中创建一个游戏。
但我之前有一个性能问题
每次我需要一个变量时创建一个变量会更好吗
var game = ...
var car = ...
var monster = ...
var
还是在脚本开头只实例化一个并执行以下操作会更好:
var game = {}
game.car = ...
game.monster = {}
game.monster.attack = function(){...}
谢谢你的帮助
正如评论中所见,你真的不需要太多地怀疑这一点。进行 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 的动画队列非常慢,并且您最终会将动画堆栈到无限,从而给您带来更大的每一帧延迟。
这个测试(http://jsperf.com/to-scope-or-not-to-scope)表明使用本地范围是迄今为止最快的方法,但创建一个自调用函数只是为了拥有一个范围超过抵消它。
您能做的最好的事情就是使用您手头的任何范围。你能做的最坏的事情(除了with
关键字的使用)性能方面是在一个紧密的循环中使用一个自调用函数(如果你想关闭迭代变量,你仍然应该这样做,即无论如何都要创建一个新函数)。其他任何事情都比仅使用本地范围慢一些。
请注意,javascript 不使用块作用域——任何var
iable 的作用域都限于其封闭函数。
另请注意,您应该尽量减少图形操作的数量,而不是围绕它们的代码的开销。
另请注意,您应该确保程序是可维护的,然后关心性能。
差异应该很小,以至于您可以忽略它。通常,您可以依靠解释器在后台为您执行任何此类微优化。你需要关注的是你的算法。
游戏开发的一条经验法则是:性能瓶颈始终是图形引擎。这就是你必须优化的地方。避免过度绘制,避免重绘,避免绘制无敌的东西,缓存,缓存,缓存。