Learn · concepts
ImGui 是什么?关于 Dear ImGui 的讲解
ImGui(Dear ImGui)是一个为 C++ 设计的即时模式 GUI 库。它每帧绘制菜单,不保留任何小部件树,这在游戏工具和原生客户端中很常见.
什么是 ImGui?
ImGui,即 Dear ImGui 的缩写,是一个为 C++ 设计的小型即时模式 GUI 库。它从纯粹的函数调用中每帧绘制一个新鲜的菜单,而不是保留一个包含小部件对象的树。这使得它快速连接且易于叠加在游戏现有的渲染循环之上,这也是为什么工具和原生客户端使用它来实现低延迟的覆盖。
关键的洞察在于“即时模式”:与其创建 Button 对象并将其存储,不如调用一个函数,该函数指示“在此处绘制一个按钮”,并且该调用既绘制按钮,又告诉你本帧是否被点击了。
即时模式意味着什么
ImGui 在每一帧都重建界面。你不会创建一个按钮对象并将其存储。你调用一个函数,该函数指示“在此处绘制一个按钮”,并且该调用既绘制按钮,又告诉你本帧是否被点击了。
一种保留模式工具包则相反。它在内存中维护一个长期的部件树,并在状态更改时更新该树。即时模式用读取自上而下的代码和靠近你自己的状态来代替这种持久结构.
应用程序运行帧循环
游戏渲染一帧,并在其中调用 UI 代码.
UI 代码运行
你调用 ImGui 函数从上到下构建菜单:按钮、滑块、复选框.
ImGui 绘制并响应
这两个函数既渲染小部件,又返回它们是否与该框架进行了交互.
你的代码会响应
你读取返回值并更新你自己的状态,就像在这一帧点击按钮时调用
do_thing()一样.
人们为何选择它
ImGui 非常适合叠加在 3D 场景中的菜单。原因如下:
- 低延迟: 它钩入程序已经渲染的帧,因此菜单能够立即响应。
- 代码量少: 一个窗口和几个控件只需要少量函数调用。没有布局文件,也不需要单独的 UI 线程来管理。
- 自包含: 该库依赖项很少,并且可以与常见的图形后端集成,因此不会引入大型框架。
- 便于调试: 构建发布菜单的相同调用,也可以构建开发者在构建功能时使用的临时调试面板
立即模式与保留模式
| 方面 | 即时模式 (ImGui) | 保留模式工具包 |
|---|---|---|
| 状态拥有 | 你的代码持有数据 | 工具包持有控件树 |
| 每帧工作量 | 每帧重建 UI | 更改时更新树 |
| 设置成本 | 少数函数调用 | 更多预先结构 |
| 适用场景 | 覆盖层、工具、游戏菜单 | 大型文档式应用程序 |
即时模式非常适合需要每帧更新并立即响应输入的内容。保留模式更适合主要保持静态且更改不频繁的内容
如何满足母语客户的需求
通常,使用 C++ 构建的原生实用工具客户端会在游戏帧上使用 ImGui 绘制其菜单。菜单代码在渲染循环中运行,读取客户端自身的设置,并直接将更改写回。没有单独的 UI 进程,因此切换一项功能只需对客户端已经拥有的一个值进行一次函数调用。
这是一种 C++ 模式。用 Java 编写的 Fabric 模组会通过游戏的 GUI 钩子来访问其界面,因此 ImGui 主要出现在作为原生代码交付的客户端中,而不是作为 Java 模组.
常见问题
核心库是 C++,大多数项目也使用它。虽然其他语言存在社区提供的绑定,但原始且最常见的用法仍然是 C++ 游戏工具.
默认情况下,它呈现出一种朴素的开发者工具外观。如果项目需要自定义样式主题,或者在其之上绘制自己的控件,则需要对其进行大量修改.
非寻常的方式。Fabric 模组在 Java 中运行,并使用游戏的 GUI 系统。ImGui 通常运行在本地的 C++ 客户端中.
不。重建用户界面成本不高,而且程序已经渲染每一帧,所以菜单会顺带运行正在进行的工作.