我如何计算Cocos2dx中的毫秒数?

时间:2015-01-20 16:35:12

标签: c++ time cocos2d-x

在Cocos2dx中有一些显示毫秒的挣扎。我想避免为不同的机器使用不同的代码库。

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

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;

这没关系,但只有在正在进行的计算更新运行时才会有效。

2 个答案:

答案 0 :(得分:0)

您可以使用它来测量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场景中的任何位置测量时间。

答案 1 :(得分:0)

32位和64位设备似乎存在差异,以及它们如何报告时间。代码片段在32位设备上正常工作:

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

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