本文由 FrameSprite 作者工作流整理,AI 辅助编写,引用原始技术资料;构造案例不代表模型或引擎实测。
区分游戏级动画定义与场景实例监听器,重启时复用动画键并解除属于旧场景的订阅。
Phaser 的共享动画定义与一次场景启动的监听器有不同生命周期。重复启动场景时,先检查动画键是否已存在;属于场景的外部事件订阅应在 shutdown 时解除。一次动作完成多次触发,先核对连接数量与旧闭包,而不是删除全局动画或改变序列帧 FPS。
把动画键、贴图键和当前角色实例分别记录。共享 Animation Manager 的定义可跨场景存在,当前场景角色与其回调不应被旧场景的闭包继续持有。
创建前用动画管理器查询 key 是否存在,必要时明确处理素材版本更新。不能每次 create 都无条件重建同名动画,也不能为了避免重复一口气移除其他场景使用的动画。
订阅全局事件或自建事件总线时,保存函数引用并在场景 shutdown 解除相同引用。匿名函数若无法再次定位,可能导致 off 未能移除原监听器。对象自己销毁是否清理事件要按具体发射器核对。
连续启动、完成动作、重启三次。每次记录场景编号与回调计数,预期每轮一次。再测试两个场景同时使用同一帧灵动作,确认其中一个退出不破坏另一个。
每轮添加 1 个外部监听器,shutdown 移除;对比从不解除的版本。
正确版本每轮活跃监听器为 1,退出后为 0;错误版本三轮增长到 3。
这是生命周期计数样本,不代表所有 Phaser 内建发射器都会泄漏。
资源 | 归属 | 退出时 |
|---|---|---|
shared animation | game-level manager | preserve if shared |
actor playback | scene instance | release actor |
external listener | scene run | unsubscribe same handler |
每次场景启动都向一个长寿命事件源注册完成监听,若不在退出时清理,三次启动后可能保留 3 个处理函数。管理后的目标是在每次运行中只有 1 个,在 Shutdown 后为 0。先确认监听器挂在 Scene 私有源还是全局源,再以同一个函数引用解除;临时重新创建的函数引用无法匹配原监听。还要检查重复触发是否来自动作本身被播放两次。记录注册、解除和回调计数,才能区别生命周期泄漏与正常的多个动画事件。
once 表示一次注册只调用一次,并不阻止代码重复注册三次。若每次进入界面都增加一个等待完成的监听器,事件仍可触发三个闭包。检查注册路径和退出路径,比把奖励代码包在一个临时布尔值里更能解决根因。
本次补充由 AI 辅助整理,按公开原始技术资料核对。可下载的输入与预期结果是原创构造案例,不代表模型或引擎实测;实际项目应按步骤保留自己的验收记录。
不必,共享定义可以复用,先检查键与修订。
只保证一次注册的调用次数,多次注册仍会各调用。
不能假设,要按发射器与持有者生命周期处理。
Scenes · Phaser
Animations · Phaser
原文:https://cn.framesprite.com/guides/phaser-scene-restart-animation-listener-lifecycle
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。