本页面涵盖了 Dear ImGui 更专业使用的进阶功能和技术。它探讨了超越基本用法的主题,旨在为需要更深入集成、定制或优化的开发者提供指导。有关基本集成的信息,请参考 集成指南,有关多视口支持或性能优化等特定子主题的信息,请分别参阅 多视口支持 和 性能优化。
Dear ImGui 的架构设计既易于使用,又为高级场景提供了灵活性。本节涵盖了在处理高级功能时必不可少的基础概念。
ImGui 可以维护多个上下文,这对于多线程应用程序或将 ImGui 嵌入多个应用程序很有用。
来源: imgui.h323-330 imgui.cpp76-140
ImGuiIO 结构是您的应用程序与 Dear ImGui 之间主要的通信通道。
来源: imgui.h180-181 imgui.h333-334
Dear ImGui 通过编译时定义和运行时配置提供了广泛的配置选项。
imconfig.h 文件允许您在编译时覆盖 ImGui 的各种行为。
IMGUI_DEFINE_MATH_OPERATORS 来启用 ImVec2/ImVec4 上的数学运算。ImDrawIdx 类型、IM_VEC2_CLASS_EXTRA 等,以与您的自定义类型集成。ImGui 提供了许多配置标志来修改运行时行为。
| 类别 | 标志示例 | 目的 |
|---|---|---|
| 核心行为 | ImGuiConfigFlags_NavEnableKeyboard | 启用键盘导航。 |
| 核心行为 | ImGuiConfigFlags_DockingEnable | 启用停靠功能。 |
| 窗口选项 | ImGuiWindowFlags_NoScrollbar | 禁用窗口上的滚动条。 |
| 项选项 | ImGuiItemFlags_ButtonRepeat | 按住按钮时使其重复触发。 |
| 表格选项 | ImGuiTableFlags_Resizable | 允许调整表格列的宽度。 |
来源: imgui.h232-252 imgui_internal.h192-207
Dear ImGui 通过停靠和视口支持高级窗口管理。
多视口系统允许 ImGui 窗口存在于主应用程序窗口之外,基本上创建了分离的窗口。
启用多视口支持
io.ConfigFlags |= ImGuiConfigFlags_ViewportsEnable来源: imgui.h200-201 imgui_internal.h179-181
ImGui 的渲染系统可以进行定制以满足特定需求。本节介绍如何使用绘图列表和自定义渲染。
ImDrawList 提供低级绘图图元,您可以使用它们来创建自定义 UI 元素。
自定义绘图示例
ImDrawList* draw_list = ImGui::GetWindowDrawList();draw_list->AddLine(), draw_list->AddRect() 等。来源: imgui.h166-169 imgui_draw.cpp20-800
您可以通过处理 ImDrawData 结构来实现自定义渲染器。本示例展示了通用结构。
典型的渲染函数通过迭代命令列表和命令来处理 ImDrawData。
来源: imgui.cpp364-423 imgui_draw.cpp800-1200
ImGui 提供了处理错误和从问题状态恢复的机制。
ImGui 包含几个内置的调试工具。
ImGui::ShowMetricsWindow())。ImGui::ShowDebugLogWindow())。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 的输入处理。
ImGuiInputTextCallback 通过自定义逻辑处理输入。来源: imgui.h270-273 imgui_widgets.cpp137-140
ImGui 提供了一个多选 API,用于实现复杂的选择行为。
多选系统可以通过以下方式使用:
BeginMultiSelect()/EndMultiSelect()。ImGuiMultiSelectIO 处理选择请求来源: imgui.h185-187 imgui.h189-192 imgui_widgets.cpp23-25
Dear ImGui 的设计旨在实现内存高效,但高级用法需要理解其内存模式。
ImGui 的内存分配策略旨在最小化帧渲染期间的分配
关键内存优化策略
来源: imgui.cpp214-221 imgui_internal.h353-358
对于高性能应用程序,请考虑以下优化技术
来源: imgui_draw.cpp41-51 imgui_tables.cpp133-141
高级 ImGui 用法通常涉及管理字体和纹理等资源。
ImGui 的字体系统支持复杂的多样化文本渲染功能
高级字体用法包括
ImGuiFreeType)来源: imgui.h170-175 imgui_draw.cpp3000-4000
对于高级应用程序,您可能需要与 ImGui 一起管理自定义资源
来源: imgui.h307-314
ImGui 可以集成到标准后端以外的自定义系统中
来源: imgui.cpp257-294
本页介绍了 Dear ImGui 的高级主题和技术,重点关注超越基本用法的领域。理解这些概念能够使 ImGui 在复杂应用程序中实现更深层次的集成和自定义。