青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

勤能補(bǔ)拙,Expter

成都游戲Coder,記錄游戲開(kāi)發(fā)過(guò)程的筆記和心得!

一個(gè)高效的定時(shí)器分析及設(shè)計(jì)

       對(duì)于一個(gè)游戲而言,定時(shí)器是必須的,而它一般作為一個(gè)游戲基本公共組件,而定時(shí)器在游戲邏輯中運(yùn)用是非常明顯的(比如吃藥回血,每幾秒回血多少),而對(duì)于游戲邏輯而言需要開(kāi)發(fā)一個(gè)高效率高精度(毫秒級(jí)別)的定時(shí)器。

    
一:分析Ace庫(kù)定時(shí)器實(shí)現(xiàn)方式

   1.Ace種定時(shí)器實(shí)現(xiàn)有4種,這里不具體介紹實(shí)現(xiàn)細(xì)節(jié),主要介紹實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu),性能。
       具體的4種定時(shí)器都是從ACE_Timer_Queue_T繼承,每種定時(shí)器用不同的數(shù)據(jù)結(jié)構(gòu)來(lái)實(shí)現(xiàn)具體Timer的算法。
      1)ACE_Timer_Heap定時(shí)器,根據(jù)觸發(fā)時(shí)間建立一個(gè)優(yōu)先級(jí)隊(duì)列(一個(gè)最小堆數(shù)據(jù)結(jié)構(gòu))來(lái)維護(hù)所有的定時(shí)器,代價(jià)就是刪除和插入過(guò)程為O(logn),代價(jià)比較高。
      2)ACE_Timer_List定時(shí)器,根據(jù)觸發(fā)時(shí)間建立一個(gè)有序的雙向鏈表,代價(jià)就是插入定時(shí)器代價(jià)較高。
      3)ACE_Timer_Hash定時(shí)器,采用開(kāi)鏈的Hash方式每一個(gè)桶為一個(gè)單鏈表,在檢查所有桶超時(shí)的時(shí)候會(huì)遍歷鏈表所有的元素。為了提高效率這里所用的Hash桶應(yīng)該足夠 大,而對(duì)于定時(shí)器一般是頻繁的超時(shí)響應(yīng)定時(shí)器,已經(jīng)插入和刪除,響應(yīng)會(huì)采用迭代的方式。所以效率并不是那么高效。
      4)ACE_Timer_Wheel定時(shí)器,采用的一種時(shí)間輪的方式,具體實(shí)現(xiàn)就好象一個(gè)輪子上面有很多插槽,每一個(gè)插槽下面包括一個(gè)有序雙向鏈表,在Ace中把輪子叫做Wheel,插槽叫做Spoke,每一個(gè)定時(shí)器被Hash到Spoke中,而Spoke也可以理解為timer的分辨率,而Spoke的計(jì)算公式為 :( 觸發(fā)時(shí)間 >> 分辨率的位數(shù))&(spoke大小-1).然后在根據(jù)觸發(fā)時(shí)間把定時(shí)器插入到每一個(gè)Spoke的有序雙向鏈表中, 與Ace_timer_Hash的實(shí)現(xiàn)類(lèi)似,只是這里用戶(hù)可以指定Spoke大小。這里代價(jià)就是插入的時(shí)候可能最壞為O(n).
    
      我們公司現(xiàn)在CTimer就是采用Ace的ACE_Timer_Wheel原理設(shè)計(jì)的
      這里有一個(gè)圖更能直觀的描述這種思想:
    
           實(shí)現(xiàn)方式為Vector,list組合。


 二: 本文介紹一種采用linux中斷處理的定時(shí)器設(shè)計(jì)方式  
     此定時(shí)器的查找,刪除,插入都是O(1)
     1) 介紹設(shè)計(jì)原理
     定時(shí)器是基于時(shí)間的中斷函數(shù),即是根據(jù)觸發(fā)時(shí)間來(lái)超時(shí)響應(yīng)。所以只要我們?cè)O(shè)計(jì)一個(gè)基于時(shí)間的Hash算法。只要我們能我們把一個(gè)函數(shù)觸發(fā)時(shí)間全部Hash到此Hash算法的桶中,就實(shí)現(xiàn)了查找,插入,刪除O(1)的操作了,其實(shí)不然基于時(shí)間的hash算法好像挺復(fù)雜,而且桶的數(shù)量太大,內(nèi)存消耗太多,所以把一個(gè)時(shí)間直接Hash代價(jià)太大。是否有一種其他的方式呢,linux中斷處理采用一種類(lèi)似水表計(jì)算水量的方式,方式就是生活中的水表,第一個(gè)指針轉(zhuǎn)一圈后一個(gè)轉(zhuǎn)一格,假設(shè)每一個(gè)圈都是10個(gè)刻度,第一個(gè)圈能表示10,那么第二圈沒(méi)一個(gè)刻度表示第一個(gè)圈的1圈,就能表示10*10, 二個(gè)圈一共就能表示10*10 + 10。 以此類(lèi)推,5個(gè)圈就能表示10^5+10^4+10^3+10^2+10...

      一個(gè)32bits的整數(shù),如果精確到1毫秒,則2^32位可以表示49.3天,而一般服務(wù)器應(yīng)該不會(huì)直接運(yùn)行49.3天,這里我們采用5個(gè)輪子(即圈), 輪子大小分別為256,64,64,64,64 ,輪子依次類(lèi)推表示范圍在0~256, 256~256*64, 256*64~256*64^2, 256*64^2~256*64^3, 256*64^3~256*64^4, 假設(shè)這里精度為n毫秒,第一個(gè)輪子表示n*256秒時(shí)間內(nèi)觸發(fā)函數(shù),第二個(gè)輪子的第二個(gè)插孔則表示n*256*2時(shí)間范圍內(nèi)的,

    2)一些定義:
           A. 輪子,這里采用的輪子與上面介紹的Ace輪子大概一樣,一個(gè)循環(huán)列隊(duì),每一個(gè)插槽你們有一個(gè)雙向鏈表,注意這里鏈表不需要排序,所以在插入的是O(1)的操作。輪子為5個(gè)。

    3)  操作:
           A. Hash算法:這里Hash算法根據(jù)他的多少時(shí)間后觸發(fā),直接Hash得到輪子以及插槽,然后插入到某個(gè)插槽雙向的鏈表中。
           B.定時(shí)器觸發(fā): 定時(shí)器觸發(fā)只會(huì)觸發(fā)第一個(gè)輪子超時(shí)的所有定時(shí)器,因?yàn)楹竺?個(gè)輪子定時(shí)器表示都在前1輪子觸發(fā)完了才會(huì)觸發(fā),所以這里讓后面4個(gè)輪子維護(hù)表示將要發(fā)生的定時(shí)。這里會(huì)根據(jù)當(dāng)?shù)谝粋€(gè)輪子轉(zhuǎn)第幾圈后,第二個(gè)輪子會(huì)把第幾插槽的所有定時(shí)器全部插入到第一個(gè)輪子中,依次類(lèi)推,第二個(gè)輪子轉(zhuǎn)一個(gè)第三個(gè)輪子某個(gè)插槽又會(huì)插入到第二個(gè)輪子中。。。
           
   4)注意的地方:
          A.將一個(gè)定時(shí)器插入到它應(yīng)該所處的定時(shí)器輪子插槽中。
          B.定時(shí)器的遷移,也即將一個(gè)定時(shí)器從它原來(lái)所處的輪子插槽遷移到另一個(gè)輪子插槽中。
          C.超時(shí)響應(yīng)執(zhí)行當(dāng)前已經(jīng)到期的定時(shí)器。

三:編碼實(shí)現(xiàn)
         1) 常量定義
                   
/// define m
#define lnum        5
#define sbits        6
#define ebits        8
#define sbitsize    ( 1 << sbits )
#define ebitsize    ( 1 << ebits )
#define sMask        ( sbitsize- 1)
#define eMask        ( ebitsize -1)

         2) 數(shù)據(jù)結(jié)構(gòu)
                 
 1/// 定時(shí)器指針結(jié)點(diǎn)
 2struct ListNode
 3{
 4    ListNode *next,*prev;
 5}
;
 6
 7///
 8/// 定時(shí)器類(lèi)型
 9/// 

10enum eTimerType
11{
12    eTimer1 = 10,
13    eTimer2 ,
14    eTimer3 
15}
;
16
17/// 
18/// 定時(shí)器結(jié)點(diǎn),tlist表示結(jié)點(diǎn)的指針,expires循環(huán)周期時(shí)間
19/// etime 觸發(fā)周期時(shí)間,pFun觸發(fā)函數(shù).
20/// 

21struct timernode
22{
23    ListNode    tlist;
24    ulong       expires;
25    ulong       etime;
26    void        *pFun;
27    eTimerType  eType;
28}
;
  3) 輪子類(lèi)
                     
 1///              
 2/// 一個(gè)輪子,一個(gè)循環(huán)隊(duì)列
 3/// 
 4/// 

 5class CLinkList
 6{
 7
 8public:
 9
10    CLinkList(void);
11
12    CLinkList( int size );
13    
14    ~CLinkList(void);
15    
16    /// 
17    /// 初始化
18    /// 

19    void  init();
20
21    /// 
22    /// 讓指針指向自己
23    /// 

24    void  init_list_self( int  index);
25
26    /// 
27    /// 把news插入到prev,next之間
28    /// 

29    void  insert_listnode(ListNode *news , ListNode* prev , ListNode* next);
30
31    /// 
32    /// 插入到鏈表頭
33    /// 

34    void  insert_head( ListNode* news , ListNode* head );
35
36    ///
37    /// 插入到鏈表尾
38    /// 

39    void  insert_tail( ListNode* news , ListNode* head );
40
41    /// 
42    /// 刪除節(jié)點(diǎn)
43    /// 

44    void  list_del( ListNode* list);
45
46    /// 
47    /// 得到改輪子轉(zhuǎn)到第幾個(gè)插槽
48    ///

49    int        GetIndex( ) const return m_index ;}
50
51    ///
52    /// 更新輪子的插槽
53    ///

54    void       SetIndex(int idx) { m_index = idx  ;}
55
56    /// 
57    /// 得到輪子插槽的指針 
58    ///

59    ListNode*  GetNode(int index) const;
60
61private:
62    ///
63    /// 輪子的插槽數(shù)組
64    /// 

65    ListNode *m_List;  
66    
67    ///
68    /// 輪子當(dāng)前轉(zhuǎn)到的索引
69    /// 

70    int          m_index; 
71
72    ///
73    /// 輪子大小
74    ///

75    int       m_Size;
76
77}
;

         4)定時(shí)器管理類(lèi)
                
定時(shí)器管理類(lèi)


四: 測(cè)試
         通過(guò)本文的介紹可以理解次定時(shí)器的的查找,刪除,插入都是O(1)的復(fù)雜度。

  
/// 游戲事件基類(lèi)
class   CGameEvent
{
public:
    
virtual  long  TimeOut( eTimerType type) = 0;
}
;

測(cè)試?yán)樱?
 1long  Sum1= 0 ;
 2long  Sum2= 0 ;
 3long  Sum3= 0 ;
 4long  Sum = 0;
 5
 6class  CTimerTest : public   CGameEvent
 7{
 8public:
 9    long TimeOut( eTimerType type)
10    {
11        switch ( type)
12        {
13        case eTimer1:
14            std::cout <<"Sum1 = "<< Sum1 ++ << std::endl;
15            break;
16        case eTimer2:
17            std::cout <<"Sum2 = "<< Sum2 ++ << std::endl;
18            break;
19        case eTimer3:
20            std::cout <<"Sum3 = "<< Sum3 ++ << std::endl;
21            break;
22        default:
23            std::cout <<"Sum  = "<< Sum ++ << std::endl;
24            break;
25        }

26        return 0;
27    }

28}
;
29
30int _tmain(int argc, _TCHAR* argv[])
31{
32    CTimer  mytimer( 40 );
33    
34    long    n;
35    std::cin >> n;
36    CTimerTest test;
37    for ( int i = 0 ; i < n ; i++ )
38    {
39        timernode* tim = new timernode ;
40        tim->expires  = 0;
41        tim->etime    = GetCurrSystemTime() + (rand() % 1000 ) * 6;
42        tim->pFun     =&test;
43        tim->eType    =(eTimerType)( i%3 + 10 );
44
45        mytimer.add_timer( tim );
46    }

47
48    for ( ;; )
49    {
50        if ( (Sum1 + Sum2 + Sum3) == n )
51            break;
52
53        /// 運(yùn)行所有的定時(shí)器
54        mytimer.Expires( GetCurrSystemTime() );
55    }

56
57    std::cout << " sum1 = " << Sum1 
58              << " sum2 = " << Sum2 
59              << " sum3 = " << Sum3 
60              << " sum  = " << Sum ;
61    return 0;
62}

63

上面的具體代碼:http://code.google.com/p/tpgame/source/browse/#svn/trunk/CTimer/CTimer


最近2篇學(xué)習(xí)筆記將介紹:
1.參考多種內(nèi)存管理模型的自己寫(xiě)的內(nèi)存管理模塊。
2.最近學(xué)習(xí)的Ai算法總匯。

posted on 2010-03-05 16:28 expter 閱讀(9173) 評(píng)論(12)  編輯 收藏 引用 所屬分類(lèi): 工作筆記算法與數(shù)據(jù)結(jié)構(gòu)

評(píng)論

# re: 一種高效的定時(shí)器設(shè)計(jì) 2010-03-05 21:42 expter

整了半天,格式有點(diǎn)問(wèn)題,現(xiàn)在看了下還是有點(diǎn)問(wèn)題。。  回復(fù)  更多評(píng)論   

# re: 一個(gè)高效的定時(shí)器分析及設(shè)計(jì) 2010-03-07 22:59 何清龍

沒(méi)關(guān)系。
因?yàn)橛袉?wèn)題,才會(huì)需要C++程序員。哈哈  回復(fù)  更多評(píng)論   

# re: 一個(gè)高效的定時(shí)器分析及設(shè)計(jì) 2010-03-07 23:08 hr

我們公司有游戲職位,是否有興趣。
已經(jīng)聯(lián)系你了:)  回復(fù)  更多評(píng)論   

# re: 一個(gè)高效的定時(shí)器分析及設(shè)計(jì) 2010-03-08 10:01 何清龍

想過(guò)了,我技術(shù)還不夠,時(shí)間也不充裕。謝謝好意。  回復(fù)  更多評(píng)論   

# re: 一個(gè)高效的定時(shí)器分析及設(shè)計(jì) 2010-03-08 16:00 expter

@何清龍
你在說(shuō)什么哦。。。  回復(fù)  更多評(píng)論   

# re: 一個(gè)高效的定時(shí)器分析及設(shè)計(jì) 2010-03-23 18:33 guest

>>這里會(huì)根據(jù)當(dāng)?shù)谝粋€(gè)輪子轉(zhuǎn)第幾圈后,第二個(gè)輪子會(huì)把第幾插槽的所有定時(shí)器全部插入到第一個(gè)輪子中

有個(gè)疑問(wèn)。。假設(shè)第二個(gè)輪子的第幾插槽上的定時(shí)器有100個(gè),要對(duì)這100個(gè)定時(shí)器全部hash一遍,才插入到第一個(gè)輪子對(duì)應(yīng)的插槽吧?

這樣貌似的消耗還是有點(diǎn)大  回復(fù)  更多評(píng)論   

# re: 一個(gè)高效的定時(shí)器分析及設(shè)計(jì) 2010-03-23 22:17 expter

@guest
不會(huì)的,而且定時(shí)器的代價(jià)主要在遍歷響應(yīng)超時(shí)定時(shí)器結(jié)點(diǎn)。
而且插入式線(xiàn)性的,我做過(guò)測(cè)試對(duì)于100W個(gè)定時(shí)器插入時(shí)間不到1S。。。  回復(fù)  更多評(píng)論   

# re: 一個(gè)高效的定時(shí)器分析及設(shè)計(jì) 2010-03-24 00:00 guest

@expter
想了一下,第2輪子要等第一個(gè)輪子轉(zhuǎn)動(dòng)一圈之后才會(huì)轉(zhuǎn)動(dòng)一次,總體來(lái)說(shuō)還是接近O(1)。。。

借鑒樓主的思路了:)  回復(fù)  更多評(píng)論   

# re: 一個(gè)高效的定時(shí)器分析及設(shè)計(jì) 2012-04-01 16:51 醬油男

就像鐘表的時(shí)分秒針一樣會(huì)遇到0點(diǎn)問(wèn)題,三針重合會(huì)遍歷處理所有鏈表。  回復(fù)  更多評(píng)論   

# re: 一個(gè)高效的定時(shí)器分析及設(shè)計(jì) 2013-07-24 08:33 =XTK

很好的設(shè)計(jì),如果我想中途中止這個(gè)定時(shí)器,那還沒(méi)有這個(gè)接口..不過(guò)我準(zhǔn)備自己加上,準(zhǔn)備用人你的這份設(shè)計(jì)啦..很好很強(qiáng)大..  回復(fù)  更多評(píng)論   

# re: 一個(gè)高效的定時(shí)器分析及設(shè)計(jì) 2014-01-03 16:38 simaocat

你好,請(qǐng)問(wèn)主函數(shù)中CTimer mytimer( 40 );這個(gè)40代表什么意思呢,為什么算expires時(shí)間的時(shí)候要除以這個(gè)40, 其單位是秒還是毫秒  回復(fù)  更多評(píng)論   

# re: 一個(gè)高效的定時(shí)器分析及設(shè)計(jì) 2015-05-28 20:16 aaa

http://code.google.com/p/tpgame/source/browse/#svn/trunk/CTimer/CTimer
這個(gè)網(wǎng)址打不開(kāi)啊!  回復(fù)  更多評(píng)論   

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产在线麻豆精品观看| 亚洲高清不卡在线| 国产精品久久九九| 国产精品专区h在线观看| 激情欧美日韩一区| 一区二区三区精品视频| 亚洲欧美日韩天堂一区二区| 欧美在线一区二区| 亚洲国产成人av| 亚洲深夜av| 久久久久久久久一区二区| 欧美好骚综合网| 亚洲欧美日韩国产综合| 蜜臀av国产精品久久久久| 国产精品久久久999| 久久国产精品黑丝| 老司机午夜免费精品视频| 国产亚洲精品福利| 亚洲欧美日韩区| 久久亚洲综合色一区二区三区| 国产精品久久久久99| 久久久精品网| 欧美久久久久久久久| 加勒比av一区二区| 亚洲精品中文字幕女同| 久久激情综合| 国产精品一级二级三级| 欧美 日韩 国产 一区| 久久成人久久爱| 宅男噜噜噜66一区二区| 久久电影一区| 亚洲欧美久久久| 欧美不卡高清| 亚洲欧美日韩视频一区| 亚洲精品乱码久久久久久久久| 久久成人综合网| 亚洲色图自拍| 欧美不卡视频一区发布| 久久国产精品72免费观看| 欧美精品激情在线观看| 一本色道久久精品| 日韩一级黄色片| 欧美色图五月天| 亚洲视频香蕉人妖| 美日韩精品免费观看视频| 久久爱www久久做| 国产精品久久久久久久app| 欧美激情一级片一区二区| 国产亚洲欧美日韩精品| 一区二区三区高清在线| 国产精品欧美激情| 久久久国产91| 国产日产高清欧美一区二区三区| 久久精品亚洲国产奇米99| 久久精品日产第一区二区三区| 亚洲二区在线视频| 久久9热精品视频| 亚洲欧洲精品一区二区三区不卡| 亚洲第一精品夜夜躁人人爽| 国内揄拍国内精品久久| 亚洲国产乱码最新视频| 欧美日韩一区在线播放| 亚洲欧美日韩一区二区三区在线| 欧美噜噜久久久xxx| 亚洲激情成人在线| 国内自拍一区| 久久av资源网| 免费成人小视频| 欧美视频四区| 亚洲一区二区三区久久| 黑人一区二区| 久久综合九色综合欧美就去吻 | 美女啪啪无遮挡免费久久网站| 久久久久久噜噜噜久久久精品| 欧美暴力喷水在线| 亚洲另类视频| 性色av香蕉一区二区| 免费中文字幕日韩欧美| 欧美在线观看一二区| 欧美激情精品久久久久久免费印度 | 久久精品电影| 欧美chengren| 一区二区三区www| 国产精品毛片| 久久久久久噜噜噜久久久精品| 亚洲在线中文字幕| 欧美aaaaaaaa牛牛影院| 亚洲精品日日夜夜| 欧美一级午夜免费电影| 一区二区在线看| 欧美日韩国产成人| 亚洲高清av在线| 亚洲——在线| 尤物在线精品| 久久久久久久网站| 9国产精品视频| 欧美激情按摩在线| 亚洲电影av| 欧美一级视频| 欧美在线播放一区| 亚洲人成网站在线播| 国产精品女主播在线观看| 久热精品在线| 亚洲免费在线视频| 午夜亚洲激情| 国产精品美女久久| 免费观看国产成人| 午夜精品久久久久久久男人的天堂 | 午夜一区二区三区不卡视频| 黑人一区二区三区四区五区| 欧美视频在线一区二区三区| 久久精品在线播放| 亚洲综合日韩| 亚洲美女黄网| 亚洲福利国产精品| 久久综合中文| 亚洲狠狠丁香婷婷综合久久久| 久久夜色精品一区| 午夜一级久久| 免费在线看一区| 久久本道综合色狠狠五月| 日韩视频在线观看国产| 欧美日韩在线不卡| 免费看的黄色欧美网站| 久久9热精品视频| 午夜在线观看免费一区| 日韩视频在线一区| 亚洲国产色一区| 欧美.日韩.国产.一区.二区| 久久狠狠一本精品综合网| 亚洲欧美日韩在线观看a三区| 一本色道久久88综合日韩精品| 亚洲国产一区二区三区a毛片| 国内成人在线| 黄色一区二区三区四区| 国产午夜精品一区二区三区欧美 | 一区二区日本视频| 99精品国产在热久久下载| 91久久精品美女高潮| 亚洲国产婷婷| 亚洲日本欧美| 国产欧美婷婷中文| 国产精品一区久久| 国产精品一区免费视频| 国产日韩综合| 好吊色欧美一区二区三区四区| 国产一区二区三区在线免费观看| 国产欧美日韩亚洲一区二区三区| 国产免费一区二区三区香蕉精| 国产精品亚洲综合| 欧美大秀在线观看| 欧美美女福利视频| 欧美性开放视频| 免费中文字幕日韩欧美| 欧美伦理在线观看| 国产精品亚洲一区二区三区在线| 国产伦精品一区二区三区视频孕妇| 国产精品一区久久久久| 加勒比av一区二区| 亚洲精品在线观看免费| 韩国v欧美v日本v亚洲v | 欧美精品在线视频观看| 欧美男人的天堂| 国产精品永久免费视频| 久久精品99无色码中文字幕 | 亚洲电影激情视频网站| 亚洲毛片视频| 久久电影一区| 欧美婷婷久久| 在线播放日韩欧美| 一本色道久久| 噜噜噜躁狠狠躁狠狠精品视频 | 日韩亚洲欧美精品| 欧美亚洲一区三区| 欧美二区不卡| 国产亚洲精品久久久久久| 最新日韩av| 欧美亚洲综合网| 欧美激情视频在线播放| 亚洲一区中文字幕在线观看| 久久久久免费| 国产精品久久9| 亚洲免费观看高清完整版在线观看熊| 亚洲欧美日韩中文在线制服| 免费在线欧美黄色| 亚洲欧美国产制服动漫| 欧美国产丝袜视频| 国内伊人久久久久久网站视频| 亚洲视频一区在线| 女同性一区二区三区人了人一 | 亚洲小视频在线观看| 91久久精品网| 欧美在线视频一区| 欧美日韩国产综合网 | 欧美日韩国产天堂| 亚洲国产高清视频| 久久久精品久久久久| 亚洲欧美成人一区二区在线电影 | 欧美在线黄色| 国产精品资源|