1

我想用画布在 html5 中创建一个游戏。

但我之前有一个性能问题

每次我需要一个变量时创建一个变量会更好吗

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

var还是在脚本开头只实例化一个并执行以下操作会更好:

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

谢谢你的帮助

4

3 回答 3

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 的动画队列非常慢,并且您最终会将动画堆栈到无限,从而给您带来更大的每一帧延迟。

于 2012-11-23T08:42:54.587 回答
2

这个测试(http://jsperf.com/to-scope-or-not-to-scope)表明使用本地范围是迄今为止最快的方法,但创建一个自调用函数只是为了拥有一个范围超过抵消它。

您能做的最好的事情就是使用您手头的任何范围。你能做的最坏的事情(除了with关键字的使用)性能方面是在一个紧密的循环中使用一个自调用函数(如果你想关闭迭代变量,你仍然应该这样做,即无论如何都要创建一个新函数)。其他任何事情都比仅使用本地范围慢一些。

请注意,javascript 不使用块作用域——任何variable 的作用域都限于其封闭函数。

另请注意,您应该尽量减少图形操作的数量,而不是围绕它们的代码的开销。

另请注意,您应该确保程序是可维护的,然后关心性能。

于 2012-11-23T08:57:27.747 回答
2

差异应该很小,以至于您可以忽略它。通常,您可以依靠解释器在后台为您执行任何此类微优化。你需要关注的是你的算法。

游戏开发的一条经验法则是:性能瓶颈始终是图形引擎。这就是你必须优化的地方。避免过度绘制,避免重绘,避免绘制无敌的东西,缓存,缓存,缓存。

于 2012-11-23T08:40:27.770 回答