菜单

平台后端

相关源文件

平台后端提供了 Dear ImGui 与各种窗口/输入系统之间的接口。它们处理平台特定的方面,如输入事件(鼠标、键盘、触摸、游戏手柄)、窗口管理、剪贴板支持等。本页面重点介绍 Dear ImGui 中平台后端的设计、实现和使用。有关处理图形API集成的渲染器后端的信息,请参阅渲染器后端

概述与目的

平台后端负责

  1. 使用平台特定资源初始化 Dear ImGui
  2. 从底层平台捕获输入事件并将其馈送给 ImGui
  3. 管理平台特定功能(剪贴板、鼠标光标、IME等)
  4. 提供每帧时间信息
  5. 在关闭时清理资源

Dear ImGui 需要平台后端和渲染器后端才能在应用程序中正常运行。平台后端处理窗口/输入管理,而渲染器后端将 ImGui 绘图命令转换为图形API调用。

来源:backends/imgui_impl_glfw.cpp1-23 backends/imgui_impl_sdl3.cpp1-20 backends/imgui_impl_win32.cpp1-18

架构

后端接口模式

所有平台后端都遵循一致的接口模式

来源:backends/imgui_impl_glfw.cpp587-648 backends/imgui_impl_sdl3.cpp459-532 backends/imgui_impl_win32.cpp154-206

后端数据存储

每个后端都在 ImGui 上下文中维护一个状态结构

这种设计允许

  • 多个 ImGui 上下文使用相同的后端代码但具有不同的状态
  • 平台特定代码与 ImGui 核心之间清晰分离
  • 在整个后端轻松访问平台特定数据

来源:150-190 96-131 backends/imgui_impl_win32.cpp108-141

集成工作流程

要将平台后端集成到您的应用程序中,请遵循以下步骤

来源:backends/imgui_impl_glfw.cpp587-648 backends/imgui_impl_sdl2.cpp459-532 backends/imgui_impl_win32.cpp154-206

可用的平台后端

Dear ImGui 为各种窗口系统提供了平台后端

后端文件描述主要功能
GLFWimgui_impl_glfw.h/cpp使用 GLFW 库的跨平台支持鼠标、键盘、游戏手柄、剪贴板、光标
SDL2imgui_impl_sdl2.h/cpp使用 SDL2 库的跨平台支持鼠标、键盘、游戏手柄、剪贴板、光标、IME
SDL3imgui_impl_sdl3.h/cpp使用 SDL3 库的跨平台支持鼠标、键盘、游戏手柄、剪贴板、光标、IME
Win32imgui_impl_win32.h/cpp原生 Windows API鼠标、键盘、游戏手柄、光标、DPI感知
OSXimgui_impl_osx.h/mm原生 macOS/Cocoa API鼠标、键盘、游戏手柄、剪贴板、光标、IME
Androidimgui_impl_android.h/cpp原生 Android API触摸、键盘
Allegro5imgui_impl_allegro5.h/cpp使用 Allegro5 的跨平台支持鼠标、键盘、剪贴板、光标
GLUTimgui_impl_glut.h/cpp使用 GLUT 的旧版跨平台支持基本的键盘和鼠标(有限)

来源:提供的仓库中所有后端头文件。

输入处理系统

输入事件映射

平台后端将平台特定的输入事件转换为 ImGui 的统一输入系统

来源:backends/imgui_impl_glfw.cpp195-322 backends/imgui_impl_sdl3.cpp172-322 backends/imgui_impl_win32.cpp425-486

输入源跟踪

现代后端跟踪输入源以区分鼠标、触摸屏和笔输入

来源:backends/imgui_impl_sdl3.cpp353-361 backends/imgui_impl_win32.cpp499-525

平台特定功能

剪贴板支持

大多数后端通过平台 API 实现剪贴板支持

来源:backends/imgui_impl_sdl3.cpp134-146 backends/imgui_impl_glfw.cpp604-611

鼠标光标支持

支持鼠标光标的后端创建平台特定的光标对象

在每一帧期间,后端检查光标是否应该更新

来源:backends/imgui_impl_glfw.cpp622-637 backends/imgui_impl_sdl3.cpp500-510 backends/imgui_impl_win32.cpp237-268

IME支持

一些后端支持输入法编辑器 (IME),用于需要复杂文本输入的语言

来源:backends/imgui_impl_sdl3.cpp148-169 backends/imgui_impl_osx.mm137-169

回调系统

许多后端使用回调系统来拦截平台事件

后端通常提供以下选项:

  1. 在初始化期间自动安装回调
  2. 允许手动安装回调
  3. 将回调链接到先前安装的应用程序回调

来源:backends/imgui_impl_glfw.cpp527-567 backends/imgui_impl_glfw.cpp403-420

后端选择指南

为您的应用程序选择平台后端时,请考虑:

  1. 现有框架:如果您的应用程序已经使用了 GLFW 或 SDL 等框架,请选择匹配的后端
  2. 平台要求:对于平台特定功能,原生后端(Win32、OSX)提供更多功能
  3. 多平台支持:跨平台后端(GLFW、SDL)在不同操作系统上提供一致的行为
  4. 功能需求:查看功能矩阵,确保后端支持您需要的功能(游戏手柄、IME等)

最常用的后端是

  • GLFW:非常适合 OpenGL/Vulkan 应用程序,具有良好的跨平台支持
  • SDL2/SDL3:功能齐全的跨平台支持,具有良好的输入处理
  • Win32:适用于直接使用 Win32 API 的 Windows 特定应用程序
  • OSX/Cocoa:适用于 macOS 特定应用程序

来源:提供的仓库中所有后端头文件。

最佳实践

  1. 一个上下文,多个窗口:强烈建议使用具有多视口支持的单个 Dear ImGui 上下文,而不是多个上下文
  2. 只初始化一次:在应用程序启动时只初始化后端一次,并在退出时关闭
  3. 事件顺序:在开始新的 ImGui 帧之前处理平台事件
  4. 避免修改:在可能的情况下,在您的项目中使用未修改的 imgui_impl_* 文件
  5. 回调链:使用回调系统时,请注意回调链,并确保您的应用程序正确处理窗口标识符

来源:backends/imgui_impl_glfw.cpp180-186 backends/imgui_impl_sdl3.cpp125-127

常见陷阱

  1. 缺失上下文:在没有有效 ImGui 上下文的情况下访问后端函数
  2. 输入事件重复:多次馈送相同的输入事件
  3. 回调冲突:覆盖平台回调而未正确链接到之前的回调
  4. 资源泄漏:未调用 Shutdown() 来释放平台资源
  5. 多上下文问题:使用多个 ImGui 上下文,而后端未为此设计

来源:所有后端实现中的注释。