如何降低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
相关产品推荐
相关产品推荐

