scheduleUpdate的原始碼分析

2021-09-25 21:00:22 字數 2818 閱讀 6021

遊戲中,通過定時器實現畫面和動作的更新.

用到的就是系統的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...