Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript中的脚本性能_Javascript_Performance - Fatal编程技术网

javascript中的脚本性能

javascript中的脚本性能,javascript,performance,Javascript,Performance,我想用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的动画队列非常慢,最终动画堆叠到无限大,每一帧都会有较大的延迟。

如评论中所示,您不必对此感到太多疑惑。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的动画队列非常慢,最终动画堆栈会无限大,每帧都会有更大的延迟。

此测试表明,使用局部作用域是目前最快的方法,但创建一个自调用函数只是为了使作用域超过它的偏移量

你能做的最好的就是使用你手头的任何范围。除了使用with关键字performance wise之外,最糟糕的情况是在紧循环中使用自调用函数。如果您希望关闭迭代变量,即无论如何创建一个新函数,则仍然应该这样做。其他任何操作都比仅使用局部作用域慢得多

请注意,javascript不使用块作用域-任何变量的作用域都是其封闭函数

还要注意的是,您应该尽量减少图形操作的数量,而不是它们周围代码的开销

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

此测试表明,使用本地作用域是目前为止最快的方法,但是创建一个自调用函数只是为了拥有一个超出它的作用域

你能做的最好的就是使用你手头的任何范围。除了使用with关键字performance wise之外,最糟糕的情况是在紧循环中使用自调用函数。如果您希望关闭迭代变量,即无论如何创建一个新函数,则仍然应该这样做。其他任何操作都比仅使用局部作用域慢得多

请注意,javascript不使用块作用域-任何变量的作用域都是其封闭函数

还要注意的是,您应该尽量减少图形操作的数量,而不是它们周围代码的开销


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

只要您保护变量不受全局范围的影响,这并不重要。我不担心这一点,这是微不足道的微观优化。1 2优化正确性,然后优化速度如果有差异,你可能不会注意到。在我看来,你最好使用Base.js和Event.js等库以及其他闭包库。它将允许您在js代码中实现MVP/MVVM模式,因此它将更加灵活和可读。它看起来也类似于基于类的继承。原型继承在理解时非常强大。我不理解试图将经典固有性强加于JavaScript的运动。我们有大量的语言,有些是优秀的,用于古典的固有性。原型模型ha
它有自己的优势,这是JavaScript优势的一部分。原型继承并不是它的一个坏部分。只要你保护变量不受全局作用域的影响,它就无关紧要了。我不担心这一点,这是微不足道的微观优化。1 2优化正确性,然后优化速度如果有差异,你可能不会注意到。在我看来,你最好使用Base.js和Event.js等库以及其他闭包库。它将允许您在js代码中实现MVP/MVVM模式,因此它将更加灵活和可读。它看起来也类似于基于类的继承。原型继承在理解时非常强大。我不理解试图将经典固有性强加于JavaScript的运动。我们有大量的语言,有些是优秀的,用于古典的固有性。原型模型有自己的优势,这是JavaScript优势的一部分。原型继承并不是它的一个坏部分。