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

调用定时任务时,指向当前正在调用的定时器。

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