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

如何降低FPS计数器刷新频率?现有实现问题求助

问题分析与正确实现

错误原因

  • 计算逻辑错误:你把100ms间隔的倒数当作FPS,这完全不符合FPS的定义。FPS是每秒运行的帧数,而不是单段间隔时间的倒数。比如间隔0.1秒时,1/0.1=10,取整后显示9(因实际间隔可能略大于0.1秒,比如101ms,1/0.101≈9.9),但这和真实的每秒帧数毫无关系。
  • 局部时钟无效:函数内定义的clock2是局部变量,每次调用Update都会重新初始化,计时永远从0开始,根本无法累计时间,自然达不到定时计算的目的。

正确实现

要实现每100ms计算一次真实FPS,需要在Fps类中添加成员变量来累计时间和统计帧数,避免局部变量的重置问题,同时修正FPS计算逻辑:

类成员定义

class Fps {
private:
    sf::Text text;
    sf::Clock fpsClock;  // 成员时钟,持续累计时间
    int frameCount = 0;   // 统计间隔内的帧数
public:
    void Update();
    // 其他必要的成员函数(比如构造函数、获取文本的函数等)
};

Update函数实现

void Fps::Update() {
    frameCount++;  // 每调用一次Update(对应一帧),帧数+1
    float elapsedTime = fpsClock.getElapsedTime().asSeconds();

    if (elapsedTime >= 0.1f) {  // 每100ms触发一次计算
        float fps = frameCount / elapsedTime;  // 真实FPS = 总帧数 / 间隔时间(秒)
        text.setString("FPS: " + std::to_string(static_cast<int>(fps)));

        // 重置计数器和时钟,开始下一轮统计
        frameCount = 0;
        fpsClock.restart();
    }
}

逻辑说明

  • 用成员变量fpsClock持续计时,不会随Update调用重置,能准确累计时间。
  • frameCount每帧递增,统计100ms内的总帧数,用帧数除以间隔时间得到真实的每秒运行帧数,这才是FPS的正确计算方式。
  • 这种方式计算出的FPS数值稳定,符合程序实际运行的帧率情况。

内容的提问来源于stack exchange,提问作者Rogl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 11:31:11