Godot: 实例化 14563 PackedScene 时缓冲区溢出。

创建于 2017-04-21  ·  3评论  ·  资料来源: godotengine/godot

操作系统或设备 - Godot 版本:
Linux - Ubuntu Mate 16.10 - Godot 2.1.2 稳定版

问题描述:
我的 Godot 2D 游戏原型面临 RAM 过度使用的问题,我决定找出原因。 我想看看 Godot 可以处理多少 PackedScene 实例而不会耗尽我的 RAM。

我用一个简单的架构构建了一个主场景:

---> Node // Script attached  here
       +----> YSort

我还构建了一个名为“Hexa.tscn”的场景,其架构也很简单:

---> Area2D
       +-----> Sprite

在附加到主场景根节点的脚本中,我尝试在 YSort 节点中添加尽可能多的“Hexa”场景实例。

如果我添加 14562 个 Hexa 场景实例,则一切顺利(1 CPU 的使用率约为 3%,RAM 使用率约为 115Mo,这代表:29655 个对象、3 个资源、29127 个节点)

但是如果我添加14563个Hexa场景实例,就会遇到缓冲区溢出错误,如下:

在调试器的错误选项卡中:

Type: Error
Description:
Time: 0:00:00:0458
C Error: Condition '(buffer_end+room_needed) >= buffer_size' is true. returned ERR_OUT_OF_MEMORY
C Source: core/message_queue.ccp:54
C function: push_call

在调试器的输出选项卡中:

failed method: Sprite:_update_callback target ID: 29681
TOTAL BYTES: 1048560
NULL count: 0
CALL _sort_children: 14564
CALL_update_callback: 29126

这是一个错误吗?

重现步骤:
在 Godot 编辑器中运行附加的 Godot 项目以查看调试器中的错误。

链接到最小的示例项目:
memtest.tar.gz

archived enhancement junior job core

最有用的评论

@Faless

我很高兴知道这个问题显然不是错误,而只是我设置的错误配置。

谢谢你的启发:)

改进错误消息是否有趣,以便通知用户此 message_queue_size_kb 设置调整?

所有3条评论

您想增加消息队列的最大大小:

project settings -> core -> message_queue_size_kb
到更高的东西。

无论如何,出于性能原因,我都会避免创建如此多的节点。

@Faless

我很高兴知道这个问题显然不是错误,而只是我设置的错误配置。

谢谢你的启发:)

改进错误消息是否有趣,以便通知用户此 message_queue_size_kb 设置调整?

我想通知您,在 Godot 3.1 Alpha 2 中,错误信息甚至更糟:

image

我花了很长时间才意识到我达到了消息队列的限制。

此页面是否有帮助?
0 / 5 - 0 等级