Dear ImGui 内置 Metrics/Debugger 窗口怎么用:调试自己的界面与字体问题
Dear ImGui 内置 Metrics/Debugger 窗口怎么用调试自己的界面与字体问题【免费下载链接】imguiDear ImGui: Bloat-free Graphical User interface for C with minimal dependencies项目地址: https://gitcode.com/GitHub_Trending/im/imgui把 Dear ImGui 集成进自己的 C 项目后常见问题有移动窗口时部分元素被裁剪或消失、文本变成一排小方块、想确认某个窗口或表格实际使用的矩形。Dear ImGui 自带一个 Dear ImGui Metrics/Debugger 窗口对应 API 是 imgui.h 中的ImGui::ShowMetricsWindow()注释写明它用于 display Dear ImGui internals: windows, draw commands, various internal state, etc.而imgui.h的 Debug Utilities 一节直接称它是 Your main debugging friend。本文说明如何打开这个窗口并用它排查布局裁剪与字体纹理两类问题。前提是你的项目已集成 Dear ImGui 和一个渲染后端帧循环正常运行。打开 Metrics/Debugger 窗口有两条路径如果你的应用调用了ImGui::ShowDemoWindow()可以直接在 Demo 窗口的Tools菜单里打开。imgui_demo.cpp 展示了 Demo 如何管理这些工具窗口// Dear ImGui Tools (accessible from the Tools menu) if (demo_data.ShowMetrics) { ImGui::ShowMetricsWindow(demo_data.ShowMetrics); }在自己的帧循环里直接调用用一个 bool 控制开关static bool show_metrics true; ImGui::ShowMetricsWindow(show_metrics);传入bool* p_open ! NULL会在窗口右上角显示关闭按钮点击后该 bool 被置为 false见 imgui.h 中Begin()的注释。如果调用后窗口为空或完全无效先检查 imconfig.h定义了IMGUI_DISABLE_DEBUG_TOOLS时ShowMetricsWindow(), ShowDebugLogWindow() and ShowIDStackToolWindow() will be empty。窗口顶部版本、帧率与渲染统计窗口标题为 Dear ImGui Metrics/Debugger顶部实时显示实现见 imgui.cppDear ImGui 版本号IMGUI_VERSION/IMGUI_VERSION_NUM有 Context Name 时一并显示应用平均帧耗时与帧率格式为 Application average %.3f ms/frame (%.1f FPS)每帧提交的顶点数、索引数三角面数可见窗口数与当前内存分配数。这些数值反映提交给渲染器的数据量可以在这里核对当前 UI 每帧产生的几何数据规模。docs/FAQ.md 在介绍文档入口时也提到ShowMetricsWindow()暴露大量内部信息虽然主要定位是调试工具但 having access to that information tends to help understands concepts。Visualize 工具把窗口和表格的矩形画出来Tools节点里的 Visualize 区用于把布局数据直接叠加到画面上见 imgui.cppShow windows rectangles为所有窗口叠加矩形旁边下拉框选择显示哪种矩形类型OuterRect、OuterRectClipped、InnerRect、InnerClipRect、WorkRect、Content、ContentIdeal、ContentRegionRect。当导航焦点在某窗口上时列表还会逐行打印每种矩形的坐标与尺寸。Show tables rectangles为所有表格叠加矩形有独立的类型列表OuterRect、InnerRect、WorkRect、HostClipRect、InnerClipRect、BackgroundClipRect、各列的ColumnsRect/ColumnsClipRect等鼠标悬停某一矩形行时对应区域会以黄色描边高亮。Show groups rectangles显示 group 占用的矩形。Show windows begin order显示各窗口的 begin 顺序。布局出问题时直接看窗口实际工作在哪个WorkRect/InnerClipRect上、内容是否被裁剪在预期的裁剪矩形内比在代码里逐处下断点更快。同区域还有Show Debug Log和Show ID Stack Tool两个开关分别打开另外两个工具窗口也可以在自己的代码里直接调用ImGui::ShowDebugLogWindow()和ImGui::ShowIDStackToolWindow()窗口帮助文本原话。元素被裁剪或消失检查 DrawLists 与 ClipRectdocs/FAQ.md 对 some elements are clipping or disappearing when I move windows around 给出的判断是渲染函数很可能没有正确处理裁剪矩形。文档中的两个关键点每条 draw command 必须使用ImDrawCmd结构里提供的裁剪矩形ImDrawCmd-ClipRect来渲染三角形Dear ImGui 的矩形定义为(x1left, y1top, x2right, y2bottom)不是(x1, y1, width, height)。核对时打开 Metrics 窗口的DrawLists节点它逐个列出每个 viewport 下的ImDrawList并提供两个开关见 imgui.cppShow ImDrawCmd mesh when hovering悬停某条 draw command 时显示它应渲染出的网格Show ImDrawCmd bounding boxes when hovering悬停时显示该命令的包围盒。用它可以确认传给渲染器的 draw data 与你后端实际使用的裁剪矩形是否一致。参考实现看backends/目录例如 backends/imgui_impl_dx11.cpp 中 scissor 矩形的处理FAQ 中的示例代码// Project scissor/clipping rectangles into framebuffer space ImVec2 clip_off draw_data-DisplayPos; ImVec2 clip_min(pcmd-ClipRect.x - clip_off.x, pcmd-ClipRect.y - clip_off.y); ImVec2 clip_max(pcmd-ClipRect.z - clip_off.x, pcmd-ClipRect.w - clip_off.y); if (clip_max.x clip_min.x || clip_max.y clip_min.y) continue; // Apply scissor/clipping rectangle const D3D11_RECT r { (LONG)clip_min.x, (LONG)clip_min.y, (LONG)clip_max.x, (LONG)clip_max.y }; ctx-RSSetScissorRects(1, r);对图像类问题imgui_demo.cpp 的 Images 一节注释明确建议You can use ShowMetricsWindow() to inspect the draw data that are being passed to your renderer, it will help you debug issues if you are confused about it. FAQ 在ImTextureID一节的结尾给出了同样的说法。文本变成小方块检查字体纹理FAQ 对 little squares are showing instead of text 的结论是Your renderer backend is not using the font texture correctly or it hasnt been uploaded to the GPU. 分后端处理详见 docs/FAQ.md标准后端1.92 之前先检查 A) 是否在ImGui_ImplXXX_NewFrame()之后修改了 font atlasB) 纹理图集过大时上传可能失败另见 docs/FONTS.md。标准后端1.92 之后若仍出现该现象文档建议直接上报 issue。自定义后端确认字体纹理已上传到 GPU、shader 与渲染状态例如纹理绑定设置正确把代码与现有后端逐段对比文档建议用 RenderDoc 这类图形调试器检查渲染状态。Metrics 窗口的Fonts节点对应排查位置见 imgui.cpp它按ImFontAtlas列出 Fonts (%d), Textures (%d) 节点展开后可以检查字体图集内部核对图集与纹理的数量和状态是否符合预期再对照上面的分支定位是上传问题还是纹理使用问题。其他调试工具Item Picker、UTF-8 编码、Debug BreakTools节点还包含 Debug breaks 与 Validate 区Show Item Picker开启后用鼠标悬停画面上任意控件程序会进入该控件提交处的调用栈调用IM_DEBUG_BREAK()宏断点。窗口自带警告If you dont have a debugger attached, this will probably crash——必须先挂好调试器再开。Show Debug Break buttons in other sections绑定io.ConfigDebugIsDebuggerPresent在窗口其他节点里启用额外的 Debug Break 按钮。UTF-8 Encoding viewerValidate 区开启后出现输入框输入字符串后会调用ImGui::DebugTextEncoding()处理帮助确认你的 UTF-8 编码设置是否正确适合排查非拉丁文字显示异常。帮助文本说明You can also call ImGui::DebugTextEncoding() from your code with a given string to test that your UTF-8 encoding settings are correct.Windows节点把当前所有窗口按 By display order、By focus order (root windows)、By submission order (begin stack) 三种顺序列出用来确认某个控件属于哪个窗口以及该窗口的各项矩形数值。验证方式与限制验证 Begin/BeginChild 处理Validate 区的Debug Begin/BeginChild return value会让部分Begin()/BeginChild()调用返回 false并按窗口深度循环帮助文本描述的现象是 Windows should be flickering while running。结合 imgui.h 的要求Always call a matching End() for each Begin() call, regardless of its return value!可用来确认自己的代码在窗口被裁剪折叠时仍能正确提交。视觉核对矩形叠加、draw command 网格/包围盒、UTF-8 编码查看都是画面对照文档没有给出额外的日志断言作为通过标准以叠加图形与窗口内打印的数值为准。限制IMGUI_DISABLE_DEBUG_TOOLS会从编译层面移除这些工具ShowMetricsWindow()变成空实现见 imgui.cpp断点类工具Item Picker、Debug Break 按钮依赖外部调试器未挂调试器时使用可能导致崩溃这是窗口帮助文本明确的警告。排查完成后关闭对应开关即可矩形叠加类可视化只往前景 DrawList 上追加描边矩形不改变绘制逻辑本身。【免费下载链接】imguiDear ImGui: Bloat-free Graphical User interface for C with minimal dependencies项目地址: https://gitcode.com/GitHub_Trending/im/imgui创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考