1

このパターンが 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 がはるかに頻繁に実行され、毎回パフォーマンスにほぼ同じ影響を与えているようです (そして、以前とほぼ同じ量のメモリを収集しています)。

パフォーマンスを低下させる可能性のある、ここで見逃しているものはありますか? これは期待どおりに動作しますか (変数を一度割り当てて、ガベージ コレクションを行わずにそれらを再利用しますか?) それとも何か他のことが起こっていますか?

4

1 に答える 1

1

私はこれについて肯定的ではありませんが、ワイプ機能を使用してコード内のオブジェクトをクリアすると役立つ場合があります。もっと役立つかもしれない興味深い記事を見つけました: https://www.scirra.com/blog/76/how-to-write-low-garbage-real-time-javascript

特に、私はこれを見ます:

You can actually re-cycle an existing object (providing it has no prototype chain) by
deleting all of its properties, restoring it to an empty object like {}. For this you
can use the cr.wipe(obj) function, defined as:

    // remove all own properties on obj,
    effectively reverting it to a new object
    cr.wipe = function (obj)
    {
    for (var p in obj)
    {
        if (obj.hasOwnProperty(p))
            delete obj[p];
        }
    };

それまたはそれらを何も設定しないでください。たとえば、配列が使用されている場合は、その長さを 0 に設定します。そうすれば、後で再割り当てするときにガベージ コレクションを行う必要がなくなります。

于 2013-09-09T14:16:34.430 に答える