Phaser:删除对游戏对象的引用

问题描述

我正在努力提高游戏的性能。我最担心的事情之一是由于保留对对象的引用而导致的内存泄漏。为了删除精灵,我调用destroy() 方法,如 docs 中所述:

销毁此游戏对象,将其从显示列表和更新列表中删除,并切断与父资源的所有联系。

如果之前启用,也会从输入管理器和物理管理器中删除自身。

如果您不打算再次使用它,请使用它从您的游戏中删除游戏对象。只要您自己的代码中不存在对它的引用,浏览器就应该可以免费进行垃圾回收。

所以,当我完成我的游戏对象时,我会以这种方式销毁它,并删除对它的所有本地引用。然而,多亏了 Chrome 的内存配置文件记录工具,我发现该对象仍然存在于 updateList._active 数组中:

enter image description here

我创建了一个小的 js 片段来说明这一点:

const config = {
  type: Phaser.AUTO,width: 128,height: 192,physics: {
    default: 'arcade',arcade: {
      gravity: {
        y: 0
      },debug: false
    }
  },scene: {
    create: create
  }
}

new Phaser.Game(config)

function create() {
  let player = this.physics.add.sprite(50,50,'nothing')

  this.time.delayedCall(1000,destroy,[player],this)
  this.time.delayedCall(2000,clearReferences,[],this)
}

function destroy(player) {
  player.destroy()
  console.log('destroyed object. Elements in updateList: ' + this.make.updateList._active.length)
}

function clearReferences() {
  this.make.updateList._active.length = 0
  console.log('removed references. Elements in updateList: ' + this.make.updateList._active.length)
}
<script src="https://cdn.jsdelivr.net/npm/phaser@3.52.0/dist/phaser.min.js"></script>

在我的游戏中,当某些事件发生时,我会手动检查该数组并删除那些我不再需要的元素。这样做,我发现一些垃圾保留器消失了,所以我打算继续这种方法(即使它看起来有点臭)。

摆脱游戏对象以便垃圾收集器可以释放其资源的最佳方法是什么?我在这里遗漏了什么吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)