自我调用函数+闭包,以改善垃圾收集造成的挂起

时间:2013-09-09 14:05:58

标签: javascript memory-management garbage-collection closures self-invoking-function

我正在尝试确定这种模式是否有助于减少我的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正在更频繁地完成,并且每次都对性能产生相同的影响(并且收集的内存量与以前相同)。

我在这里遗失的东西可能会影响性能吗?这会表现得如何预期(分配变量一次并重新使用它们而不用垃圾收集它们吗?)还是还有其他事情发生?

1 个答案:

答案 0 :(得分: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,那么稍后在重新分配时不必进行垃圾回收