【问题标题】:Keep track of time in a game loop in C++在 C++ 中的游戏循环中跟踪时间
【发布时间】:2016-10-27 14:07:16
【问题描述】:

如何以秒和毫秒为单位跟踪我的游戏/程序启动后的时间?我可以使用clock() 函数,但我听说它不是那么准确。有没有更好的办法?

【问题讨论】:

  • 使用std::chrono::high_resolution_clock
  • C 还是 C++?选一个。它们是不同的语言,答案会非常不同。
  • 游戏时间还是挂钟?我的意思是,如果我停止游戏半小时,你想要的时间是tt-15m
  • 查看以下关于时钟和精度的答案enter link description here

标签: c++ time


【解决方案1】:

您可以在 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

这段代码在我的 PC 上运行了 4e-07 秒。

希望对您有所帮助。

【讨论】:

  • 这就是auto对于C++必不可少的原因!
  • “所以,它非常精确。” - 您将 “precision”“accuracy”混淆了>。当您得到的只是毫秒精度时,纳秒精度有什么用?
【解决方案2】:

使用 chrono 库是一种跨平台且简单的解决方案

例子:

#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

【讨论】:

【解决方案3】:

我强烈建议您查看Handmade Hero。 Casey 在一系列视频片段中记录了创建整个游戏的过程。在one of the early episodes 中,他讨论了使用QueryPerformanceCounterQueryPerformanceFrequency 确定窗口上的挂钟时间

他还讨论了使用 cpu 周期计数,尽管这些只有在处理器时钟速度恒定的情况下才有用。

他在后面的剧集中再次谈到这些问题:https://hero.handmade.network/episode/game-architecture/day113https://hero.handmade.network/episode/game-architecture/day177

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

我会指出high_resolution_clock 提供了库所知道的系统可用的最高分辨率时钟,因此它可能不会比使用system_clocksteady_clock 更准确。 (它在我的 OSX 机器上使用 steady_clock。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多