我已经研究了几个主题,试图获得一些关于如何用C或C++制作可靠时钟的想法。然而,我也看到一些函数使用处理器的滴答和每秒滴答来计算最终结果,我认为这可能是一个像我这样的自动超频CPU的问题。我也看到其中一个重置后,一段时间,因此是不是真的可靠。
这个想法是让一个(最好是跨平台的)时钟像游戏内的时钟一样,精度优于一秒,以便能够将“当前会话”中经过的时间与程序结束时节省的时间相加。这将是计算花费在一个没有游戏内时钟的游戏机游戏上的时间,从长远来看,也许可以将其集成到实际的PC游戏中。
它应该能够在不占用太多或全部CPU时间(或多核CPU的单个核时间)的情况下运行,因为仅将所有这些资源用于时钟是非常糟糕的,而且在具有自动超频(否则可能导致不准确的结果)的系统上也是如此。
我想要实现这个特性的程序目前看起来是这样的,但是我可能会用C重新编码它(因为我必须重新学习如何用C++编码):
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
cout << "In game" << endl;
system("PAUSE");
return 0;
}
顺便说一句,我仍然需要去掉窗口特有的暂停特性,但我认为可以通过一个简单的“while(char!='n')”循环来解决这个问题。
我已经浏览过的内容:
(编辑:额外研究,特别是C实现:
问题是,不清楚提到的一些方法,如Boost或SDL2,特别是在自动超频的情况下是否能正常工作。
TLDR:请问我应该使用什么跨平台功能来制作一个精确的,亚秒级的C/C++计数器,它可以在多核和/或自动超频处理器上工作?
提前谢谢你。
只是要记住它不能用来计时。它只是好告诉时间间隔,这是一个很大的区别。例如:
using clock = std::chrono::high_resolution_clock;
auto start = clock::now();
perform_operation();
auto end = clock::now();
auto us = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count();
std::cout << "Operation took " << us << " microseconds.\n";
如果时钟检查本身是对性能敏感的操作,您将不得不求助于特定于平台的技巧,其中最流行的是直接读取CPU滴答计数器(在Intel家族中为codeRDTSC/code>)。这是一种非常快的,在现代CPU上非常精确的测量时间间隔的方法。