cocos2d-x中getTickCount溢出问题
admin
2023-02-11 05:00:07
0

最近做一个红包提现活动,每次点击提现按钮后本地记录提现时间,等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_BEGIN

int 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位才行。

相关内容

热门资讯

德国总理:美国正在被伊朗羞辱 德国之声4月27日报道,德国总理默茨在访问一所学校时表示,在当前的持续冲突中,伊朗领导层正试图羞辱美...
理响中国|“长”歌以行,风云激... 光阴如梭,东方潮阔。这里是中国的长三角,世界的长三角。无论过去、现在还是未来,这片土地都因时代而生,...
白宫:特朗普及其国安团队开会讨... 新华社华盛顿4月27日电 美国白宫新闻秘书莱维特27日在记者会上证实,总统特朗普及其国家安全团队当天...
人民日报刊文:日本放开杀伤性武... 日本放开杀伤性武器出口推高地缘冲突风险(国际论坛)常思纯《人民日报》(2026年04月28日 第 0...
医疗保障法草案二审:明确生育保... 满足多样化健康保障需求本报记者 彭 波4月27日,医疗保障法草案二审稿提请十四届全国人大常委会第二十...
天津一景区发生自转旋翼机事故1... 澎湃新闻记者 吕新文中国民用航空华北地区管理局4月22日公布《豪客通航“10•1”天津长芦汉盐旅游区...
卡塔尔埃米尔与美国总统特朗普通... 当地时间24日,卡塔尔埃米尔塔米姆与美国总统特朗普通电话,重点就中东地区局势以及伊朗与美国谈判问题交...
男子30年前被扣押2859克黄... 澎湃新闻记者 王鑫家住辽宁省大连市的潘永嘉近日向澎湃新闻反映称,三十年前,他在大连周水子机场被盖州市...
商务部:取消反制欧盟两家金融机... 中华人民共和国商务部令二〇二六年 第1号鉴于欧盟已取消对中国两家金融机构的制裁措施,现公布《关于取消...
过去24小时共有5艘船只通过霍... 总台记者当地时间24日获悉,过去24小时内,共有5艘船只通过霍尔木兹海峡,其中包括一艘伊朗油轮。(总...