Godot引擎中的平台抽象层提供了一个统一的接口来处理平台特定的功能,允许引擎在多种操作系统和硬件环境中一致地运行,同时利用每个平台独有的能力。该系统主要围绕着 DisplayServer 类层级结构,它抽象了窗口管理、输入处理和其他平台特定的功能。
有关操作系统特定的文件访问和资源管理的信息,请参阅 OS 模块文档。有关渲染后端(rendering backends)的详细信息,请参阅 3 中的渲染系统文档。
Godot 的平台抽象层充当了引擎的高级系统与底层操作系统之间的桥梁。它允许引擎通过一个通用的接口执行平台特定的操作,从而简化了跨平台开发。
来源
平台抽象系统围绕一个定义了接口的基类 DisplayServer 进行设计,平台特定的实现继承自它。
DisplayServer 类为所有平台特定的实现提供了一个通用接口。它提供了用于窗口管理、输入处理、剪贴板操作、光标控制和其他平台特定功能的类方法。
来源
DisplayServer 实现了一个单例模式,以提供对平台服务的全局访问。
应用程序通过此单例访问平台服务。
来源
DisplayServer 为注册不同的平台实现实现了工厂模式。
来源
每个平台实现通过 has_feature 方法报告其支持的功能。
这使得 Godot 能够根据当前平台的性能调整其行为。
平台特定功能的示例
| 功能 | Windows | macOS | Linux (X11) | Android | iOS | Web | Headless |
|---|---|---|---|---|---|---|---|
| FEATURE_SUBWINDOWS | ✓ | ✓ | ✓ | ✗ | ✗ | ✗ | ✗ |
| FEATURE_TOUCHSCREEN | ✓ | ✗ | ✓ | ✓ | ✓ | ✓ | ✗ |
| FEATURE_MOUSE | ✓ | ✓ | ✓ | ✓ | ✗ | ✓ | ✗ |
| FEATURE_MOUSE_WARP | ✓ | ✓ | ✓ | ✗ | ✗ | ✗ | ✗ |
| FEATURE_CLIPBOARD | ✓ | ✓ | ✓ | ✓ | ✗ | ✓ | ✗ |
| FEATURE_VIRTUAL_KEYBOARD | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | ✗ |
| FEATURE_TEXT_TO_SPEECH | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | ✗ |
来源
DisplayServer 处理窗口的创建、配置和管理。
每个平台实现都会创建本地窗口并处理其生命周期。窗口数据存储在映射到窗口 ID 的 WindowData 结构中。
来源
DisplayServer 处理来自平台的输入事件,并将它们分派到适当的回调函数。
来源
DisplayServer 提供了用于操作系统剪贴板的方法。
每个平台实现都使用平台特定的剪贴板 API 来处理这些操作。
来源
DisplayServer 提供用于检索有关可用屏幕和显示器信息的方法。
来源
Windows 实现使用 Win32 API 来创建窗口、处理输入和管理剪贴板。
关键方面:
CreateWindowExW 创建窗口OpenClipboard、EmptyClipboard、SetClipboardData 处理剪贴板操作来源
macOS 实现使用 Cocoa API (Objective-C) 来创建窗口和处理平台特定功能。
关键方面:
NSWindow 和 NSView 创建窗口来源
X11 实现使用 X11 库来创建窗口和处理平台特定功能。
关键方面:
来源
Wayland 实现使用 Wayland 协议来创建窗口和处理平台特定功能。
关键方面:
来源
Android 实现使用 Java Native Interface (JNI) 与 Android 平台进行交互。
关键方面:
来源
iOS 实现使用 UIKit 来创建视图和处理平台特定功能。
关键方面:
来源
Web 实现使用 Emscripten 和 JavaScript API 与浏览器进行交互。
关键方面:
来源
Headless 实现提供了所有必需接口的虚拟实现,用于服务器环境或自动化测试。
来源
DisplayServer 通过为每个平台创建适当的渲染上下文与渲染系统进行交互。
来源
DisplayServer 处理跨平台的不同鼠标模式(可见、捕获、限制)。
每种平台实现这些模式的方式都不同。
SetCursorPos、ClipCursor 和 ShowCursor。XGrabPointer 和 XDefineCursor。CGWarpMouseCursorPosition 和 [NSCursor hide/show]。来源
DisplayServer 提供文本转语音服务的抽象。
每个平台都使用相应的 API 实现这些功能。
来源
要为新平台添加支持,开发人员需要:
DisplayServer 的新显示服务器实现。来源
Godot 中的平台抽象层提供了与不同操作系统和平台交互的统一接口。这使得引擎能够在各种环境中一致运行,同时仍然利用可用的平台特定功能。
DisplayServer 类是该系统的核心组件,它定义了所有平台特定实现必须遵守的接口。通过使用此抽象,Godot 可以在广泛的平台上为引擎用户和游戏玩家提供一致的体验。