cocos2d-x中getTickCount溢出问题
最近做一个红包提现活动,每次点击提现按钮后本地记录提现时间,等60s后才能再次进行提现。本地测试时很正常,但是有个同事却出现了倒计时时间很大的问题。排查业务逻辑未找到问题,怀疑是C++部分获取时间部分溢出导致,一看源码果断如此。
unsigned int C2dxEx::getTickCount(){ cocos2d::cc_timeval tvpre; cocos2d::CCTime::gettimeofdayCocos2d(&tvpre, NULL); return tvpre.tv_usec / 1000 + tvpre.tv_sec * 1000;}
int在32和64位机器上都是32位的,unsigned int 的取值范围为 0~42949672595,换算成天数为
Days = 42949672595/1000/60/60/24 = 49.7103 ,因此差不多每49天就会溢出一次。解决办法很简单,只需要将返回值修改为double或者long long即可。
关于C语言int、long等的取值范围详细可参考 CYJ_fightman 的博客 :
https://blog.csdn.net/cyj2014go/article/details/78080279
PS:
以上是在公司的现有工程上看到的源码,版本为cocos2dx 2.2,文件为 C2dxEx。后来又到cocos2dx 3.10版本中查找未发现gettickcount,反而在ccutils.h中找到了一个获取时间的实现,如下:
double gettime(){ struct timeval tv; gettimeofday(&tv, nullptr); return (double)tv.tv_sec + (double)tv.tv_usec/1000000;}#if CC_TARGET_PLATFORM == CC_PLATFORM_WIN32#include "platform/CCStdC.h"#ifndef __MINGW32__NS_CC_BEGINint gettimeofday(struct timeval * val, struct timezone *){ if (val) { LARGE_INTEGER liTime, liFreq; QueryPerformanceFrequency( &liFreq ); QueryPerformanceCounter( &liTime ); val->tv_sec = (long)( liTime.QuadPart / liFreq.QuadPart ); val->tv_usec = (long)( liTime.QuadPart * 1000000.0 / liFreq.QuadPart - val->tv_sec * 1000000.0 ); } return 0;}NS_CC_END#endif // __MINGW32__#endif // CC_TARGET_PLATFORM == CC_PLATFORM_WIN32
由于项目使用的是cocos-lua,并且只是以秒为单位进行调度,因此也可以使用lua的系统函数:os.time(),此函数返回1970.1.1.08:00和当前时间的秒数差,如下:
local time2 = os.time() -- 返回1990.01.01 08:00 到当前时间的秒数local time = os.time({year =2016, month = 11, day =23, hour =17, min =17, sec = 00})print("====================time=,",time) -- 结果打印 1479892620作者:ONLY-only 来源:CSDN 原文:https://blog.csdn.net/u010130424/article/details/53321069 版权声明:本文为博主原创文章,转载请附上博文链接!
总结:
如果没有时间粒度的要求,可以直接使用c函数的time(NULL)或者lua的os.time()(实际就是调用的c函数的time(NULL))。如果对时间粒度有要求,则可以使用gettimeofday,前提是让其返回值至少为64位才行。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。