遊戲中,通過定時器實現畫面和動作的更新.
用到的就是系統的ccschedule類.
下面就會談一下計時器的實現機制.
scheduler =
new(std::nothrow)
scheduler()
; _actionmanager =
new(std::nothrow)
actionmanager()
; _scheduler-
>
scheduleupdate
(_actionmanager, scheduler::priority_system,
false
);
下面就先來看一下scheduleupdate這個函式.
template
<
class
t>
void
scheduleupdate
(t *target,
int priority,
bool paused)
, target, priority, paused)
;}
傳入的三個引數含義分別為需要更新的目標,優先順序(用來比較),是否需要暫停.
可以看到,每一幀都呼叫了scheduleperframe來對優先順序進行排名.
然後呼叫了update函式來更新自己.
void scheduler::
scheduleperframe
(const ccschedulerfunc& callback,
void
*target,
int priority,
bool paused)
else
}// most of the updates are going to be 0, that's way there
// is an special list for updates with priority 0
if(priority ==0)
else
if(priority <0)
else
}
thashupdateentry是乙個結構體,它的定義如下:
typedef
struct _hashupdateentry
thashupdateentry;
裡面有巢狀了乙個結構體tlistentry;
typedef
struct _listentry
tlistentry;
很容易發現這是乙個雙鏈表
hashupdateentry用來快速檢索雙鏈表.
struct _listentry *_updatesneglist;
// list of priority < 0
struct _listentry *_updates0list;
// list priority == 0
struct _listentry *_updatesposlist;
// list priority > 0
void scheduler::
priorityin
(tlistentry *
*list,
const ccschedulerfunc& callback,
void
*target,
int priority,
bool paused)
else
else
added =
true
;break;}
}if(! added)
}// update hash entry for quick access
thashupdateentry *hashelement =
(thashupdateentry *
)calloc
(sizeof
(*hashelement),1
);hashelement-
>target = target;
hashelement-
>list = list;
hashelement-
>entry = listelement;
memset
(&hashelement-
>hh,0,
sizeof
(hashelement-
>hh));
hash_add_ptr
(_hashforupdates, target, hashelement);}
void scheduler::
(_listentry *
*list,
const ccschedulerfunc& callback,
void
*target,
bool paused)
通過比較可以發現區別:
乙個是按優先順序插入,另乙個是直接加入鍊錶尾.
呼叫了target對應的update函式來實現具體的更新邏輯,這樣,
定時器的部分就講完了.
另外,還有系統自定義的schedule,裡面用到了timer類,實現上
也大同小異.
schedule通過每幀呼叫,來比較並插入鍊錶,
從而實現對優先順序序列的排序,以此來管理更新的順序.
整個流程差不多就這樣了,有疏漏再補充吧.
部落格首發於github
container of 的的的原理
另外一篇,同樣精彩,揭開linux核心中container of的神秘面紗 華清遠見嵌入式學院講師。在linux 核心中有乙個大名鼎鼎的巨集container of 這個巨集是用來幹嘛的呢?我們先來看看它在核心中是怎樣定義的。呵呵,乍一看不知道是什麼東東。我們先來分析一下container of p...
存在的就是合理的,發生的即是必然的。
筆者有時候會想,什麼是對,什麼是錯?對於追求某一件事情之前首先會考慮,為什麼我要做這件事情。所以經過自我分析和生活周邊環境的總結。我認為,對於乙個人來,這是在站在個體的角度上說。什麼是對的?就是你自己覺得是對的,它就是對的。不過這個只是你自己的想法。主觀上的正確,不代表客觀上也受到了別人的認可。就拿...
Apache的rewrite的重寫相關的引數
apache mod rewrite規則重寫的標誌一覽 使用mod rewrite時常用的伺服器變數 rewriterule規則表示式的說明 匹配任何單字元 chars 匹配字串 chars chars 不匹配字串 chars text1 text2 可選擇的字串 text1或text2 匹配0到1...