引擎初始化和核心系统
相关源文件
本文档介绍了 Godot 引擎如何启动以及管理其运行的核心系统。它涵盖了初始化顺序、关键单例和支持引擎跨平台运行的基础系统。有关场景系统的更多信息,请参阅场景系统。
初始化流程
Godot 引擎在启动过程中遵循特定的顺序,从初始入口点到主循环的创建。
入口点和初始设置
初始化过程从 `main.cpp` 中的 `main()` 函数开始。这是引擎的入口点,它执行以下操作:
- 配置 stdout/stderr 重定向
- 解析命令行参数
- 调用 `Main::setup()` 来初始化核心系统
- 调用 `Main::setup2()` 来初始化剩余的系统
- 调用 `Main::start()` 来开始引擎执行
来源
核心初始化在 `Main::setup()` 中
`Main::setup()` 初始化引擎所需的底层系统。
- 初始化 OS 单例(特定平台实现)
- 创建 Engine 单例
- 注册核心类型和驱动程序
- 初始化 PackedData 用于资源打包
- 创建 ProjectSettings 单例
- 初始化 TranslationServer 和其他核心单例
来源
二次初始化在 `Main::setup2()` 中
`Main::setup2()` 负责初始化服务器子系统和模块。
- 初始化所有模块直至核心层
- 注册服务器类型(渲染、音频、物理)
- 设置主输入设备
- 初始化物理服务器
- 使用选定的驱动程序初始化渲染服务器
- 创建主题数据库
- 设置项目特定选项
来源
核心单例
Godot 的架构依赖于几个提供基本服务的关键单例类。这些单例在启动过程的早期进行初始化。
关键引擎单例
| 单例模式(Singleton) | 目的 | 文件 |
|---|
| 操作系统 | 平台抽象、文件系统访问、计时 | core/os/os.h |
| 引擎 | 引擎配置和状态管理 | core/config/engine.h |
| ProjectSettings | 项目配置和设置 | core/config/project_settings.h |
| DisplayServer | 窗口和显示管理 | servers/display_server.h |
| RenderingServer | 渲染操作 | servers/rendering_server.h |
| AudioServer | 音频播放和管理 | servers/audio_server.h |
| InputMap | 输入动作映射 | core/input/input_map.h |
| PhysicsServer2D/3D | 物理模拟 | servers/physics_server_*.h |
来源
单例初始化顺序
初始化顺序至关重要,因为某些系统依赖于其他系统已初始化。一般顺序是:
- OS(平台特定)
- 引擎
- 核心类型和驱动程序
- ProjectSettings
- 翻译和消息系统
- 服务器接口(显示、渲染、音频、物理)
- 输入系统
- 场景系统
来源
OS 抽象层
OS 抽象层提供独立于平台的操作系统功能访问。
Godot 为每个支持的平台实现了不同的 OS 类:
- OS_Windows(Windows)
- OS_Unix(Linux、BSD 等)
- OS_MacOS(macOS)
- OS_Android(Android)
- OS_iOS(iOS)
- OS_Web(Web/HTML5)
每个实现都继承自基础 OS 类,并提供特定于平台的虚方法实现。
来源
关键 OS 服务
OS 类提供若干关键服务:
- 时间管理:用于高精度计时的函数(`get_ticks_usec()`、`delay_usec()`)
- 文件系统访问:特定平台的文件的目录操作
- 进程管理:创建和管理外部进程
- 动态库加载:加载和交互本地库
- 平台信息:获取系统详细信息和功能
- 命令行处理:解析和访问命令行参数
- 熵源:提供加密安全的随机数据
来源
ProjectSettings 系统
ProjectSettings 单例管理引擎和项目的配置。
配置结构
ProjectSettings 将设置存储为键值对,其中:
- 键是层级字符串(例如,“application/config/name”)
- 值可以是任何 Variant 类型(整数、字符串、数组等)
- 设置可以包含元数据(顺序、持久性、类型提示)
来源
设置加载和覆盖系统
ProjectSettings 支持一个复杂的覆盖系统:
- 默认引擎设置在初始化期间注册。
- 项目特定设置从 "project.godot" 加载。
- 特定功能覆盖允许平台依赖设置。
- 运行时覆盖可以通过编程方式应用。
- 外部覆盖文件(override.cfg)可以修改设置。
来源
资源管理
Godot 的资源系统处理各种类型资产的加载、缓存和访问。
资源加载流程
资源通过 ResourceLoader 单例加载,该单例:
- 确定资源的适当格式加载器
- 使用格式加载器读取和解析资源
- 缓存已加载的资源以备将来使用
- 处理资源依赖关系和引用
来源
资源路径系统
Godot 使用特殊路径前缀来标识不同的资源位置:
- `res://` - 项目资源目录
- `user://` - 用户特定的持久化数据目录
- `uid://` - 唯一资源标识符路径
OS 和 ProjectSettings 单例协同工作,将这些逻辑路径转换为实际的文件系统路径。
来源
主循环和引擎执行
主循环负责引擎的逐帧执行。
主循环结构
初始化后,引擎进入主循环,该循环会
- 处理输入事件
- 更新物理状态(固定时间步长)
- 更新游戏逻辑(可变时间步长)
- 渲染帧
- 处理音频
- 交换显示缓冲区
来源
计时系统
引擎为不同方面使用了不同的计时机制
- 物理使用固定的时间步长来进行确定性模拟
- 游戏逻辑可以使用固定或可变时间步长
- 渲染可以同步到显示刷新率(垂直同步)
OS 单例通过特定于平台的实现提供高精度计时
- Windows: QueryPerformanceCounter/QueryPerformanceFrequency
- Unix/Linux: clock_gettime 配合 CLOCK_MONOTONIC
- macOS: mach_absolute_time
来源
不同的平台有特定的初始化要求,这些要求由其操作系统实现来处理。
在 Windows 上,OS_Windows 类负责
- Windows API 交互
- DirectWrite 用于字体管理
- DLL 加载和资源处理
- 注册表和环境变量访问
- 图形 API 选择
- 控制台重定向用于终端输出
来源
在 Unix 系统上,OS_Unix 管理
- POSIX API 交互
- 共享库加载
- 文件描述符管理
- 进程创建和监控
- 系统信息查询
来源
崩溃处理与调试
Godot 包含处理崩溃和支持调试的系统。
崩溃处理
每个平台都有一个崩溃处理程序的实现,它会
- 捕获崩溃信息
- 尽可能生成堆栈跟踪
- 创建崩溃日志文件
- 在适当的时候显示崩溃对话框
调试支持
引擎支持各种调试功能
- 远程调试基础设施
- 性能监控
- 控制台命令处理
- 信号处理用于调试中断
来源
结论
引擎的初始化和核心系统构成了 Godot 引擎其他部分构建的基础。理解这些系统对于引擎贡献者以及需要调试底层问题或扩展引擎功能性的开发者至关重要。
初始化过程遵循一个有条不紊的顺序,以正确的顺序设置平台抽象、核心服务和专用子系统。这种结构使 Godot 能够在多样化的平台上保持一致的行为,同时在需要时利用特定平台的优化。