如何在游戏/程序启动后跟踪以秒和毫秒为单位的时间?我可以使用clock()
功能,但我听说它不准确。还有更好的方法吗?
答案 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中,他讨论了使用QueryPerformanceCounter
和QueryPerformanceFrequency
确定Windows上的挂钟时间
他还讨论了使用cpu循环计数,尽管只有假设处理器时钟速度恒定才有用。
他在后续剧集中再次讨论这些问题:https://hero.handmade.network/episode/game-architecture/day113和https://hero.handmade.network/episode/game-architecture/day177
由于您正在寻找游戏循环中的解决方案,因此即使您使用@Pranshu的跨平台解决方案,这些视频也可能至少会引起您的兴趣。对于使用平台相关方法的游戏,您可能无法获得更准确的时钟。
我要指出high_resolution_clock
提供了系统所知的最高分辨率时钟,因此它可能不比使用system_clock
或{{1}更准确。 }。 (它在我的OSX盒子上使用steady_clock
。)