- ImGui (Dear ImGui) 是一个用于 C++ 的小型即时模式 GUI 库。
- 它从函数调用中每帧重新绘制菜单,无需维护任何小部件树。
- 原生客户端和工具选择它来在 3D 场景上实现低延迟的叠加层。
- 这是一个 C++ 模式;Java Fabric 模组使用游戏自身的 GUI 钩子.
ImGui,即 Dear ImGui 的缩写,是一个为 C++ 设计的小型即时模式 GUI 库。它从纯粹的函数调用中每帧绘制一个全新的菜单,而不是保留一个包含小部件对象的树结构。这使得它连接起来非常快速,并且易于叠加在游戏现有的渲染循环之上,这也是为什么工具和原生客户端使用它来实现低延迟的覆盖层.
何謂即時模式
ImGui 在每一幀重新構建介面。你不會創建一個按鈕物件並儲存它。你呼叫一個函數,指示「在這裡繪製一個按鈕」,這個呼叫既繪製按鈕,又告訴你本幀是否被點擊。
保留模式工具包則相反。它在記憶體中維護一個長壽命的元件樹,當狀態改變時,你更新這個樹。即時模式捨棄了這種持久的結構,換取了從上到下讀取並與你自己的狀態並排存在的程式碼。
為什麼工具和客戶端選擇它
ImGui 廣泛用於覆蓋 3D 畫面的菜單。原因很實際。
- 低延遲: 它連接到程式已經渲染的畫框,因此菜單會立即反應。
- 簡潔集成: 一個視窗和幾個控制項只需要少量的函數呼叫。沒有佈局檔案,也沒有需要管理的單獨 UI 執行緒。
- 獨立性: 該函式庫的依賴性很少,並且可以整合到常見的圖形後端,因此不會引入大型框架。
- 方便調試: 用於構建發布版菜單的呼叫,也可以用於構建開發者在構建功能時使用的臨時調試面板。
即時模式與保留模式
| 方面 | 即时模式 (ImGui) | 保留模式工具包 |
|---|---|---|
| 状态所有权 | 你的代码持有数据 | 工具包持有小部件树 |
| 每帧工作 | 每帧重建 UI | 更改时更新树 |
| 设置成本 | 几个函数调用 | 更多预先结构 |
| 最佳适用性 | 重叠、工具、游戏菜单 | 大型文档式应用程序 |
如何与原生客户端配合
一个用 C++ 构建的原生实用程序客户端通常在游戏的帧上使用 ImGui 绘制其菜单。菜单代码在渲染循环中运行,读取客户端自己的设置,并直接将更改写回。没有单独的 UI 进程,因此切换功能只需对客户端已经拥有的值进行一次函数调用。
这是一个 C++ 模式。一个用 Java 编写的 Fabric 模组通过游戏的 GUI 钩子访问其界面,因此 ImGui 主要出现在作为原生代码交付的客户端中,而不是作为 Java 模组。
常见问题解答
核心库是用 C++ 编写的,大多数项目也使用 C++。虽然社区提供了其他语言的绑定,但最初和最常见的用法是在 C++ 游戏工具和原生应用程序中。
默认情况下,它呈现出朴素的开发者工具外观。如果项目需要自定义样式主题,或者在其之上绘制自己的小部件,那么最终发布的菜单可能与默认外观完全不同。
通常情况下不行。Fabric 模组运行在 Java 环境中,并使用游戏的 GUI 系统。原生 C++ 客户端通常是 ImGui 的宿主环境。
不是的。重建 UI 的成本很低,程序本来就要每帧进行渲染,所以菜单会顺带完成正在进行的工作。