使用对象池更糟糕的帧率

时间:2014-04-17 12:14:04

标签: javascript performance reference garbage-collection premature-optimization

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

关于这个主题的文章:

  1. High-Performance, Garbage-Collector-Friendly Code
  2. Object Pools
  3. Static Memory Javascript with Object Pools
  4. 但是我没有得到我想要的结果。使用对象池给我的帧速率比创建和销毁对象更差。 我得到的一个好消息 - 除了学习之外 - 没有使用对象池的测试偶尔会变得无法响应和崩溃。

    为什么?

    为什么我没有得到与这些博客中的人一样的结果?



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

1 个答案:

答案 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对象);

Object Pool ~without~ Garbage