【发布时间】:2022-01-26 14:26:37
【问题描述】:
根据doc、destroy() 方法
销毁此游戏对象,将其从显示列表中移除并更新 列出并切断与父资源的所有联系。
也会从输入管理器和物理管理器中移除自身,如果 之前启用。
如果您从未计划过,请使用它从游戏中移除游戏对象 再次使用它。只要在您自己的内部不存在对它的引用 它应该可以免费用于浏览器的垃圾收集。
如果你只是想暂时禁用一个对象,那么看看使用 游戏对象池而不是销毁它,作为被销毁的对象 无法复活。
我写这段代码是为了检查一个对象是否真的被释放了
class BootScene extends Phaser.Scene {
constructor() {
super({ key: 'BootScene' });
}
create() {
this.bullet = this.add.circle(50, 50, 10, 0xff0000);
this.physics.add.existing(this.bullet);
this.bullet.body.setVelocity(150, 0);
this.slow_delta = 0;
this.bullet.body.setCollideWorldBounds(true);
this.bullet.body.onWorldBounds = true;
this.bullet.key = 'enemy'
this.bullet.body.world.on('worldbounds', () => {
console.log('destroy')
this.bullet.destroy();
})
}
update(time, delta) {
// examine the t value every 100 ms
this.slow_delta += delta;
if (this.slow_delta > 1000 && time < 100000) {
this.slow_delta = 0;
console.log(time, this.bullet.x);
}
}
}
var config = {
width: 800,
height: 500,
physics: {
default: 'arcade',
arcade: {
gravity: { y: 0 },
}
},
scene: [BootScene]
}
var game = new Phaser.Game(config);
<script src="https://cdn.jsdelivr.net/npm/phaser@3.55.2/dist/phaser.js"></script>
在bullet离开世界后发现,它的位置停留在790。
但是,update() 仍然可以获取其位置,而不是 undefined,这似乎意味着该对象实际上并未被释放。
有没有办法检查一个对象是否真的被释放了?
在@winner_joiner的提醒下,我也试过这段代码
const cleanup = new FinalizationRegistry(key => {
});
this.bullet.body.world.on('worldbounds', () => {
console.log('destroy')
this.bullet.destroy();
cleanup.register(this.bullet, 'werwer');
})
bullet 仍然留在那里。
【问题讨论】:
-
作为文档中提到的 垃圾收集,是一个 javascript 操作。这个问题/答案应该回答你的问题:stackoverflow.com/questions/28564629/…
-
@winner_joiner 谢谢。我尝试了
FinalizationRegistry并更新了我的 OP。我使用正确吗?
标签: javascript phaser-framework