0

私はゲームに取り組んでいます。そして、ガベージ コレクションがオブジェクトをスイープして削除するときのフレーム ドロップを減らすために、新しいオブジェクトを作成するのではなく、オブジェクトを再利用する必要があることを示唆する記事をいくつか読みました。

この件について読んだ記事:

  1. 高性能でガベージ コレクターに適したコード
  2. オブジェクト プール
  3. オブジェクト プールを使用した静的メモリ Javascript

しかし、私は望む結果を得ていません。オブジェクト プールを使用すると、オブジェクトを作成して破棄するよりもフレームレートが低下します。ここから得た 1 つの良いニュース (学習以外) は、オブジェクト プールを使用しないテストが応答しなくなり、クラッシュすることがあるということでした。

何故ですか?

そして、それらのブログの人々と同じような結果が得られないのはなぜですか?



これを改善できると思われる場合は、編集してください。

4

1 に答える 1

1

ああ少年!やったよ。今、私は自分の質問に答えることができます!

この記事を読みました: 低ガベージ リアルタイム Javascript の書き方

そして最後にクリックと言った。私の以前のコード例はすべて使用してArray.prototype.pop()おりArray.prototype.slice() 、これらの戻りオブジェクトは両方ともです。だから私はまだたくさんのゴミを作っていました。

代わりに、1 つの配列を使用してオブジェクトを移動するだけでよいことに気付きました。何も削除する必要はありません。

プロパティを使用して配列オブジェクトを拡張しました:.activeLengthそして、私は幸せなキャンピングカーでした.

オブジェクトの「削除」:

function removeObject (object, pool) {
  var tempObj;
  for (var i = 0; i < pool.length; i++) {
    if ( pool[i] === object ) {
      pool.activeLength --;
      canvas.scene.remove( pool[i] );
      tempObj = pool[i]; 
      pool[pool[i]] = pool[pool.length - 1];
      return;
    }
  }
}

オブジェクトを動かしているだけです。したがって、ここではゴミを作成していません。(ただし、Three.js ライブラリを使用して 3D オブジェクトを作成しているため、Three.js の可能性があります);

オブジェクト プール ~なし~ ガベージ

于 2014-04-17T22:26:48.840 に答える