如何在cimgui-go中设置标志,强制DearImgui无视输入持续重绘?
解决DearImgui无输入/失焦时停止重绘的问题
核心解决方案:强制开启持续重绘模式
你可以通过设置ImGui的配置标志,或者在新帧到达时主动触发重绘请求,让渲染循环不依赖用户输入持续运行。
具体实现方式
- 初始化时启用轮询模式
在创建ImGui上下文阶段,添加ImGuiConfigFlags_NavEnablePolling标志,这个配置会让ImGui脱离系统输入事件的依赖,保持持续重绘循环:
imgui.CreateContext(nil) io := imgui.GetIO() io.ConfigFlags |= imgui.ConfigFlagsNavEnablePolling
- 新图像到达时主动标记重绘需求
当图像采集goroutine通过通道推送新帧时,除了更新纹理,还可以在ImGui线程里强制触发重绘信号:
select { case frame := <-frameChan: // 这里执行更新纹理的逻辑 io := imgui.GetIO() // 告知ImGui需要保持循环,避免因无输入暂停重绘 io.WantCaptureMouse = true // 部分绑定支持直接标记重绘需求,若你的cimgui-go有该方法可使用 // imgui.MarkRenderNeedsUpdate() default: // 无新帧时正常处理UI逻辑 }
- 确保主渲染循环持续运行
不要将io.WantCaptureMouse或io.WantCaptureKeyboard作为循环终止条件,保持循环直到窗口关闭:
for !glfw.WindowShouldClose(window) { glfw.PollEvents() imgui.NewFrame() // 绘制主窗口、摄像头纹理子窗口的逻辑 imgui.Render() // 执行缓冲区交换、OpenGL渲染等操作 }
补充说明
ImGuiConfigFlags_NavEnablePolling是最彻底的解决方式,专门针对需要持续更新(如视频流、实时数据可视化)的场景,无需每次新帧都额外触发重绘。- 如果仅需更新摄像头子窗口而非整个UI,也可以尝试在新帧到达时调用
ImGui.SetNextWindowFocus(),但这会让子窗口自动获焦,可能不符合交互需求,因此优先推荐配置标志的方案。
内容的提问来源于stack exchange,提问作者jrichner
相关产品推荐
相关产品推荐

