用C ++记录游戏循环中的时间

时间:2016-10-27 14:07:16

标签: c++ time

如何在游戏/程序启动后跟踪以秒和毫秒为单位的时间?我可以使用clock()功能,但我听说它不准确。还有更好的方法吗?

3 个答案:

答案 0 :(得分:6)

您可以在C ++中使用chrono库 这是一个代码示例:

#include <chrono>
#include <iostream>
using namespace std;
using namespace std::chrono;
int main() {                         
    high_resolution_clock::time_point t1 = high_resolution_clock::now(); 
    high_resolution_clock::time_point t2 = high_resolution_clock::now();  
    duration<double> time_span = duration_cast<duration<double>>(t2 - t1);      
    cout << time_span.count() << " seconds\n";
    return 0; 
} 

注意这个c ++ 11,所以要编译它你应该使用标志-std = c ++ 11

$ g++ -std=c++11 test.cpp -o test

这段确切的代码在我的电脑上提供了4e-07秒。

希望有所帮助。

答案 1 :(得分:4)

跨平台且简单的解决方案是使用计时库

示例:

#include <iostream>
#include <chrono>

void gameFunction()
{
    // start()
    // end()
}

int main()
{
    auto t1 = std::chrono::high_resolution_clock::now();
    gameFunction();
    auto t2 = std::chrono::high_resolution_clock::now();

    auto elapsed_time = std::chrono::duration_cast<std::chrono::microseconds>( t2 - t1 ).count();

    std::cout << elapsed_time << std::endl;
    return 0;
}

最后请注意,为此需要至少使用C ++ 11,因此请将-std =标志设置为至少c ++ 11。例如:

g++ -std=c++11 game.cpp -o game

答案 2 :(得分:1)

我强烈建议您查看Handmade Hero。凯西记录了一系列视频集中的整个游戏。在one of the early episodes中,他讨论了使用QueryPerformanceCounterQueryPerformanceFrequency确定Windows上的挂钟时间

他还讨论了使用cpu循环计数,尽管只有假设处理器时钟速度恒定才有用。

他在后续剧集中再次讨论这些问题:https://hero.handmade.network/episode/game-architecture/day113https://hero.handmade.network/episode/game-architecture/day177

由于您正在寻找游戏循环中的解决方案,因此即使您使用@Pranshu的跨平台解决方案,这些视频也可能至少会引起您的兴趣。对于使用平台相关方法的游戏,您可能无法获得更准确的时钟。

我要指出high_resolution_clock提供了系统所知的最高分辨率时钟,因此它可能不比使用system_clock或{{1}更准确。 }。 (它在我的OSX盒子上使用steady_clock。)