要生成全局唯一 ID,我需要它们创建的时间戳之类的东西。但是这些 id 可以在源代码中直接生成。所以以毫秒为单位的时间不够准确,可能会无意中产生相同的 id。
因此,我需要一个足够精确的时间戳,以便每次获取它时都会有所不同。我虽然关于 CPU 周期,但我不知道是否有办法获取这些信息。
由于这是针对实时游戏的,因此获取时间戳与性能相关。而且,它是跨平台兼容Linux、Windows和Mac的,所以时间戳当然也应该是。如果没有标准的方法,我可以接受三种不同的系统解决方案。
要生成全局唯一 ID,我需要它们创建的时间戳之类的东西。但是这些 id 可以在源代码中直接生成。所以以毫秒为单位的时间不够准确,可能会无意中产生相同的 id。
因此,我需要一个足够精确的时间戳,以便每次获取它时都会有所不同。我虽然关于 CPU 周期,但我不知道是否有办法获取这些信息。
由于这是针对实时游戏的,因此获取时间戳与性能相关。而且,它是跨平台兼容Linux、Windows和Mac的,所以时间戳当然也应该是。如果没有标准的方法,我可以接受三种不同的系统解决方案。
时间戳对此不是很好,除非你保证有一个高分辨率的时间源。有些系统有这个,有些系统没有。
特别是,如果系统有多个 CPU,每个 CPU 的“时间戳计数器”可能不同步,因此您可能会因为一个 CPU 上的时钟周期数“落后于”另一个 CPU 上的时钟周期数而得到重复。
在 POSIX 系统中,您可以使用clock_gettime
具有纳秒级分辨率的 a ,并且速度也应该相当快。
我写了这段代码来测试它:
#include <iostream>
#include <sys/time.h>
using namespace std;
int main ()
{
timespec ts[100];
for(auto &t : ts)
clock_gettime(CLOCK_REALTIME, &t);
timespec old_ts = {0};
for(auto &t : ts)
{
long diff = 0;
if (old_ts.tv_sec)
{
diff = t.tv_nsec - old_ts.tv_nsec;
}
cout << "ts.nsec: " << t.tv_nsec << " diff=" << diff << endl;
old_ts = t;
}
return 0;
}
编辑:
当然,唯一 ID 最简单的形式是 64 位原子计数器——它最快,而且很简单。假设您具有 C++11 功能:
#include <atomic>
typdef long long int id_type;
std::atomic<id_type> current_id;
id_type get_next_id()
{
return current_id.fetch_add(1);
}
不确定视觉工作室是否有原子,但你可以使用InterlockedINcrement64()
:
InterlockedIncrement64(¤t);