溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

cocos2d-x中g(shù)etTickCount溢出問題

發(fā)布時(shí)間:2020-08-02 18:58:13 來源:網(wǎng)絡(luò) 閱讀:346 作者:Annnnnnnnd 欄目:游戲開發(fā)

最近做一個(gè)紅包提現(xiàn)活動(dòng),每次點(diǎn)擊提現(xiàn)按鈕后本地記錄提現(xiàn)時(shí)間,等60s后才能再次進(jìn)行提現(xiàn)。本地測(cè)試時(shí)很正常,但是有個(gè)同事卻出現(xiàn)了倒計(jì)時(shí)時(shí)間很大的問題。排查業(yè)務(wù)邏輯未找到問題,懷疑是C++部分獲取時(shí)間部分溢出導(dǎo)致,一看源碼果斷如此。

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位機(jī)器上都是32位的,unsigned int 的取值范圍為 0~42949672595,換算成天數(shù)為
Days = 42949672595/1000/60/60/24 = 49.7103 ,因此差不多每49天就會(huì)溢出一次。解決辦法很簡(jiǎn)單,只需要將返回值修改為double或者long long即可。

關(guān)于C語言int、long等的取值范圍詳細(xì)可參考 CYJ_fightman 的博客 :
https://blog.csdn.net/cyj2014go/article/details/78080279

PS:
以上是在公司的現(xiàn)有工程上看到的源碼,版本為cocos2dx 2.2,文件為 C2dxEx。后來又到cocos2dx 3.10版本中查找未發(fā)現(xiàn)gettickcount,反而在ccutils.h中找到了一個(gè)獲取時(shí)間的實(shí)現(xiàn),如下:

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

由于項(xiàng)目使用的是cocos-lua,并且只是以秒為單位進(jìn)行調(diào)度,因此也可以使用lua的系統(tǒng)函數(shù):os.time(),此函數(shù)返回1970.1.1.08:00和當(dāng)前時(shí)間的秒數(shù)差,如下:

local time2 = os.time() -- 返回1990.01.01 08:00 到當(dāng)前時(shí)間的秒數(shù)
local time = os.time({year =2016, month = 11, day =23, hour =17, min =17, sec = 00})
print("====================time=,",time) -- 結(jié)果打印 1479892620

作者:ONLY-only 
來源:CSDN 
原文:https://blog.csdn.net/u010130424/article/details/53321069 
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請(qǐng)附上博文鏈接!

總結(jié):
如果沒有時(shí)間粒度的要求,可以直接使用c函數(shù)的time(NULL)或者lua的os.time()(實(shí)際就是調(diào)用的c函數(shù)的time(NULL))。如果對(duì)時(shí)間粒度有要求,則可以使用gettimeofday,前提是讓其返回值至少為64位才行。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI