本页面解释了 Dear ImGui 的多视口支持功能,该功能允许创建和管理多个平台窗口(视口)。多视口支持实现了诸如分离式窗口和浮动工具窗口等功能,这些窗口可以移动到主应用程序窗口之外,类似于许多专业应用程序。
有关基本窗口管理(在单个视口内)的信息,请参阅窗口和布局系统。
多视口支持将 Dear ImGui 的功能扩展到其传统的单窗口渲染范式之外,允许窗口从主视口中分离。此功能实现了
来源:imgui.cpp7-100 imgui_internal.h1-50
多视口支持建立在两部分架构上
来源:imgui.h180-201 imgui_internal.h170-205
多视口系统依赖于几个关键结构
表示单个平台窗口并包含
包含平台后端必须实现以支持多视口功能的函数指针,包括
来源:imgui.h150-250 imgui_internal.h179-185
要启用多视口支持,您需要
ImGuiIO 中设置 ImGuiConfigFlags_ViewportsEnable 标志此外,您可以控制其他视口行为
ImGuiConfigFlags_ViewportsNoTaskBarIcons: 防止为辅助视口创建任务栏图标ImGuiConfigFlags_ViewportsNoMerge: 防止视口自动合并ImGuiConfigFlags_ViewportsNoAutoMerge: 禁用靠近时视口的自动合并来源:imgui.cpp275-285 imgui.h232-233
并非所有平台和渲染器后端都完全支持多视口功能。下图显示了当前的支持状态
来源:backends/imgui_impl_vulkan.cpp94-110 backends/imgui_impl_opengl3.cpp9-21 backends/imgui_impl_dx12.cpp6-8
当启用多视口支持时,每帧的操作流程为
来源:imgui.cpp5000-5200 backends/imgui_impl_vulkan.cpp300-350
启用多视口后,Dear ImGui 窗口可以从主视口中分离
ImGuiWindowFlags_ViewportWindow 标志的窗口可以被分离此过程由 ImGui 自动处理,包括
当窗口被分离时,ImGui
ImGuiViewport 实例Platform_CreateWindow 函数ImGuiContext 中的视口列表输入事件需要路由到正确的视口
使用多视口渲染遵循以下步骤
平台和渲染器后端协同工作以完成此过程
来源:imgui_internal.h190-200 backends/imgui_impl_dx11.cpp250-300 backends/imgui_impl_vulkan.cpp350-400
在 Windows 平台上,多视口通过原生 Win32 窗口实现。
主要注意事项
在 Apple 平台上,多视口通过 NSWindow/UIWindow 实现。
主要注意事项
在 Linux 上或使用 SDL/GLFW 时
来源:backends/imgui_impl_win32.cpp backends/imgui_impl_metal.mm backends/imgui_impl_sdl2.cpp
多视口支持会带来一些性能开销
| 领域 | 影响 | 缓解 |
|---|---|---|
| 内存 | 每个视口都需要自己的渲染资源 | 限制分离窗口的数量 |
| CPU | 额外的绘制调用和状态管理 | 考虑批处理操作 |
| 显卡 | 多个帧缓冲区和渲染目标 | 尽可能使用共享资源 |
| 输入 | 跨视口的输入事件路由 | 后端高效事件处理 |
以下是启用和使用多视口的基本示例
多视口支持的常见问题包括
ImGui 提供了一些调试工具
多视口系统的当前限制
Dear ImGui 中的多视口支持提供了一种强大的方式,通过可分离的窗口创建更复杂的 UI 布局。启用此功能后,用户可以创建浮动工具窗口、多显示器界面以及类似专业应用程序的布局。
虽然实现需要一些额外的配置和考量,但该系统旨在支持的平台和图形 API 之间无缝工作,同时保持 Dear ImGui 以其简洁和即时性而闻名的特点。