0

我正在开发一款游戏。而且我现在已经阅读了几篇文章,建议我应该重用对象而不是创建新对象以减少垃圾收集扫入并删除对象时的丢帧。

有关该主题的文章阅读:

  1. 高性能、垃圾收集器友好的代码
  2. 对象池
  3. 带有对象池的静态内存 Javascript

但是我没有得到我想要的结果。使用对象池比创建和销毁对象的帧速率更差。除了学习之外,我从中得到的一个好消息是,不使用对象池的测试偶尔会变得无响应并崩溃。

这是为什么?

为什么我没有得到与那些博客中的人相似的结果?



如果您认为这可以改进,请编辑。

4

1 回答 1

1

好家伙!我做的。现在我可以回答我自己的问题了!

我读了这篇文章: 如何编写低垃圾实时 Javascript

它最后说点击。我之前的所有代码示例都使用Array.prototype.pop()and Array.prototype.slice() Both 返回对象。所以我仍然在制造很多垃圾。

相反,我意识到我可以只使用一个数组并移动对象——永远不必删除任何东西。

我用一个属性扩展了数组对象:.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 对象);

对象池 ~without~ 垃圾

于 2014-04-17T22:26:48.840 回答