【问题标题】:How should destroyed Objects be handled?销毁的对象应该如何处理?
【发布时间】:2017-06-14 14:46:26
【问题描述】:

我正在开发一个 PIXI.js 应用程序并清理资源以防止内存泄漏,我正在使用 DisplayObject.destroy

当一个显示对象被销毁时,它的许多内部值被设置为null,而_destroyed被设置为true。

这被证明是有问题的,因为某些应用程序是基于事件的,而不是基于游戏循环的。由于缺少转换,其中一些逻辑试图改变显示对象和错误。

如果显示对象的项目(例如位置和比例)不是不受保护的吸气剂,我将能够摆脱这种情况。

get x() {
  // Unguarded will error out if this.position is null!
  return this.position.x;
}

现在我在 Typescript 环境中扩展显示对象并覆盖 x,y 等:

get x() {
  // As this.position is also a getter we have to go to transform to be safe
  return this.transform && this.position.x;
}

应该如何处理? 为什么DisplayObject._destroyed 是私有的?

【问题讨论】:

  • 通常人们希望取消订阅不再有效的事件监听器。您的事件侦听器不应引用已销毁的对象。

标签: typescript pixi.js


【解决方案1】:

Pace 关于事件监听器的评论是正确的。在我看来,这种逻辑可能已经存在内存泄漏。由于您保留对对象的引用,这些对象已被 PIXIs .destroy 方法销毁。因此,即使您从 PIXI(例如从 GPU)销毁它们,您仍然会将对象保留在 CPU / javascripts 内存中。

如果你还真想走那条路,我宁愿建议你做自己的功能,不要覆盖PIXI自己的功能。因为当 PIXI 获得关于 getter 的更新时,您可能会因为覆盖了 getter 而遇到令人讨厌的错误。所以就做这样的事情:

destroyObject(displayObject) {
    displayObject.destroy();
    displayObject.customDestroyed = true;
}

【讨论】:

  • destroy 将删除事件发射器,这里的问题不是严格意义上的事件监听器。获取存储在某处的显示对象数组。在一个事件(不是游戏循环的一部分)上迭代这些对象并将每个对象移动到左侧。无法判断此数组中的对象已被销毁。我想这样做的唯一方法是明确处理对象在销毁时可能存储的所有位置并更新它们。或者在销毁时发出的显示对象上创建一个事件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-09
  • 2012-05-02
  • 2015-02-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多