这个问题与sfml的主循环无关。我如何计算实际的帧率(例如,我启用了vsync,但主循环仍在高速运行),以便实际显示屏幕更新的速度(而不是主循环的速度)。测量主循环速度对我来说并不重要,但实际的窗口更新速度很重要。
SFML没有提供检索你当前帧率的方法,像OpenGL这样的后端也没有。因此,唯一的办法就是按照你的建议,监控主循环的速度。
另外。window.setFrameLimit(60)
或 window.setVerticalSyncEnabled(true)
或内环 sleep
在我的SFML应用中,60Hz显示器上的V-Sync也会产生同样的效果,不同的是V-Sync的CPU和GPU成本更高(由于它们的同步方式)。chrono
例如,在你的主循环中。
确保将你的 draw
通过使用 time_point
(s),进入 start
和 end
点,并计算所经过的时间与 std::chrono::time_duration
.
例如:
std::chrono::high_resolution_clock::time_point start;
std::chrono::high_resolution_clock::time_point end;
float fps;
while(window.isOpen()){
// Perform some non-rendering logic there...
// Performed. Now perform GPU stuff...
start = std::chrono::high_resolution_clock::now();
// window.draw, etc.
end = std::chrono::high_resolution_clock::now();
fps = (float)1e9/(float)std::chrono::duration_cast<std::chrono::nanoseconds>(end-start).count());
}