このパターンが Javascript ゲームでのガベージ コレクションを最小限に抑えるのに役立つかどうかを判断しようとしています。
次のように定義されたメイン ゲーム ループで呼び出す関数があります。
my.object.prototype.method = function(some_object) {
var a,b,c,d,e,f,j,k;
// initialize variables
// do stuff to some_object based on variables...
return some_object;
}
変数は、コード内の別の場所にあるオブジェクト (または数値) への参照になります。
フレームレートのスタッターを引き起こしているため、ガベージコレクションイベントの頻度と重大度を下げようとしています。
変数をクロージャーに格納する自己呼び出し関数にリファクタリングすると、関数呼び出しごとに変数が再割り当てされるのではなく、再利用されますか? GCに顕著な影響がありますか?
my.object.prototype.method = (function() {
var a,b,c,d,e,f,j,k;
return function(some_object) {
// initialize variables
// do stuff to some_object based on variables...
// set variables to undefined
return some_object;
}
})();
これらはメソッドで割り当てられるオブジェクトではないことに注意してください。他のオブジェクトまたはプリミティブへの参照のみ。
私はそれを試してみましたが、どちらかといえば事態を悪化させたようです。GC がはるかに頻繁に実行され、毎回パフォーマンスにほぼ同じ影響を与えているようです (そして、以前とほぼ同じ量のメモリを収集しています)。
パフォーマンスを低下させる可能性のある、ここで見逃しているものはありますか? これは期待どおりに動作しますか (変数を一度割り当てて、ガベージ コレクションを行わずにそれらを再利用しますか?) それとも何か他のことが起こっていますか?