Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

何时以及如何避免为任何事情使用节点

虽然节点的创建成本很低,但是它们也有一定的局限性。一个项目可能有成千上万个节点,都各自在做事情。每个节点的行为越复杂,对项目性能增加的压力就越大。

Godot 为创建节点使用的 API 提供了更轻量级的对象。在设计如何构建项目的特性时,请务必将这些作为选项牢记在心。

  1. Object:终极轻量级对象,原始的 Object 必须使用手动内存管理。尽管如此,创建自己的自定义数据结构——甚至是节点结构——也并不难,并且比 Node 类更轻量。

    • 示例:参见 Tree 节点。它支持对具有任意行数和列数的内容表,进行高级定制。用来生成可视化的数据实际上是 TreeItem 对象的树。

    • 优势: 将 API 简化为较小范围的对象,有助于提高其可访问性、改善迭代时间。与其使用整个 Node 库,不如创建一组简略的 Object,节点可以从这些 Object 中生成和管理相应的子节点。

    备注

    处理它们时要小心. 可以将 Object 存储到变量中, 但是这些引用可能在没有警告的情况下失效. 例如, 如果对象的创建者决定删除它, 这将在下一次访问时, 触发错误状态.

  2. RefCounted:只比 Object 稍微复杂一点。它们会记录对自己的引用,只有当对自己没有另外的引用存在时,才会删除加载的内存。在大多数需要在自定义类中存取数据的情况下,很有用。

    • 示例:FileAccess 对象。它的功能就像普通 Object 一样,只是不需要人为删除。

    • 优势:Object 相同.

  3. Resource :只比 RefCounted 稍微复杂一点。它们天然具有将其对象属性序列化(即保存)到 Godot 资源文件,或从 Godot 资源文件中反序列化(即加载)的能力。

    • 示例 : 脚本, PackedScene (用于场景文件), 以及其他类型, 比如 AudioEffect 类. 每一个都可以保存和加载, 因此它们从 Resource 扩展.

    • 优势:关于 Resource 与传统数据存储方法相比的优势已经说了 很多。然而,在使用 Resource 替代 Node 的情境下,Resource 的主要优点是与检查器的兼容性。虽然几乎和 Object/Reference 一样轻量,它们仍然可以在检查器中显示并导出属性。这使它们在易用性上,可以媲美使用子节点的方式,而且如果有人计划在其场景中包含许多这类 Resource/Node,它们还可以提高性能。