菜单

平台抽象

相关源文件

Godot引擎中的平台抽象层提供了一个统一的接口来处理平台特定的功能,允许引擎在多种操作系统和硬件环境中一致地运行,同时利用每个平台独有的能力。该系统主要围绕着 DisplayServer 类层级结构,它抽象了窗口管理、输入处理和其他平台特定的功能。

有关操作系统特定的文件访问和资源管理的信息,请参阅 OS 模块文档。有关渲染后端(rendering backends)的详细信息,请参阅 3 中的渲染系统文档。

概述

Godot 的平台抽象层充当了引擎的高级系统与底层操作系统之间的桥梁。它允许引擎通过一个通用的接口执行平台特定的操作,从而简化了跨平台开发。

来源

架构

平台抽象系统围绕一个定义了接口的基类 DisplayServer 进行设计,平台特定的实现继承自它。

DisplayServer 基类

DisplayServer 类为所有平台特定的实现提供了一个通用接口。它提供了用于窗口管理、输入处理、剪贴板操作、光标控制和其他平台特定功能的类方法。

来源

单例模式

DisplayServer 实现了一个单例模式,以提供对平台服务的全局访问。

应用程序通过此单例访问平台服务。

来源

动态注册系统

DisplayServer 为注册不同的平台实现实现了工厂模式。

来源

核心功能

功能检测

每个平台实现通过 has_feature 方法报告其支持的功能。

这使得 Godot 能够根据当前平台的性能调整其行为。

平台特定功能的示例

功能WindowsmacOSLinux (X11)AndroidiOSWebHeadless
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)

Windows 实现使用 Win32 API 来创建窗口、处理输入和管理剪贴板。

关键方面:

  • 使用 CreateWindowExW 创建窗口
  • 通过 Windows 消息循环处理输入
  • 使用 OpenClipboardEmptyClipboardSetClipboardData 处理剪贴板操作

来源

macOS (Cocoa)

macOS 实现使用 Cocoa API (Objective-C) 来创建窗口和处理平台特定功能。

关键方面:

  • 使用 NSWindowNSView 创建窗口
  • 通过 Cocoa 事件系统处理输入
  • 使用 NSPasteboard 处理剪贴板操作

来源

Linux X11

X11 实现使用 X11 库来创建窗口和处理平台特定功能。

关键方面:

  • 使用 X11 API 创建窗口
  • 通过 X11 事件处理输入
  • XKB 用于键盘映射

来源

Linux Wayland

Wayland 实现使用 Wayland 协议来创建窗口和处理平台特定功能。

关键方面:

  • 使用 Wayland API 创建窗口
  • 通过 Wayland 事件处理输入
  • 专用的 Wayland 线程用于事件处理

来源

Android

Android 实现使用 Java Native Interface (JNI) 与 Android 平台进行交互。

关键方面:

  • Activity 和 View 的创建
  • 通过 Android 触摸事件处理输入
  • 虚拟键盘支持

来源

iOS

iOS 实现使用 UIKit 来创建视图和处理平台特定功能。

关键方面:

  • UIView 的创建
  • 触摸事件处理
  • 虚拟键盘支持

来源

Web

Web 实现使用 Emscripten 和 JavaScript API 与浏览器进行交互。

关键方面:

  • Canvas 的创建
  • DOM 事件处理
  • 浏览器剪贴板 API

来源

Headless

Headless 实现提供了所有必需接口的虚拟实现,用于服务器环境或自动化测试。

来源

渲染集成

DisplayServer 通过为每个平台创建适当的渲染上下文与渲染系统进行交互。

来源

功能处理示例

鼠标模式

DisplayServer 处理跨平台的不同鼠标模式(可见、捕获、限制)。

每种平台实现这些模式的方式都不同。

  • Windows 使用 SetCursorPosClipCursorShowCursor
  • X11 使用 XGrabPointerXDefineCursor
  • macOS 使用 CGWarpMouseCursorPosition[NSCursor hide/show]

来源

文本转语音

DisplayServer 提供文本转语音服务的抽象。

每个平台都使用相应的 API 实现这些功能。

  • Windows 使用 Windows Speech API
  • macOS 使用 AVSpeechSynthesizer
  • Linux 使用 Speech Dispatcher
  • Android 使用 Android TextToSpeech API

来源

扩展平台抽象层

要为新平台添加支持,开发人员需要:

  1. 创建一个继承自 DisplayServer 的新显示服务器实现。
  2. 实现所有必需的虚方法。
  3. 在引擎初始化中注册新实现。

来源

结论

Godot 中的平台抽象层提供了与不同操作系统和平台交互的统一接口。这使得引擎能够在各种环境中一致运行,同时仍然利用可用的平台特定功能。

DisplayServer 类是该系统的核心组件,它定义了所有平台特定实现必须遵守的接口。通过使用此抽象,Godot 可以在广泛的平台上为引擎用户和游戏玩家提供一致的体验。