我正在开发一款游戏。我现在已经阅读了一些文章,建议我应该重新使用对象而不是创建新对象来减少垃圾收集扫入并删除对象时的帧丢失。
关于这个主题的文章:
但是我没有得到我想要的结果。使用对象池给我的帧速率比创建和销毁对象更差。 我得到的一个好消息 - 除了学习之外 - 没有使用对象池的测试偶尔会变得无法响应和崩溃。
为什么?
为什么我没有得到与这些博客中的人一样的结果?
测试1 - *使用数组来保存对象。通过在两个数组之间移动它们来保持参考。
测试2 - 使用数组来保存对象。不保留参考资料。
偶尔会破坏浏览器:
测试3
测试4
偶尔会破坏浏览器:
如果您认为可以改进,请编辑。
答案 0 :(得分:1)
哦,小男孩!我做的。现在我可以回答我自己的问题了!
我读过这篇文章: How to write low garbage real-time Javascript
最后说点击。
我以前的所有代码示例都使用Array.prototype.pop()
和Array.prototype.slice()
这两个都返回对象。所以我还在创造很多垃圾。
相反,我意识到我可以只使用一个数组并移动对象 - 永远不必删除任何东西。
我使用属性.activeLength
扩展了数组对象,我是一个快乐的露营者。
删除对象:
function removeObject (object, pool) {
var tempObj;
for (var i = 0; i < pool.length; i++) {
if ( pool[i] === object ) {
pool.activeLength --;
canvas.scene.remove( pool[i] );
tempObj = pool[i];
pool[pool[i]] = pool[pool.length - 1];
return;
}
}
}
我只是在移动物体。所以我不是在这里创造任何垃圾。 (Three.js可能因为我正在用Three.js库创建3D对象);