Godot报错:等待回调时对象已删除及消息队列内存不足
Godot消息队列内存不足+回调对象已删除问题排查方案
问题现象
出现无法稳定复现的错误日志:
Failed method: MarginContainer:_update_callback target ID: 43636 Object was deleted while awaiting a callback ... TOTAL BYTES: 4194288 NULL count: 185 CALL : 174575 CALL _update_callback: 2 ERROR: Message queue out of memory. Try increasing 'memory/limits/message_queue/max_size_kb' in project settings.
已禁用所有CanvasItem的Update()调用,但问题仍未解决。
排查与解决方向
处理对象生命周期与回调残留
错误中的Object was deleted while awaiting a callback是关键线索:- 所有涉及
MarginContainer或其关联节点的销毁操作(如queue_free())执行前,调用cancel_deferred_callbacks()清理该对象的所有待执行延迟回调;同时确保断开所有已连接的信号,避免销毁后仍有信号触发其方法。 - 检查是否存在通过
call_deferred、set_deferred向已销毁对象发送消息的逻辑,这类操作会导致无效消息堆积在队列中。
- 所有涉及
排查高频消息来源
禁用Update()仅减少了Canvas刷新请求,消息队列溢出可能来自其他高频操作:- 检查
_process、_physics_process等循环函数中是否存在无限制的call_deferred、emit_signal调用,这类操作会快速填充消息队列。 - 排查是否存在循环回调链:比如某个回调执行后又触发新的回调,形成无限循环的消息堆积。
- 检查
临时配置调整
按照错误提示,先在项目设置中增大memory/limits/message_queue/max_size_kb的值(比如从默认4096调整为8192),观察是否仍会出现溢出。此为临时缓解方案,需配合根源排查。调试捕捉复现场景
针对无法稳定复现的问题,可通过以下方式定位:- 开启Godot调试菜单中的
Show Message Queue,实时监控队列内消息数量、类型及来源,锁定高频消息的触发点。 - 在对象销毁、回调执行的关键位置添加日志,追踪哪些对象销毁后仍有未处理的回调任务。
- 开启Godot调试菜单中的
内容的提问来源于stack exchange,提问作者Atlinx
相关产品推荐
相关产品推荐

