在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;
这没关系,但只有在正在进行的计算更新运行时才会有效。
答案 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()以来经过了多长时间。