中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

cocos2d-x中getTickCount溢出問題

發布時間:2020-08-02 18:58:13 來源:網絡 閱讀:353 作者:Annnnnnnnd 欄目:游戲開發

最近做一個紅包提現活動,每次點擊提現按鈕后本地記錄提現時間,等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位才行。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

舟曲县| 庆云县| 腾冲县| 红安县| 织金县| 东海县| 通辽市| 安顺市| 昭通市| 达拉特旗| 英德市| 承德市| 鄯善县| 祁阳县| 镇宁| 霍林郭勒市| 会同县| 三河市| 宁远县| 凤凰县| 巴塘县| 石渠县| 綦江县| 彭州市| 阳春市| 阜阳市| 调兵山市| 绥芬河市| 霍林郭勒市| 涟水县| 旬邑县| 仙桃市| 昔阳县| 天水市| 福海县| 遵义县| 福鼎市| 麦盖提县| 宜宾县| 万年县| 拉萨市|