You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 03:55:25