本页面详细介绍了 Dear ImGui 的内部架构,解释了其核心组件、执行流程和基本概念。我们将探讨库的组织方式、主要数据结构以及组件之间的交互模式。
有关与平台和图形 API 集成的信息,请参阅后端系统。有关小部件和界面元素的信息,请参阅小部件系统。
Dear ImGui 的设计围绕“即时模式”(immediate mode)用户界面范例,其中 UI 在每一帧都从头开始重建。这与维护持久 UI 对象的“保留模式”(retained mode)库形成对比。这种设计选择影响了架构的各个方面,优先考虑简洁性、最小化的状态重复和直接操作。
来源:imgui.h147-201 imgui.cpp102-125
ImGui 库的状态集中在 ImGuiContext 结构体中。一个上下文封装了 Dear ImGui 实例的全部状态,允许潜在的多上下文应用(尽管大多数应用使用单个上下文)。
ImGuiContext 是包含以下内容的中心数据结构:
创建和管理上下文
来源:imgui.h179 imgui.h326-330 imgui_internal.h1145-1185
ImGuiIO 结构体负责管理您的应用程序与 Dear ImGui 之间的通信
来源:imgui.h180-181 imgui.h333-334 imgui.cpp472-500
Dear ImGui 中的每一帧都遵循特定的操作顺序,将用户输入转换为可见的 UI。
来源:imgui.cpp273-307 imgui.cpp354-405 imgui.h335-339
来源:imgui.cpp79-98 imgui.h370-371
窗口是 Dear ImGui 中 UI 元素的基本容器。每个窗口都有其位置、大小、内容、绘图上下文和状态。
窗口可以拥有子窗口,形成一个层级结构
来源:imgui.h359-371 imgui.h391-393 imgui_internal.h1182-1185
ImGui 不直接渲染到屏幕,而是生成供应用程序执行的渲染命令。
渲染系统围绕以下内容构建:
来源:imgui.h162-169 imgui.h338-339 imgui_draw.cpp24-33
Dear ImGui 使用分层 ID 系统来唯一跟踪和标识 UI 元素
ID 由以下方式生成:
此系统对于正确跟踪交互状态(例如,哪个按钮被点击)以及在帧之间保留状态至关重要。
来源:imgui.cpp79-81 imgui_internal.h1145-1150
Dear ImGui 包括一个字体系统,允许加载和渲染 TrueType 字体
字体系统处理:
来源:imgui.h170-176 imgui_draw.cpp14-23
ImGui元素的样式由ImGuiStyle结构控制
风格系统提供:
来源:imgui.h195-196 imgui.h353-356 imgui_draw.cpp182-226
典型的ImGui应用程序中的执行流程遵循以下模式:
来源:imgui.cpp273-307 imgui.cpp80-98
Dear ImGui 的内存管理旨在最大限度地减少正常运行期间的内存分配。
来源:imgui.h271-273 imgui_internal.h346-359
Dear ImGui 提供了多种方式来配置和定制库。
这种多层方法提供了灵活性,同时保持了库的核心简洁性。
来源:imgui.h60-65 imgui.cpp241-254
Dear ImGui 的核心架构体现了其设计理念:
这种架构使 Dear ImGui 既轻量又强大,适用于从简单工具到复杂调试界面的各种应用程序。