文章目錄
- Scheduler
- 簡介
- 屬性介紹
- time scale
- updates neg/0/pos list
- hash for updates/timers
- update delete vector
- current target
- current target salvaged
- update hash locked
- functions to perform
- 函數介紹
- void schedule(const ccSchedulerFunc& callback, void *target, float interval, unsigned int repeat, float delay, bool paused, const string& key)
- void unschedule(const string &key, void *target)
- void priorityIn(tListEntry **list, const ccSchedulerFunc& callback, void *target, int priority, bool paused)
- void appendIn(_listEntry **list, const ccSchedulerFunc& callback, void *target, bool paused)
- void schedulePerFrame(const ccSchedulerFunc& callback, void *target, int priority, bool paused)
- void removeUpdateFromHash(tListEntry *entry)
- void update(float dt)
- Timer
- 涉及結構
- Scheduler
- 簡介
- 屬性介紹
- time scale
- updates neg/0/pos list
- hash for updates/timers
- update delete vector
- current target
- current target salvaged
- update hash locked
- functions to perform
- 函數介紹
- void schedule(const ccSchedulerFunc& callback, void *target, float interval, unsigned int repeat, float delay, bool paused, const string& key)
- void unschedule(const string &key, void *target)
- void priorityIn(tListEntry **list, const ccSchedulerFunc& callback, void *target, int priority, bool paused)
- void appendIn(_listEntry **list, const ccSchedulerFunc& callback, void *target, bool paused)
- void schedulePerFrame(const ccSchedulerFunc& callback, void *target, int priority, bool paused)
- void removeUpdateFromHash(tListEntry *entry)
- void update(float dt)
- Timer
- 涉及結構
Scheduler
簡介
Scheduler(調度器)是引擎的核心組件之一,管理全局生命週期中的Timer(定時器)。同時,引擎中大部分延遲、定時執行的功能(比如Action、SocketIO心跳包、下載文件更新進度)也是通過Scheduler調度的。
調度器可以設置兩種定時任務:update selector 和 custom selector。其中custom selector可以自定義定時執行的間隔時間,而update selector固定每幀調用一次,但update selector擁有更好的性能和更少的內存佔用。
屬性介紹
time scale
時間縮放,影響所有的定時器(包括Action),值越大定時器執行的越快。
updates neg/0/pos list
根據優先級分開存儲的記錄了定時update的雙向鏈表,用於快速遍歷update任務。
hash for updates/timers
update/timer hash表的頭節點,通過這個節點進行hash表的查詢。
update delete vector
在Scheduler的update期間取消update定時器時,不會立刻移除而是放在此數組中,之後在Scheduler的update末尾再進行刪除。如果立刻刪除當前的update,就會導致無法根據next指針找到下一個update。
current target
指向當前正在執行定時任務的節點。
current target salvaged
當前節點時候不再需要,如果節點所有的定時器都被取消,節點會被從hash表中移除以提升性能。
update hash locked
當前是否在Scheduler的update狀態。
functions to perform
需要在Scheduler的update末尾時調用的函數列表,添加和刪除操作是線程安全的,一般用於在其他線程中調用主函數的回調。
函數介紹
void schedule(const ccSchedulerFunc& callback, void *target, float interval, unsigned int repeat, float delay, bool paused, const string& key)
新建一個自定義的定時器,如果已存在則更新信息。
void unschedule(const string &key, void *target)
移除一個自定義定時器,移除後如果節點目標沒有任何定時器則將這個節點從hash表中移除。
void priorityIn(tListEntry **list, const ccSchedulerFunc& callback, void *target, int priority, bool paused)
將一個update定時器根據優先級插入到指定的list中。
void appendIn(_listEntry **list, const ccSchedulerFunc& callback, void *target, bool paused)
將一個update定時器直接插入到指定的list中,用於優先級爲0的列表。
void schedulePerFrame(const ccSchedulerFunc& callback, void *target, int priority, bool paused)
新建一個update定時器,如果已存在則更新優先級。
void removeUpdateFromHash(tListEntry *entry)
移除一個update定時器,如果正處於update階段則暫時不刪除,而將節點加入待刪除數組中等Scheduler的update末尾再進行刪除。
void update(float dt)
每幀對定時器進行調度。首先根據time scale將經過時間進行縮放,隨後根據優先級從小到大調用所有的update,之後遍歷調用所有的timer,調用完畢後對update過程中需要刪除的update進行刪除,隨後調用所有的線程安全的函數回調。
Timer
簡介
Timer(定時器)是引擎定時執行任務的基礎實現,Timer只用於處理單個定時任務,定時器的管理請參閱Scheduler。Timer是一個虛類,定時執行的具體內容與定時器取消時執行的內容需要通過繼承Timer類實現,引擎給出了兩個實現,請參考TimerTargetSelector和TimerTargetCallback。
屬性介紹
scheduler
對執行定時器的Scheduler的弱引用(不會增加引用計數),默認情況下只有一個全局的Scheduler。
elapsed
距離上一次定時任務執行過去的時間,單位爲毫秒。
run forever
是否重複無限次執行定時任務。
use delay
是否有第一次執行的延遲時間。
times executed
定時任務的執行次數。
repeat
需要重複執行的次數(不包括第一次執行的次數)。
delay
第一次執行的延遲時間。
interval
定時執行的間隔時間,0代表每幀執行。
aborted
定時器是否終止,已終止的定時器不能再次使用。
函數介紹
bool isExhausted()
判斷定時器是否運行完畢。
void trigger(float dt)
定時執行的函數,dt爲距離上次執行的毫秒間隔。
void cancel()
定時器執行結束時執行的函數。
void update(float dt)
由Scheduler每幀調用,根據距離上幀經過的毫秒時間調整定時任務的狀態(執行定時任務、結束定時任務等)。
子類實現
TimerTargetSelector
使用函數指針來記錄需要定時調用的函數的定時器實現。優勢在於進行查找時可以直接根據函數指針進行查找,但不支持c++11的lambda表達式。
TimerTargetCallback
爲了支持lambda表達式而使用字符串作爲查找標準的定時器實現。
涉及結構
ccSchedulerFunc
typedef std::function<void(float)> ccSchedulerFunc;
主要用於lambda表達式的類型。
tListEntry
typedef struct _listEntry
{
struct _listEntry *prev, *next;
ccSchedulerFunc callback;
void *target;
int priority;
bool paused;
bool markedForDeletion;
} tListEntry;
雙向鏈表結構的節點,記錄了某節點的定時update的基本信息。
callback
在定時任務觸發時調用,此函數僅調用目標的update函數。
target
指向目標的指針,通常情況目標是創建定時器的節點。
priority
執行的優先級,優先級越小越先執行。
paused
任務是否暫停(通常取決於節點是否在正在運行的場景上)。
marked for deletion
是否被標記爲刪除。被標記的任務會在下一幀的Scheduler的update末尾被刪除(下一幀不會執行這個定時任務)。
tHashUpdateEntry
typedef struct _hashUpdateEntry
{
tListEntry **list;
tListEntry *entry;
void *target;
ccSchedulerFunc callback;
UT_hash_handle hh;
} tHashUpdateEntry;
存儲需要執行update的單個節點的任務信息。
list
指向定時任務列表的指針,但實際上一個節點只能有一個update函數,因此在正常情況下大小最大爲1。
entry
指向最後一個插入的定時任務節點的指針。
hh
存儲信息的hash表,用於根據target指針快速查找節點後。
tHashTimerEntry
typedef struct _hashSelectorEntry
{
ccArray *timers;
void *target;
int timerIndex;
Timer *currentTimer;
bool paused;
UT_hash_handle hh;
} tHashTimerEntry;
存儲需要執行自定義定時任務的單個節點的任務信息。
timers
存儲需要執行的定時任務數組。
timerIndex
調用定時任務時,存儲調用任務所在數組的下標。
currentTimer
調用定時任務時,指向當前正在調用的定時器。[TOC]
Scheduler
簡介
Scheduler(調度器)是引擎的核心組件之一,管理全局生命週期中的Timer(定時器)。同時,引擎中大部分延遲、定時執行的功能(比如Action、SocketIO心跳包、下載文件更新進度)也是通過Scheduler調度的。
調度器可以設置兩種定時任務:update selector 和 custom selector。其中custom selector可以自定義定時執行的間隔時間,而update selector固定每幀調用一次,但update selector擁有更好的性能和更少的內存佔用。
屬性介紹
time scale
時間縮放,影響所有的定時器(包括Action),值越大定時器執行的越快。
updates neg/0/pos list
根據優先級分開存儲的記錄了定時update的雙向鏈表,用於快速遍歷update任務。
hash for updates/timers
update/timer hash表的頭節點,通過這個節點進行hash表的查詢。
update delete vector
在Scheduler的update期間取消update定時器時,不會立刻移除而是放在此數組中,之後在Scheduler的update末尾再進行刪除。如果立刻刪除當前的update,就會導致無法根據next指針找到下一個update。
current target
指向當前正在執行定時任務的節點。
current target salvaged
當前節點時候不再需要,如果節點所有的定時器都被取消,節點會被從hash表中移除以提升性能。
update hash locked
當前是否在Scheduler的update狀態。
functions to perform
需要在Scheduler的update末尾時調用的函數列表,添加和刪除操作是線程安全的,一般用於在其他線程中調用主函數的回調。
函數介紹
void schedule(const ccSchedulerFunc& callback, void *target, float interval, unsigned int repeat, float delay, bool paused, const string& key)
新建一個自定義的定時器,如果已存在則更新信息。
void unschedule(const string &key, void *target)
移除一個自定義定時器,移除後如果節點目標沒有任何定時器則將這個節點從hash表中移除。
void priorityIn(tListEntry **list, const ccSchedulerFunc& callback, void *target, int priority, bool paused)
將一個update定時器根據優先級插入到指定的list中。
void appendIn(_listEntry **list, const ccSchedulerFunc& callback, void *target, bool paused)
將一個update定時器直接插入到指定的list中,用於優先級爲0的列表。
void schedulePerFrame(const ccSchedulerFunc& callback, void *target, int priority, bool paused)
新建一個update定時器,如果已存在則更新優先級。
void removeUpdateFromHash(tListEntry *entry)
移除一個update定時器,如果正處於update階段則暫時不刪除,而將節點加入待刪除數組中等Scheduler的update末尾再進行刪除。
void update(float dt)
每幀對定時器進行調度。首先根據time scale將經過時間進行縮放,隨後根據優先級從小到大調用所有的update,之後遍歷調用所有的timer,調用完畢後對update過程中需要刪除的update進行刪除,隨後調用所有的線程安全的函數回調。
Timer
簡介
Timer(定時器)是引擎定時執行任務的基礎實現,Timer只用於處理單個定時任務,定時器的管理請參閱Scheduler。Timer是一個虛類,定時執行的具體內容與定時器取消時執行的內容需要通過繼承Timer類實現,引擎給出了兩個實現,請參考TimerTargetSelector和TimerTargetCallback。
屬性介紹
scheduler
對執行定時器的Scheduler的弱引用(不會增加引用計數),默認情況下只有一個全局的Scheduler。
elapsed
距離上一次定時任務執行過去的時間,單位爲毫秒。
run forever
是否重複無限次執行定時任務。
use delay
是否有第一次執行的延遲時間。
times executed
定時任務的執行次數。
repeat
需要重複執行的次數(不包括第一次執行的次數)。
delay
第一次執行的延遲時間。
interval
定時執行的間隔時間,0代表每幀執行。
aborted
定時器是否終止,已終止的定時器不能再次使用。
函數介紹
bool isExhausted()
判斷定時器是否運行完畢。
void trigger(float dt)
定時執行的函數,dt爲距離上次執行的毫秒間隔。
void cancel()
定時器執行結束時執行的函數。
void update(float dt)
由Scheduler每幀調用,根據距離上幀經過的毫秒時間調整定時任務的狀態(執行定時任務、結束定時任務等)。
子類實現
TimerTargetSelector
使用函數指針來記錄需要定時調用的函數的定時器實現。優勢在於進行查找時可以直接根據函數指針進行查找,但不支持c++11的lambda表達式。
TimerTargetCallback
爲了支持lambda表達式而使用字符串作爲查找標準的定時器實現。
涉及結構
ccSchedulerFunc
typedef std::function<void(float)> ccSchedulerFunc;
主要用於lambda表達式的類型。
tListEntry
typedef struct _listEntry
{
struct _listEntry *prev, *next;
ccSchedulerFunc callback;
void *target;
int priority;
bool paused;
bool markedForDeletion;
} tListEntry;
雙向鏈表結構的節點,記錄了某節點的定時update的基本信息。
callback
在定時任務觸發時調用,此函數僅調用目標的update函數。
target
指向目標的指針,通常情況目標是創建定時器的節點。
priority
執行的優先級,優先級越小越先執行。
paused
任務是否暫停(通常取決於節點是否在正在運行的場景上)。
marked for deletion
是否被標記爲刪除。被標記的任務會在下一幀的Scheduler的update末尾被刪除(下一幀不會執行這個定時任務)。
tHashUpdateEntry
typedef struct _hashUpdateEntry
{
tListEntry **list;
tListEntry *entry;
void *target;
ccSchedulerFunc callback;
UT_hash_handle hh;
} tHashUpdateEntry;
存儲需要執行update的單個節點的任務信息。
list
指向定時任務列表的指針,但實際上一個節點只能有一個update函數,因此在正常情況下大小最大爲1。
entry
指向最後一個插入的定時任務節點的指針。
hh
存儲信息的hash表,用於根據target指針快速查找節點後。
tHashTimerEntry
typedef struct _hashSelectorEntry
{
ccArray *timers;
void *target;
int timerIndex;
Timer *currentTimer;
bool paused;
UT_hash_handle hh;
} tHashTimerEntry;
存儲需要執行自定義定時任務的單個節點的任務信息。
timers
存儲需要執行的定時任務數組。
timerIndex
調用定時任務時,存儲調用任務所在數組的下標。
currentTimer
調用定時任務時,指向當前正在調用的定時器。