我正在尝试确定此模式是否有助于最大限度地减少我的 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 似乎执行得更加频繁,并且每次对性能的影响大致相同(并且收集的内存量与以前大致相同)。
这里是否缺少一些可能会降低性能的东西?这是否会按照预期的方式运行(分配变量一次并重新使用它们而无需垃圾收集它们?)还是还有其他情况发生?
最佳答案
我对此并不肯定,但如果您使用删除功能清除代码中的对象,可能会有所帮助。我发现这篇有趣的文章可能会对您有更多帮助: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,这样以后重新分配它时就不必进行垃圾回收
关于javascript - 自调用函数+闭包改善垃圾收集导致的挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18700116/