【问题标题】:Worse framerate with Object Pool对象池的帧率更差
【发布时间】:2014-04-17 12:14:03
【问题描述】:

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

阅读有关该主题的文章:

  1. High-Performance, Garbage-Collector-Friendly Code
  2. Object Pools
  3. Static Memory Javascript with Object Pools

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

为什么会这样?

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



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

【问题讨论】:

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


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2016-01-29
      • 2019-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      相关资源
      最近更新 更多