架构概览
最后同步日期:2026-04-15 | Godot 官方原文 — Godot's architecture diagram
架构概览
Godot 引擎不是一坨"大杂烩"式的代码,而是像一栋大楼一样,有清晰的分层结构。每一层只负责自己的事情,层与层之间通过明确的接口沟通。
打个比方:Godot 就像一家餐厅——编辑器是前台(你看得见、摸得着),场景系统是服务员(把你的需求传达给后厨),服务器是后厨的各个部门(做菜、上菜、收银各司其职),核心层是厨房基础设施(水电气),驱动层是具体的设备品牌(煤气灶还是电磁炉)。
引擎分层架构图
Godot 引擎由 5 个层次组成,从上到下依次为:
层间调用关系:
- 编辑器 → 调用场景与脚本层
- 场景 ↔ 脚本(双向交互)
- 场景 → 调用各服务器
- 模块 / 服务器 → 依赖核心层
- 核心层 → 调用各驱动
各层的详细内部结构见下方逐层解读中的图表。
逐层解读
第一层:编辑器(Editor)
编辑器是你打开 Godot 后看到的那个界面。你日常开发的绝大部分操作都在这里完成,主要包括:
- 场景编辑器:可视化地编辑场景节点树、调整节点属性
- 脚本编辑器:编写和调试 GDScript / C# 代码
- 动画编辑器:制作关键帧动画、管理动画状态机
- TileMap 编辑器:绘制瓦片地图,编辑图块集
- 导入管线:自动将外部资源(图片、3D 模型、音频等)转换为引擎可用的格式
- 编辑器插件:社区和官方提供的编辑器扩展,增强编辑器功能
关键事实:Godot 的编辑器本身也是用 Godot 做出来的!它本质上就是一个 Godot 应用程序,运行在引擎之上。这意味着你用 Godot 能做出的界面,编辑器本身也在用。
第二层:场景系统与脚本(Scene & Scripting)
这一层分为三个子系统:
场景系统(Scene System) 是 Godot 的核心设计理念。你的游戏由一个个"场景"组成,每个场景里包含一棵"节点树":
- Node:所有场景节点的基类,就像乐高积木的基础模块——每个可见的、可交互的游戏元素都是一个 Node
- SceneTree:管理所有正在运行的节点,负责节点的生命周期(创建、更新、销毁)
- Resource:管理可复用的资源(如图片、音频、材质),资源可以被多个节点共享
脚本系统(Scripting) 让你可以用代码控制节点行为。Godot 支持多种脚本语言:
- GDScript:Godot 自带的脚本语言,语法简洁,与引擎 API 深度集成
- C# / .NET:适合有 .NET 经验的开发者,性能更好,通过 Mono 运行时执行
- GDExtension:允许你用 C++、Rust 等语言编写高性能扩展,适合性能敏感的模块
脚本通过操作场景系统中的 Node 和 Resource 来实现游戏逻辑。
模块系统(Modules) 是引擎内置的可选功能模块,它们不是核心必需的,但为引擎提供了丰富的附加能力:
- Mono 运行时:C# 脚本的执行环境
- 正则表达式:文本匹配和搜索
- JSON:JSON 数据的解析和生成
- SVG:SVG 矢量图的渲染
- 迷你解析器:各种第三方库的轻量集成(如 tinyexr 处理 EXR 图片、basis_universal 处理纹理压缩等)
第三层:服务器(Servers)
服务器层是 Godot 的"后厨",负责所有高性能的底层运算。每个服务器专注于一个领域:
| 服务器 | 内部组成 | 职责 | 打个比方 |
|---|---|---|---|
| RenderingServer | 2D 渲染器 + 3D 渲染器 + RenderingDevice | 画面渲染:把场景画到屏幕上;RenderingDevice 是 GPU 的统一抽象层 | 美术师 |
| PhysicsServer2D / 3D | — | 物理模拟:碰撞检测、刚体运动,2D 和 3D 各有独立的服务器 | 物理老师 |
| AudioServer | 混音总线 + 音频效果 | 音频播放:管理多条混音通道,对声音施加效果(回声、混响等) | 音响师 |
| NavigationServer | — | 路径导航:寻路、避障,为 AI 角色规划行走路线 | 导航员 |
| DisplayServer | — | 与操作系统窗口交互:创建窗口、处理输入事件、管理显示器信息 | 前台接待 |
| TextServer | — | 文字排版与渲染:字体加载、文本布局、支持多种书写系统(中文、阿拉伯文等) | 书法家 |
| TranslationServer | — | 国际化翻译:管理多语言翻译资源,根据用户语言设置返回对应文本 | 翻译官 |
| CameraServer | — | 相机画面捕获:从摄像头获取图像数据 | 摄影师 |
| XRServer | — | VR/AR 支持:管理 XR 设备的追踪和渲染 | VR 体验员 |
你在场景层调用的 API(比如 move_and_slide()、play()),最终都会被转发到对应的服务器去执行。这种设计的好处是:服务器可以独立优化性能,甚至可以在独立线程上运行。
第四层:核心(Core)
核心层是引擎的地基,提供所有上层功能依赖的基础能力。它内部按职责分为六个子模块:
操作系统抽象
- OS:与操作系统交互的统一接口,管理窗口、命令行参数、执行环境等
- Thread / Mutex:跨平台的线程和互斥锁,让多线程代码在所有平台行为一致
- Semaphore:信号量,用于线程间的同步协调
核心类型
- Variant:Godot 的"万能容器",可以存储任何类型的数据(整数、字符串、对象、数组……),是整个类型系统的粘合剂
- Object:所有 Godot 对象的基类,提供信号(signal)、属性(property)、通知(notification)等机制
- RefCounted:引用计数基类,继承自 Object,自动管理内存——当没人引用时自动释放
数学库
- Vector2 / Vector3:二维/三维向量,用于表示位置、方向、速度等
- Transform2D / Transform3D:变换矩阵,用于描述物体的位置、旋转、缩放
- Geometry2D / 3D:几何计算工具,如碰撞检测、线段相交、凸包等
容器
- Array / Dictionary:动态数组和字典,对应 GDScript 中的
[]和{} - Packed*Array:紧凑类型数组(如 PackedInt32Array、PackedVector2Array),内存连续,适合大量数据传输
- RBSet / RBMap:基于红黑树的有序集合和映射,查找效率稳定
- HashMap / HashSet:基于哈希表的快速查找集合
I/O
- FileAccess:文件读写,支持文本和二进制模式
- DirAccess:目录操作:创建、删除、遍历文件夹
- StreamPeer / PacketPeer:网络通信的抽象层,支持 TCP、UDP 等协议
字符串
- String:Godot 自定义的字符串类,支持 Unicode,提供丰富的文本操作方法
- StringName:优化后的字符串,用于属性名、方法名等频繁比较的场景——相同的字符串只存储一份
- NodePath:专门用于表示节点路径的字符串(如
"Sprite2D/Texture")
核心层的设计理念是"自给自足"——Godot 不依赖 C++ 标准模板库(STL),而是自己实现了所有需要的基础数据结构。这样做是为了更好的跨平台兼容性和可控的内存管理。
第五层:驱动(Drivers)
驱动层是引擎与硬件/操作系统之间的翻译官。它按功能分为四类:
图形驱动
- Vulkan:现代跨平台图形 API,是 Godot 4.x 的首选渲染后端
- OpenGL:兼容性最好的图形 API,适合老旧设备或 WebGL 环境
- D3D12:DirectX 12,Windows 平台上的高性能选项
- Metal:Apple 平台(macOS / iOS)的专属图形 API
音频驱动
- WASAPI:Windows 音频会话 API
- PulseAudio / ALSA:Linux 上的音频系统
- CoreAudio:macOS / iOS 的音频框架
输入驱动
- XInput:Windows 上的手柄输入(Xbox 控制器等)
- evdev:Linux 上的原始输入设备接口
- Gamepad:跨平台的游戏手柄通用驱动
网络驱动
- TCP / UDP:基础网络协议
- WebSocket:支持浏览器与服务器的实时通信
- WebRTC:点对点实时通信,适合多人游戏
驱动层让上层代码不需要关心"底层到底用的是什么设备",只要调用统一的接口就行。
架构设计的核心思想
Godot 的分层架构体现了几个重要的设计原则:
- 关注点分离:每层只做自己的事,渲染不操心物理,物理不管音频
- 接口抽象:服务器通过抽象接口与驱动通信,可以随时替换底层实现
- 场景驱动:一切以场景和节点为中心,脚本通过操作节点来工作
- 自包含:引擎尽量减少外部依赖,自己实现基础库,保证跨平台一致性
理解这个分层结构,是深入阅读后续章节的基础——接下来的每个章节,都是在讲这栋"大楼"中某一层的具体细节。
