Cocos2d-x C++ Scheduler、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類實現,引擎給出了兩個實現,請參考TimerTargetSelectorTimerTargetCallback

屬性介紹

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類實現,引擎給出了兩個實現,請參考TimerTargetSelectorTimerTargetCallback

屬性介紹

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

調用定時任務時,指向當前正在調用的定時器。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章