如何在Dear ImGui中实现流畅的80至0倒计时?
Dear ImGui 倒计时卡顿问题解决方法
你的代码出现严重卡顿的核心原因:
- 使用
Sleep(1000)直接阻塞了 ImGui 的主渲染线程,导致整个界面停止响应,帧率暴跌 - 多次调用
AddText会在同一位置叠加绘制文本,不是更新原有内容,属于错误的更新方式
正确实现方案
利用 ImGui 的帧循环特性,通过记录起始时间动态计算剩余倒计时,全程不阻塞渲染线程:
1. 定义状态变量
把倒计时的状态变量放在 ImGui 渲染函数外部(比如类成员、静态全局变量,避免每次帧循环重置):
int countdown = 80; double startTimestamp = 0.0; bool isCountingDown = false;
2. 渲染逻辑实现
在 ImGui 的渲染循环中编写以下代码:
// 添加启动倒计时的控制按钮 if (ImGui::Button("启动倒计时")) { countdown = 80; startTimestamp = ImGui::GetTime(); // 获取ImGui启动后的累计秒数 isCountingDown = true; } // 实时计算剩余时间 if (isCountingDown) { double elapsedSeconds = ImGui::GetTime() - startTimestamp; countdown = 80 - static_cast<int>(elapsedSeconds); // 倒计时结束后停止计数 if (countdown <= 0) { countdown = 0; isCountingDown = false; } } // 绘制倒计时文本 ImGui::SetCursorPos(ImVec2(1700, 400)); ImGui::TextColored(ImColor(255, 255, 255), "%d", countdown);
关键说明
ImGui::GetTime():返回 ImGui 初始化以来的高精度累计秒数,线程安全且不会阻塞渲染- 每次帧循环都会重新计算剩余时间并更新文本,保证数字动态刷新的同时界面流畅
- 绝对不要在 ImGui 渲染函数中使用任何阻塞线程的函数(如
Sleep、std::this_thread::sleep_for),这类操作会直接导致界面卡顿
内容的提问来源于stack exchange,提问作者Hubert Hubertus
相关产品推荐
相关产品推荐

