Cocos2dx 如何计算毫秒数?

How do I Count Milliseconds in Cocos2dx?

在 Cocos2dx 中显示毫秒时遇到一些困难。我想避免为不同的机器使用不同的代码库。

这适用于 32 位 iPhone/iPod 平台,但在 64 位平台上它总是 returns 零秒并且没有时间流逝:

timeval time;
gettimeofday(&time, NULL);
unsigned long millisecs = (time.tv_sec * 1000) + (time.tv_usec / 1000);
return (float)millisecs;

这在 64 位 iPhone/iPod 平台和 32 位平台上的功能相同,但基于时钟周期,因此如果用户收到短信或在后台打开程序,时间会延长:

clock_t t;
t = clock();
return 10000.0 * ((float)t)/CLOCKS_PER_SEC;

这可以准确计算时间,但只以秒为单位(不是毫秒):

auto timeInMillis = std::time(nullptr);

我发现的唯一方法是设置一个循环更新事件并将 dt 添加到一个浮点数中(这似乎总是准确的),这没问题但并不理想。

基本上在更新中我有

timeElapsed += dt;

没关系,但只有在持续进行计时更新时才有效运行。

您好,用它来测量 start/stop 在 cocos2d-x 中的时间。我在cpp文件中使用它。我从 https://code2relax.wordpress.com/tag/measure/ 获得了这段代码并且效果很好。

typedef unsigned long long timestamp_t;

struct time_measure {
  timestamp_t start;
  timestamp_t stop;
  double result;
};

timestamp_t get_timestamp() {
  struct timeval now;
  gettimeofday(&now, NULL);
  return now.tv_usec + (timestamp_t)now.tv_sec * 1000000;
}

void update_time(struct time_measure *t) {
  t->result = (t->stop - t->start) / 1000000.0L;
  CCLOG("%f", t->result);
}

当我需要测量内部函数时:

time_measure tm;

tm.start = get_timestamp();
// long running task, download images
tm.stop = get_timestamp();
update_time(&tm);

您可以将 time_measure tm 作为私有 属性、typedef 和函数声明 移动到 .h 文件。要 cpp 文件函数实现,您可以从 cocos2d-x 场景中的任何位置测量时间。

32 位和 64 位设备以及它们报告时间的方式似乎存在差异。在 32 位设备上运行良好的代码片段:

timeval time;
gettimeofday(&time, NULL);
unsigned long millisecs = (time.tv_sec * 1000) + (time.tv_usec / 1000);

将在所有 64 位设备上将 "millisecs" 设置为 0。我找到的唯一可行的解​​决方案是有一个名为“_millisecs”的浮点值,并且在我的 update() 函数的第一行,我将 dt 添加到 _millisecs。这不会在函数内部提供准确的报告,但它会随时准确报告自首次安排 update() 以来已经过去了多少时间。