<100 subscribers
【注:本工作室支持英中双语,简体中文版根据英文版生成,请以英文版为准】
Godot 引擎分析
一、分层架构(五层)
职责:直接与操作系统、硬件 API 交互,提供统一的底层接口。
关键模块:
platform:封装不同操作系统的窗口管理、输入设备、文件系统等(如platform\windows\display_server_windows.cpp
实现 Windows 窗口创建与消息循环)。
* drivers:硬件驱动实现(图形驱动:gles3、vulkan;音频驱动:alsa、wasapi;物理驱动:bullet、jolt\_physics)。
* thirdparty:第三方库封装(freetype 字体渲染、libpng 图像解码等)。
特点:与平台强相关,代码按操作系统分离;通过抽象接口向上层暴露功能,上层无需关心具体实现。
职责:提供引擎运行的基础服务,管理资源、内存、线程等。
关键模块:
core:核心数据结构与工具类(内存管理、容器、线程、数学库、字符串处理等)。
* scene:场景树与节点系统的基础实现,定义节点生命周期与层级关系。
* resource:资源管理系统,负责加载、缓存、释放纹理、模型等资源。
* servers:核心服务管理器(RenderingServer、PhysicsServer、AudioServer 等)。
特点:独立于具体游戏逻辑,提供通用服务;通过单例模式或全局接口访问(如Engine::get_singleton()
)。
职责:实现引擎的各类功能插件,可按需启用或禁用。
关键模块:
渲染相关:lightmapper_rd(光照贴图烘焙)、shader_language(着色器语言解析)。
* 物理与导航:godot\_physics\_2d/3d、navigation(导航网格生成)。
* 音频与多媒体:vorbis(Ogg Vorbis 解码)、minimp3(MP3 解码)、interactive\_music(交互式音乐)。
* 网络:enet(可靠 UDP 网络)、websocket、webrtc(实时通信)。
* 脚本与工具链:gdscript(脚本解析)、gdnative(C++ 扩展支持)等。
特点:模块化设计,各模块间依赖低,可独立开发或移除;通过注册机制集成到引擎(如Module::initialize()
)。
职责:实现游戏的具体内容,包括场景结构、角色行为、交互逻辑。
关键模块:
scene:高级场景节点与组件(Node2D/3D、Sprite、RigidBody 等)。
* animation:动画系统(骨骼动画、关键帧动画、状态机)。
* gui:图形界面系统(Control、Button、Label 等控件)。
* particles:粒子系统(火焰、烟雾、爆炸等特效)。
特点:面向游戏开发者的 API 层,通过脚本(如 GDScript)或可视化编辑器使用;依赖下层服务,不关心底层实现细节。
职责:提供开发环境,包括可视化编辑器、调试工具、资源导入器。
关键模块:
editor:主编辑器框架(场景编辑器、资源浏览器、属性检查器等)。
* tools:开发工具集(脚本编辑器、调试器、性能监控等)。
* import:资源导入系统(支持模型、纹理、音频等格式导入与转换)。
特点:独立于运行时引擎,仅在开发阶段使用;通过插件机制扩展功能。
游戏逻辑层:创建 Sprite 节点并设置纹理。
服务层:RenderingServer 接收绘制命令,转换为底层 API 调用。
驱动层:vulkan 或 gles3 驱动将命令翻译为具体 GPU 操作。
平台层:platform\windows
处理窗口上下文与交换链,最终显示画面。
二、模块分类
platform:平台适配模块(Windows 等系统的底层交互代码)。
main:主程序模块(引擎入口main.cpp
、性能监控等核心逻辑)。
text_server_adv:高级文本服务(依赖 harfbuzz、icu4c 等库,处理文字排版、国际化与字体渲染)。
freetype:基于 FreeType 库的字体加载与渲染模块。
gles3:OpenGL ES 3.0 渲染模块(处理光栅化、着色器与渲染管线)。
vulkan:Vulkan 渲染模块(含渲染上下文与设备驱动)。
glslang:GLSL 着色器编译模块(负责着色器解析与转换)。
lightmapper_rd:光线映射模块(光照贴图烘焙)。
raycast:基于 Embree 库的光线投射模块(碰撞检测与 occlusion culling)。
gltf、fbx:模型格式支持模块(处理导入 / 导出与结构解析,fbx 依赖 ufbx 库)。
ktx、svg、bmp、jpg、png、tga、webp、tinyexr:图像格式模块(支持对应格式加载 / 保存,svg 依赖 ThorVG 库)。
astcenc、bcdec、betsy、cvtt:纹理压缩模块(处理 ASTC、BC 等格式压缩与解压)。
godot_physics_2d/godot_physics_3d:内置物理模块(处理 2D/3D 碰撞、刚体与关节)。
jolt_physics:高性能 3D 物理模拟模块(碰撞检测、软体动力学等)。
navigation:导航模块(处理 2D/3D 导航网格与路径查询)。
vhacd:基于 V-HACD 算法的碰撞体分解模块(生成凸包碰撞体)。
vorbis、theora、minimp3:音频 / 视频编码模块(支持 Ogg Vorbis、Theora、MP3 格式)。
interactive_music:交互式音乐模块(处理音频流同步与播放列表)。
enet:ENet 网络模块(实现可靠 UDP 通信与多人联机)。
websocket:WebSocket 协议通信模块。
webrtc:实时音视频通信模块。
upnp:基于 miniupnpc 库的端口映射模块。
gdscript:GDScript 脚本模块(解析器、编译器与虚拟机)。
regex:基于 PCRE2 库的正则表达式模块。
jsonrpc:JSON 远程过程调用模块。
animation:动画系统模块(动画混合、状态机与关键帧处理)。
skeleton:骨骼与蒙皮模块(处理骨骼动画与皮肤权重)。
xatlas_unwrap:基于 xatlas 库的 UV 展开模块(生成纹理坐标)。
csg:构造实体几何模块(支持布尔运算构建复杂几何体)。
gridmap:网格地图模块(用于瓦片地图生成)。
noise:基于 FastNoise Lite 的噪声生成模块(生成 procedural 纹理与地形)。
mobile_vr、webxr、openxr:VR/XR 模块(支持移动 VR、WebXR 与 OpenXR 标准)。
multiplayer:多人游戏模块(处理网络同步、场景复制与 RPC)。
zip:ZIP 文件打包与解压模块。
meshoptimizer:基于 meshoptimizer 库的网格优化模块。
zstd、brotli、zlib:压缩算法模块(封装对应压缩库)。
mbedtls:基于 mbedTLS 的加密模块(实现 TLS/SSL 与加密功能)。
三、设计思路
核心模块与功能分离:将不同功能拆分为独立模块(如 text_server_adv 处理文本、物理模块处理碰撞等),可按需启用 / 禁用,降低耦合。
模块间通过静态库链接:各模块编译后生成独立静态库(如module_gltf.windows.editor.x86_64.lib
),最终链接为可执行文件,实现 “模块化构建、统一输出”。
平台抽象层:通过platform
目录隔离不同操作系统差异代码(如platform\windows
与platform\linuxbsd
),通过条件编译确保兼容性。
统一接口与平台实现分离:核心功能(如渲染、输入)通过抽象接口定义,平台特有代码实现具体逻辑(如 Windows 用 WGL/Vulkan,其他平台用 GLX/Metal),上层无需关心底层细节。
按 “底层驱动→核心服务→上层功能” 分层,各层职责明确:
底层驱动(drivers):提供硬件交互能力(音频驱动、图形 API 封装等)。
* 核心服务(servers):封装核心服务(渲染、物理、音频服务等),提供统一接口。
* 场景与资源系统(scene):实现游戏逻辑相关功能(节点、动画、资源管理等),是用户交互主要层。
* 编辑器功能(editor):独立于运行时的开发工具模块。
集成大量成熟第三方库,通过封装提供统一接口:
图形与渲染:glad、vulkan、glslang、embree 等。
* 文本与字体:harfbuzz、icu4c、freetype 等。
* 物理与碰撞:jolt\_physics、vhacd 等。
* 数据处理:zlib/zstd、libpng/libwebp、jsoncpp 等。
第三方库通过thirdparty
目录集成,编译时与引擎代码一起打包,确保分发独立性。
并行构建:自动检测 CPU 核心数(日志中为 20 核,使用 19 核并行编译),通过-j
参数调整,缩短编译时间。
资源编译与缓存:预编译资源文件(如godot_res.windows.editor.x86_64.obj
)减少运行时加载开销;静态库通过 Ranlib 优化索引,提升链接效率。
四、编译流程(Windows x86_64 平台编辑器版本)
启动与配置:以 Visual Studio 2022 Developer Command Prompt 为环境,通过 SCons 构建,目标为 “windows” 平台、“x86_64” 架构的 “editor” 版本;默认使用 19 核并行编译(可通过-j
或num_jobs
调整)。
系统环境检查:检查类 Unix 系统特有头文件mntent.h
,Windows 不支持,返回 “no”,不影响后续流程。
按 “平台相关代码→主程序代码→模块与第三方库代码” 顺序编译:
平台适配代码编译:优先编译platform\windows
下的窗口管理、输入处理、渲染上下文等文件,适配 Windows 系统接口。
* 主程序核心代码编译:编译`main`目录下的入口逻辑(`main.cpp`)、性能监控(`performance.cpp`)等,构成基础框架。
* 模块与第三方库编译:编译`modules`目录下的功能模块(文本处理、物理引擎等)及第三方库(字体处理、图形渲染、压缩算法等),生成目标文件。
静态库打包:将目标文件(.obj)打包为静态库(.lib),如模块汇总库、第三方库等;对静态库执行 Ranlib 操作优化索引,提升链接效率。
最终可执行文件链接:链接所有静态库,生成两个可执行文件:bin\godot.windows.editor.x86_64.exe
(主编辑器程序)、bin\godot.windows.editor.x86_64.console.exe
(带控制台输出的版本)。
成功标志:耗时约 26 分钟,显示编译成功。
输出产物:生成编辑器可执行文件及中间库文件,完成 Windows 平台编辑器构建。
特点:通过模块化设计隔离平台差异代码,整合第三方库扩展功能,静态链接生成独立可执行文件,确保 Windows 环境下的完整性和兼容性。
OleLukCie