我正在制作一款类似弹幕射击游戏,需要消灭大量敌人的游戏。
在测试过程中,我发现内存使用量正在逐渐增加。

经过调查,发现如果敌人在VS的"Any State"(任意状态)中存在链接,即使敌人消失,内存也无法释放。
通过Godot的监控器观察对象数量时,确认在"Ant State"存在链接时数量会增加,而若无链接则无变化。链接条件可以是“变量变化”或“攻击判定接触”等任何情况,且在运行过程中是否发生状态转移似乎并不影响。此外,即使切换到其他游戏场景,内存似乎也无法释放。
需要注意的是,该问题在版本1.2.6中可以复现,但我是在之前的版本中发现的,因此我认为这与1.2.6新增的"Any State"功能无关。
附上测试中使用的项目文件。
memorytest.zip (24.3 KB)
Baz
2
这确实很有趣。我也尝试完全删除 Any State 节点,但仍然有轻微的增加。我怀疑这是否是因为在 Restore 条件下 GameObject 的引用列表不断增加所致。最终我也不确定,但我已将此反馈给开发人员,以便他们更好地调查原因。
感谢您向我们指出这一点并提供最小化项目!
1 个赞
感谢您的报告。
即使没有“Any State”的链接,我们也确认了内存会增加。
由于对象和资源并未增加,
确实可能是列表之类的数据未被释放。
这似乎与上述问题相关:生成粒子后,即使粒子消失,对象数量似乎也无法完全恢复。
例如,创建一个仅用于大量生成粒子的简单关卡,并重复执行“生成粒子 → 重置(无论是否等待其完全消失,结果相同)”,监控器显示的对象数量会呈阶梯状持续增长。
1 个赞
Baz
5
@tamaki 我可以确认他们已经找到并修复了该问题。我猜会在下一个补丁中发布!
@udon365 首先想到的是,你使用的是指定时长还是无限时间?如果你使用的是无限时间,我怀疑对象数量会增加。如果你不确定确切的时长,可以设置一个较大的值,这样最终它会在运行时释放。

1 个赞
关于 AnyState 的问题,我们已在今天发布的 1.2.7 版本中进行了修复!
1 个赞
感谢您的处理。
我们已在 1.2.7 版本中确认内存和对象数量未增加。
抱歉。
关于粒子对象数量无法完全恢复的问题,似乎与本线程中讨论的 AnyState 内存泄漏问题无关……
顺便说明一下,我仅设置了“持续时间”,并未勾选“持久化显示时间”。
关于此问题,可能是由于我在“Forward+”模式下使用了子发射器所致。
1 个赞