Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
核心类型
Godot 具有构成其核心的丰富的类和模板集,并且所有内容都基于它们构建。
这份参考将试着按顺序列出它们,使之更容易被理解。
内存分配
Godot 有许多确保内存安全和跟踪内存使用情况的技巧。因此,不应使用常规的 C 和 C++ 库调用。取而代之的是几个替代方案。
Godot提供了一些宏可以用来处理C风格的内存分配:
memalloc(size)
memrealloc(pointer)
memfree(pointer)
这些等效于C标准库中惯用的 malloc()、realloc()和free()。
这些宏可以用来处理C++风格的内存分配:
memnew(Class)
memnew(Class(args))
memdelete(instance)
memnew_arr(Class, amount)
memdelete_arr(pointer_to_array)
这些分别等效于new、delete、new[]和delete[]。
memnew/memdelete 还利用了一些 C++ 的“魔法”来自动调用后初始化(post-init)和预释放(pre-release)函数。例如,这用于在对象刚创建后以及即将被删除前通知它们。
容器
Godot 提供了自己的容器,代码库中通常不使用 std::string、std::vector 等 STL 容器。详见 为什么 Godot 不使用 STL(标准模板库)?。
📜 图标表示该类型属于 Variant。这意味着它可以作为 API 的方法参数和返回值暴露给脚本。
Godot 数据类型 |
最接近的 C++ STL 数据类型 |
注释 |
|---|---|---|
String 📜 |
|
请作为“默认”字符串类型使用。 |
|
请作为“默认”动态数组类型使用。采用写时复制(COW)机制。这意味着速度通常较慢,但可以几乎零成本地进行复制操作。不需要 COW、性能敏感时请改用 |
|
|
请作为“默认”集合类型使用。 |
|
|
请作为“默认”映射类型使用。不保持插入顺序。请注意,指向映射内部的指针和迭代器在映射发生修改后均不稳定。如果需要支持这些功能,请改用 |
|
|
采用了字符串驻留(string interning)技术,以实现快速的比较操作。推荐将其用于那些在引擎多个位置被频繁引用的静态字符串。 |
|
|
语义上接近 |
|
Array 📜 |
|
值(Values)可以是任意的 Variant(变体)类型,不强制要求静态类型。采用共享引用计数机制,类似于 |
|
它是 |
|
|
这是 |
|
|
链表类型。通常比其他数组/向量类型更慢。在新代码中建议优先使用其他类型,除非使用 |
|
|
一种具有固定容量的向量(更类似于 |
|
|
表示对于一段内存连续的数组的只读访问,并且无需复制任何数据。注意 |
|
|
使用 红黑树 来实现更快的访问。 |
|
|
采用了写时复制(COW)的语义。这意味着它在一般情况下速度会稍慢一些,但几乎可以零成本地进行复制。由于 |
|
|
一种防御性(稳健但速度较慢)的映射(map)类型。它会保留元素的插入顺序。在发生数据变动(mutation)时,指向键(keys)和值(values)的指针以及迭代器(iterators)都能保持稳定。当你需要用到上述这些特性时,请使用这种映射类型;在其他情况下,请使用 |
|
|
一种使用 红黑树 来查找键(key)的 Map 类型。由于 |
|
|
键(Keys)和值(values)可以是任意的 Variant(变体)类型,不强制要求静态类型。采用共享引用计数机制,类似于 C++ 标准库里的 |
|
|
|
|
|
它用来存储单一的一对数据。另外也可以看看同一个文件里的 |
重定位安全性
Godot 的容器(Containers)假设其内部元素是`trivially relocatable <https://open-std.org/JTC1/SC22/WG21/docs/papers/2020/p1144r5.html>`__。
这意味着,如果你在里面存储的数据类型包含指向自身的指针,或者由于其他原因导致它不是 not trivially relocatable ,Godot 可能会崩溃。不过请注意,存储 指向 那些‘非简单可重定位’对象(比如某些 Object 的子类)的指针,则是完全没有问题的,并且受到支持。
之所以要假设(某类型)具备平凡可重定位性,是因为这样我们就能利用一些重要的优化技术,比如直接通过 memcpy 或 realloc 来进行重定位。
GH-100509 跟踪此决定。
多线程 / 并发
参见
你可以在这里找到更多关于多线程策略的信息 使用多线程.
Godot 的所有容器(Containers)都不是线程安全的。如果你预计会有多个线程同时访问它们,就必须自行使用多线程保护机制。
请注意,这里列出的某些类型也可以通过绑定(bindings)来使用,但这些绑定类型都被 RefCounted (found in the CoreBind:: namespace)包裹了一层。出于效率考虑,请尽可能优先使用这里列出的原生基础类型。
Godot 数据类型 |
最接近的 C++ STL 数据类型 |
注释 |
|---|---|---|
|
递归互斥锁(Recursive mutex)类型。请使用 |
|
|
非递归互斥锁(Non-recursive mutex)类型。请使用 |
|
|
一种能识别“读/写”状态的互斥锁类型。请使用 |
|
|
一种可以与 |
|
|
条件变量类型,需配合 |
|
|
计数 semaphore 类型。 |
|
|
专为数字设计的、基于模板的原子类型。 |
|
|
布尔(Bool)原子类型。 |
|
|
这是一种专为引用计数设计的原子类型。如果当前的引用计数已经是 0,它将拒绝(或者说无法)再执行递增操作。 |
数学类型
在 core/math 目录中有一些线性代数相关的类型:
节点路径
这是一种特殊的数据类型,专门用来存储场景树中的路径,并以一种高度优化的方式来引用它们。
RID
RID 指的是 资源 ID(Resource IDs) 。服务器(Servers)使用它们来引用存储在内部的数据。RID 是‘不透明’的,这意味着它们所引用的数据无法被直接访问。此外,RID 是独一无二的,即使它们引用的数据类型完全不同,也不会重复。