1

キャンバスを使用してhtml5でゲームを作成したいと思います。

しかし、私は前にパフォーマンスの質問があります

必要になるたびに変数を作成する方が良いですか

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

またはvar、スクリプトの最初に1つだけインスタンス化して、次のことを行う方がよいでしょう。

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に保持されます。避けたいもう1つのことは、描画ロジックでjQueryを使用することです。これは、jQueryのアニメーションキューが非常に遅く、アニメーションが無限にスタックすることになり、フレームごとに大きな遅延が発生するためです。

于 2012-11-23T08:42:54.587 に答える
2

違いは無視できるほど小さいはずです。通常、バックグラウンドでそのようなマイクロ最適化を実行するためにインタプリタに頼ることができます。あなたが焦点を合わせる必要があるのはあなたのアルゴリズムです。

ゲーム開発の経験則は次のとおりです。パフォーマンスのボトルネックは常にグラフィックエンジンです。ここで最適化する必要があります。過剰描画を避け、再描画を避け、無敵のもの、キャッシュ、キャッシュ、キャッシュを描画しないようにします。

于 2012-11-23T08:40:27.770 に答える
2

このテスト(http://jsperf.com/to-scope-or-not-to-scope )は、ローカルスコープを使用するのがはるかに高速な方法であることを示していますが、スコープを持つためだけに自己呼び出し関数を作成しますそれを相殺する以上のもの。

最善の方法は、手元にあるスコープを使用することです。パフォーマンスに関して(キーワードの使用を除いて)実行できる最悪の事態はwith、タイトループ内で自己呼び出し関数を使用することです(反復変数を閉じたい場合、つまりとにかく新しい関数を作成したい場合は、それでも実行する必要があります) )。それ以外のものは、ローカルスコープを使用するよりもわずかに遅くなります。

javascriptはブロックスコープを使用しないvarことに注意してください-iableはその囲み関数にスコープされます。

また、グラフィックス操作の量を最小限に抑える必要があることにも注意してください。グラフィックス操作の周囲のコードによるオーバーヘッドではありません。

また、プログラムが保守可能であることを確認してから、パフォーマンスに注意する必要があることにも注意してください。

于 2012-11-23T08:57:27.747 に答える