引言有句话说得好“给某人一个状态某天他们就会遇到一个 bug但要是教会他们如何在两个必须保持同步的独立位置表示状态那他们这辈子都有 bug 可遇了” ——ryg这个库采用免费且宽松的许可协议但需要资金支持以持续改进。除了维护和稳定性还有许多实用特性等待添加。如果贵公司正在使用 Dear ImGui请考虑提供支持。企业可通过开具发票的赞助/支持合同来支持其持续开发和维护邮箱contact dearimgui dot com个人可在此支持其持续开发和维护也可查看资助页面。介绍概述Dear ImGui 是一个轻量级的 C 图形用户界面库。它能输出优化后的顶点缓冲区可在支持 3D 渲染管线的应用程序中随时渲染。该库具有快速、可移植、渲染器无关且自包含无外部依赖的特点。设计目标旨在实现快速迭代助力程序员创建内容创作工具以及可视化/调试工具而非面向普通终端用户的 UI。为达成此目标它注重简单性和生产力因此缺少一些高级库常见的功能例如不支持全面的国际化如从右到左的文本、双向文本、文本塑形等和无障碍功能。适用场景特别适合集成到游戏引擎用于开发工具、实时 3D 应用程序、全屏应用程序、嵌入式应用程序或任何操作系统功能非标准的控制台平台应用程序。优势特点减少状态同步降低用户端与 UI 相关的状态存储。简化设置和维护工作。易于创建动态 UI能反映动态数据集。便于创建代码驱动和数据驱动的工具。可轻松创建临时工具和长期使用的复杂工具。易于修改和改进。具有可移植性依赖少能在目标设备如控制台、手机等上运行。运行时和内存消耗高效。经过实战检验被游戏行业众多主要参与者使用。使用方法核心文件Dear ImGui 的核心包含在几个与平台无关的文件中可轻松编译到应用程序/引擎里。这些文件位于仓库的根文件夹imgui*.cpp, imgui*.h无需特定的构建过程可直接添加到现有项目。后端支持backends/ 文件夹提供了多种图形 API 和渲染平台的后端examples/ 文件夹中有示例应用程序也可自行创建后端。只要能渲染带纹理的三角形就能渲染 Dear ImGui。C20 用户若想使用模块可使用 stripe2933/imgui - module 第三方扩展。代码示例在应用程序中设置好 Dear ImGui 后可在程序循环的任何位置使用示例代码如下ImGui::Text(Hello, world %d, 123);if (ImGui::Button(Save)) MySaveFunction();ImGui::InputText(string, buf, IM_COUNTOF(buf));ImGui::SliderFloat(float, f, 0.0f, 1.0f);// 创建一个带菜单栏的窗口ImGui::Begin(My First Tool, my_tool_active, ImGuiWindowFlags_MenuBar);if (ImGui::BeginMenuBar()) { if (ImGui::BeginMenu(File)) { if (ImGui::MenuItem(Open.., CtrlO)) { /* 执行操作 */ } if (ImGui::MenuItem(Save, CtrlS)) { /* 执行操作 */ } if (ImGui::MenuItem(Close, CtrlW)) { my_tool_active false; } ImGui::EndMenu(); } ImGui::EndMenuBar();}// 编辑存储为 4 个浮点数的颜色ImGui::ColorEdit4(Color, my_color);// 生成样本并绘制float samples[100];for (int n 0; n 100; n) samples[n] sinf(n * 0.2f ImGui::GetTime() * 1.5f);ImGui::PlotLines(Samples, samples, 100);// 在滚动区域显示内容ImGui::TextColored(ImVec4(1,1,0,1), Important Stuff);ImGui::BeginChild(Scrolling);for (int n 0; n 50; n) ImGui::Text(%04d: Some text, n);ImGui::EndChild();ImGui::End();Dear ImGui 既能创建复杂工具也能创建临时工具。借助现代编译器的 EditContinue热代码重载功能可在应用程序运行时添加一些小部件来调整变量一分钟后再移除代码。它不仅可用于调整值还能通过输出文本命令跟踪运行中的算法结合自身反射数据实时浏览数据集暴露引擎子系统的内部信息创建日志记录器、检查工具、性能分析器、调试器甚至整个游戏制作编辑器/框架等。工作原理IMGUI 范式通过其 API 尽量减少多余的状态复制、状态同步和用户端的状态保留。与传统的保留模式界面相比它出错的可能性更小代码更少bug 也更少适合创建动态用户界面。更多详情可查看 Wiki 的 “About the IMGUI paradigm” 部分。渲染机制Dear ImGui 输出顶点缓冲区和命令列表可在应用程序中轻松渲染渲染所需的绘制调用和状态更改数量较少。由于它不直接了解或操作图形状态可在代码的任何位置调用其函数如在运行中的算法中间或自己的渲染过程中间。可参考 examples/ 文件夹中的示例应用程序了解如何将 Dear ImGui 集成到现有代码库。需要注意的是不要将即时模式 GUI 误解为即时模式渲染后者通常意味着在调用 GUI 函数时会向驱动程序/GPU 发送大量低效的绘制调用和状态更改而 Dear ImGui 输出顶点缓冲区和少量绘制调用批次从不直接操作 GPU绘制调用批次经过优化可在应用程序中稍后渲染甚至远程渲染。版本发布与更新日志可查看发布页面获取详细的更新日志。阅读更新日志有助于及时了解 Dear ImGui 的新特性说不定还能让你发现之前忽略的功能。演示调用 ImGui::ShowDemoWindow() 函数会创建一个演示窗口展示各种功能和示例代码可在 imgui_demo.cpp 中查看。imgui_explorer 是带有源代码浏览器的 Web 版演示由 pthom 提供。应能从源代码构建示例如果遇到问题请告知。若想快速了解 Dear ImGui 的一些功能可在此下载 Windows 版演示应用程序的二进制文件imgui - demo - binaries - 20260225.zipWindows1.92.62026/02/25 构建master 分支或旧版本二进制文件。示例展示使用 Dear ImGui 的示例项目有 Tracy性能分析器、ImHex十六进制编辑器/数据分析工具、RemedyBG调试器等数百个项目。更多用户提交的使用 Dear ImGui 的项目截图可查看示例展示线程。第三方小部件和扩展列表可查看 “有用扩展/小部件” Wiki 页面。快速上手与集成详细信息可查看快速上手指南。在大多数平台上使用 C 时可直接使用 imgui_impl_xxxx 后端如 imgui_impl_win32.cpp imgui_impl_dx11.cpp。如果引擎支持多平台可考虑使用更多 imgui_impl_xxxx 文件而非重写这样工作量更小能让 Dear ImGui 立即运行。之后若有需要可使用自定义引擎函数重写自定义后端。将 Dear ImGui 集成到自定义引擎主要需完成以下几点连接鼠标/键盘/游戏手柄输入。将纹理上传到 GPU/渲染引擎。提供一个能创建/更新纹理并渲染带纹理三角形的渲染函数这正是后端所做的工作。examples/ 文件夹中有设置窗口并使用标准后端的应用程序示例快速上手指南中有使用标准后端将 imgui 集成到现有应用程序的说明。理论上在已链接支持库的现有代码库中集成 Dear ImGui 耗时不到一小时仔细阅读指南的话时间会更短。后端指南解释了后端的工作原理并提供了实现自定义后端的说明也可参考约 20 个后端的源代码了解其工作方式。总之要花时间阅读常见问题解答、注释和示例应用程序。官方维护的后端渲染器DirectX9、DirectX10、DirectX11、DirectX12、Metal 3/4、OpenGL/ES/ES2、SDL_GPU、SDL_Renderer2/3、Vulkan、WebGPU。平台GLFW、SDL2/SDL3、Win32、Glut、OSX、Android。框架Allegro5、Emscripten。第三方后端/绑定支持的语言包括 C、C# 以及 Beef、ChaiScript、CovScript、Crystal、D、Go、Haskell、Haxe/hxcpp、Java、JavaScript、Julia、Kotlin、Lobster、Lua、Nim、Odin、Pascal、PureBasic、Python、ReaScript、Ruby、Rust、Swift、Zig 等支持的框架有 AGS/Adventure Game Studio、Amethyst、Blender、bsf、Cinder、Cocos2d - x、Defold、Diligent Engine、Ebiten、Flexium、GML/Game Maker Studio、GLEQ、Godot、GTK3、Irrlicht Engine、JUCE、LÖVELUA、Mach Engine、Magnum、Marmalade、Monogame、NanoRT、nCine、Nim Game Lib、Nintendo 3DS/Switch/WiiU自制系统、Ogre、openFrameworks、OSG/OpenSceneGraph、Orx、Photoshop、px_render、Qt/QtDirect3D、raylib、SFML、Sokol、Unity、Unreal Engine 4/5、UWP、vtk、VulkanHpp、VulkanSceneGraph、Win32 GDI、WxWidgets。许多绑定是自动生成的通过旧的 cimgui 或新的 dear_bindings可使用其元数据输出为其他语言生成绑定。有用的扩展/小部件包括自动化/测试、文本编辑器、节点编辑器、时间线编辑器、绘图、软件渲染器、远程网络访问、内存编辑器、小工具等。值得注意且支持良好的扩展有 ImPlot、ImPlot3d 和 Dear ImGui Test Engine更多链接和想法可查看 Wiki。支持与常见问题解答常见问题解答可查看 “Frequently Asked Questions (FAQ)”。快速上手和 Wiki 页面有许多链接、参考资料和文章。可阅读 “Articles about the IMGUI paradigm” 了解即时模式 GUI 范式。查看 “Upcoming Changes” 了解即将到来的更改。可使用 “Dear ImGui Test Engine Test Suite” 进行自动化和测试。为方便搜索引擎抓取 Wiki这里提供可抓取的 Wiki 链接不适合人类阅读原因在此说明。新手入门首次使用遇到编译/链接/运行问题或加载字体问题可使用 GitHub 讨论区。其他问题、错误报告、请求、反馈等请在 GitHub Issues 上发布请仔细阅读并填写新问题模板。付费企业客户可享受私人支持邮箱contact dearimgui dot com。版本选择偶尔会标记版本发布带有详细的发布说明但通常建议同步到最新的 master 分支或 docking 分支该库相当稳定报告的回归问题通常能快速修复。高级用户可使用支持多视图端口和停靠功能的 docking 分支该分支会定期与 master 分支保持同步。使用者情况可查看 “Quotes”、“Funding Sponsors” 和 “Software using Dear ImGui” Wiki 页面了解使用 Dear ImGui 的情况若你的游戏/软件也在使用请添加相关信息也可查看示例展示线程。如何提供帮助参与开发可在 GitHub 论坛/问题区提供帮助并提交拉取请求。需注意提交 PR 意味着请求维护者审查代码并永久接管维护工作PR 应既考虑最终用户的利益又便于维护者理解和接受。更多想法可查看 Wiki 上的 “Help wanted”。提供资金支持可让公司通过开具发票的赞助/维护方式或购买 Dear ImGui Test Engine 的许可证来支持该项目邮箱contact AT dearimgui DOT com。赞助情况Dear ImGui 的持续开发一直得到用户和私人赞助商的资金支持具体的当前和过去的资助者及赞助商名单可查看详细列表。2014 年 11 月至 2019 年 12 月其持续开发也得到了 Patreon 用户和个人捐赠的资金支持。感谢所有过去和现在的支持者是你们让这个项目得以持续发展Dear ImGui 使用了为开源项目免费提供的软件和服务如用于静态分析的 PVS - Studio支持 C/C/C#/Java、用于持续集成系统的 GitHub actions、用于代码覆盖率分析的 OpenCppCoverage。开发人员与贡献者由 Omar Cornut 开发GitHub 上的所有直接或间接贡献者也功不可没。该库的早期版本在 Media Molecule 的支持下开发最初在游戏 TearawayPS Vita中内部使用。长期贡献者包括 Rokas Kupstys rokups2020 - 2022他为 Dear ImGui Test Engine 中的自动化系统和回归测试做了大量工作。维护/支持合同、赞助发票和其他 B2B 交易由 Disco Hello 托管和处理。灵感来源与致谢Omar 表示“我最初在 Q - Games 接触到 IMGUI 范式当时 Atman Binstock 在代码库中实现了一个简单版本我花了很多时间改进和思考。后来发现 Atman 是通过与 Casey 合作直接接触到这个概念的。我到 Media Molecule 后重写了一个新库试图克服之前使用的库的缺陷和限制就有了现在这个库此后我一直在不断迭代和改进它。” 该库嵌入了 Tristan Grimmer 的 ProggyClean 字体MIT 许可、Disco Hello 和 Tristan Grimmer 的 ProggyForever 字体MIT 许可以及 Sean Barrett 的 stb_textedit.h、stb_truetype.h、stb_rect_pack.h公共领域。早期版本的灵感、反馈和测试来自 Casey Muratori、Atman Binstock、Mikko Mononen、Emmanuel Briney、Stefan Kamoda、Anton Mikhailov、Matt Willis。特别感谢 Alex Evans、Patrick Doane、Marco Koegler 的热心帮助也感谢在 GitHub 上提供反馈、提问和补丁的所有人。许可协议Dear ImGui 采用 MIT 许可协议更多信息可查看 LICENSE.txt。