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 回答