菜单

高级主题

相关源文件

本页面涵盖了 Dear ImGui 更专业使用的进阶功能和技术。它探讨了超越基本用法的主题,旨在为需要更深入集成、定制或优化的开发者提供指导。有关基本集成的信息,请参考 集成指南,有关多视口支持或性能优化等特定子主题的信息,请分别参阅 多视口支持性能优化

进阶使用的核心概念

Dear ImGui 的架构设计既易于使用,又为高级场景提供了灵活性。本节涵盖了在处理高级功能时必不可少的基础概念。

上下文管理

ImGui 可以维护多个上下文,这对于多线程应用程序或将 ImGui 嵌入多个应用程序很有用。

来源: imgui.h323-330 imgui.cpp76-140

ImGuiIO 结构

ImGuiIO 结构是您的应用程序与 Dear ImGui 之间主要的通信通道。

来源: imgui.h180-181 imgui.h333-334

高级配置选项

Dear ImGui 通过编译时定义和运行时配置提供了广泛的配置选项。

编译时配置

imconfig.h 文件允许您在编译时覆盖 ImGui 的各种行为。

  1. 数学运算符:使用 IMGUI_DEFINE_MATH_OPERATORS 来启用 ImVec2/ImVec4 上的数学运算。
  2. 自定义类型:定义 ImDrawIdx 类型、IM_VEC2_CLASS_EXTRA 等,以与您的自定义类型集成。
  3. 内存分配:覆盖内存分配函数。
  4. 渲染:自定义渲染方面,例如顶点布局。

来源: imgui.h61-65 imconfig.h

运行时配置标志

ImGui 提供了许多配置标志来修改运行时行为。

类别标志示例目的
核心行为ImGuiConfigFlags_NavEnableKeyboard启用键盘导航。
核心行为ImGuiConfigFlags_DockingEnable启用停靠功能。
窗口选项ImGuiWindowFlags_NoScrollbar禁用窗口上的滚动条。
项选项ImGuiItemFlags_ButtonRepeat按住按钮时使其重复触发。
表格选项ImGuiTableFlags_Resizable允许调整表格列的宽度。

来源: imgui.h232-252 imgui_internal.h192-207

处理多个窗口和视口

Dear ImGui 通过停靠和视口支持高级窗口管理。

多视口系统

多视口系统允许 ImGui 窗口存在于主应用程序窗口之外,基本上创建了分离的窗口。

启用多视口支持

  1. 设置 io.ConfigFlags |= ImGuiConfigFlags_ViewportsEnable
  2. 确保您的平台和渲染器后端支持视口。
  3. 在主循环中处理视口更新。

来源: imgui.h200-201 imgui_internal.h179-181

自定义绘图和渲染

ImGui 的渲染系统可以进行定制以满足特定需求。本节介绍如何使用绘图列表和自定义渲染。

使用 ImDrawList

ImDrawList 提供低级绘图图元,您可以使用它们来创建自定义 UI 元素。

自定义绘图示例

  1. 获取当前窗口的绘图列表: ImDrawList* draw_list = ImGui::GetWindowDrawList();
  2. 执行自定义绘图操作: draw_list->AddLine(), draw_list->AddRect() 等。
  3. 自定义渲染管线集成:基于提供的 ImDrawData 实现渲染器。

来源: imgui.h166-169 imgui_draw.cpp20-800

自定义渲染实现

您可以通过处理 ImDrawData 结构来实现自定义渲染器。本示例展示了通用结构。

典型的渲染函数通过迭代命令列表和命令来处理 ImDrawData。

来源: imgui.cpp364-423 imgui_draw.cpp800-1200

错误处理和恢复

ImGui 提供了处理错误和从问题状态恢复的机制。

调试工具

ImGui 包含几个内置的调试工具。

  1. Metrics Window:显示内部指标(ImGui::ShowMetricsWindow())。
  2. Debug Log:记录重要事件(ImGui::ShowDebugLogWindow())。
  3. ID Stack Tool:帮助调试 ID 相关问题(ImGui::ShowIDStackToolWindow())。

来源: imgui.h343-346 imgui_demo.cpp100-130

错误恢复

ImGui 有一个用于从错误中恢复的系统,例如不匹配的 Begin/End 调用。

错误恢复系统对于调试复杂的 UI 代码特别有用,因为它可以防止崩溃并提供信息丰富的错误消息。

来源: imgui_internal.h237-246 imgui_tables.cpp33-71

高级输入处理

Dear ImGui 为高级 UI 提供了复杂的输入处理功能。

自定义输入处理

您可以通过直接操作 ImGuiIO 或实现自定义回调来扩展 ImGui 的输入处理。

  1. 自定义按键映射:将您自己的按键代码映射到 ImGuiKey 值。
  2. 输入文本回调:使用 ImGuiInputTextCallback 通过自定义逻辑处理输入。
  3. 自定义鼠标输入:实现超越标准输入的特殊鼠标行为。

来源: imgui.h270-273 imgui_widgets.cpp137-140

多选支持

ImGui 提供了一个多选 API,用于实现复杂的选择行为。

多选系统可以通过以下方式使用:

  1. 调用 BeginMultiSelect()/EndMultiSelect()
  2. 通过 ImGuiMultiSelectIO 处理选择请求
  3. 在您的应用程序中处理选择更改

来源: imgui.h185-187 imgui.h189-192 imgui_widgets.cpp23-25

内存管理和优化

Dear ImGui 的设计旨在实现内存高效,但高级用法需要理解其内存模式。

内存分配模式

ImGui 的内存分配策略旨在最小化帧渲染期间的分配

关键内存优化策略

  1. 内存池分配器:ImGui 对频繁使用的结构体使用内存池分配器
  2. 对象回收:窗口、控件和绘图列表在帧之间进行回收
  3. 内存增长:缓冲区以几何级数增长以最小化重新分配

来源: imgui.cpp214-221 imgui_internal.h353-358

性能考量

对于高性能应用程序,请考虑以下优化技术

  1. 粗粒度裁剪:避免渲染屏幕外的 UI 元素
  2. 合并绘图命令:通过合并兼容的命令来减少绘图调用
  3. 纹理图集:为所有 UI 元素使用单个纹理图集
  4. 最小化样式更改:对具有相似样式的控件进行分组以减少状态更改

来源: imgui_draw.cpp41-51 imgui_tables.cpp133-141

资源管理

高级 ImGui 用法通常涉及管理字体和纹理等资源。

字体管理

ImGui 的字体系统支持复杂的多样化文本渲染功能

高级字体用法包括

  1. 多种字体大小:以不同大小加载同一字体
  2. 字体合并:将多个字体合并到一个(例如,添加图标集)
  3. 自定义字形范围:支持特定 Unicode 范围以显示国际文本
  4. FreeType 集成:使用 FreeType 改进字体渲染(ImGuiFreeType

来源: imgui.h170-175 imgui_draw.cpp3000-4000

自定义资源管理

对于高级应用程序,您可能需要与 ImGui 一起管理自定义资源

  1. 自定义纹理:加载和管理供 ImGui 小部件使用的纹理
  2. 后端资源:管理特定于后端的资源(例如 D3D/OpenGL)
  3. 资源共享:在多个上下文之间共享资源

来源: imgui.h307-314

与外部系统交互

与自定义系统集成

ImGui 可以集成到标准后端以外的自定义系统中

  1. 自定义事件系统:将 ImGui 连接到专有事件处理
  2. 自定义渲染管线:将 ImGui 集成到专业渲染系统中
  3. 自定义序列化:以自定义格式保存/加载 ImGui 状态

来源: imgui.cpp257-294

结论

本页介绍了 Dear ImGui 的高级主题和技术,重点关注超越基本用法的领域。理解这些概念能够使 ImGui 在复杂应用程序中实现更深层次的集成和自定义。

有关各个高级主题的更具体信息,请参阅关于多视口支持性能优化的专用页面。