Scheduler(调度器)是引擎的核心组件之一,管理全局生命周期中的Timer(定时器)。同时,引擎中大部分延迟、定时执行的功能(比如Action、SocketIO心跳包、下载文件更新进度)也是通过Scheduler调度的。
调度器可以设置两种定时任务:update selector 和 custom selector。其中custom selector可以自定义定时执行的间隔时间,而update selector固定每帧调用一次,但update selector拥有更好的性能和更少的内存占用。
时间缩放,影响所有的定时器(包括Action),值越大定时器执行的越快。
根据优先级分开存储的记录了定时update的双向链表,用于快速遍历update任务。
update/timer hash表的头节点,通过这个节点进行hash表的查询。
在Scheduler的update期间取消update定时器时,不会立刻移除而是放在此数组中,之后在Scheduler的update末尾再进行删除。如果立刻删除当前的update,就会导致无法根据next指针找到下一个update。
指向当前正在执行定时任务的节点。
当前节点时候不再需要,如果节点所有的定时器都被取消,节点会被从hash表中移除以提升性能。
当前是否在Scheduler的update状态。
需要在Scheduler的update末尾时调用的函数列表,添加和删除操作是线程安全的,一般用于在其他线程中调用主函数的回调。
新建一个自定义的定时器,如果已存在则更新信息。
移除一个自定义定时器,移除后如果节点目标没有任何定时器则将这个节点从hash表中移除。
将一个update定时器根据优先级插入到指定的list中。
将一个update定时器直接插入到指定的list中,用于优先级为0的列表。
新建一个update定时器,如果已存在则更新优先级。
移除一个update定时器,如果正处于update阶段则暂时不删除,而将节点加入待删除数组中等Scheduler的update末尾再进行删除。
每帧对定时器进行调度。首先根据time scale将经过时间进行缩放,随后根据优先级从小到大调用所有的update,之后遍历调用所有的timer,调用完毕后对update过程中需要删除的update进行删除,随后调用所有的线程安全的函数回调。
Timer(定时器)是引擎定时执行任务的基础实现,Timer只用于处理单个定时任务,定时器的管理请参阅Scheduler。Timer是一个虚类,定时执行的具体内容与定时器取消时执行的内容需要通过继承Timer类实现,引擎给出了两个实现,请参考TimerTargetSelector和TimerTargetCallback。
对执行定时器的Scheduler的弱引用(不会增加引用计数),默认情况下只有一个全局的Scheduler。
距离上一次定时任务执行过去的时间,单位为毫秒。
是否重复无限次执行定时任务。
是否有第一次执行的延迟时间。
定时任务的执行次数。
需要重复执行的次数(不包括第一次执行的次数)。
第一次执行的延迟时间。
定时执行的间隔时间,0代表每帧执行。
定时器是否终止,已终止的定时器不能再次使用。
判断定时器是否运行完毕。
定时执行的函数,dt为距离上次执行的毫秒间隔。
定时器执行结束时执行的函数。
由Scheduler每帧调用,根据距离上帧经过的毫秒时间调整定时任务的状态(执行定时任务、结束定时任务等)。
使用函数指针来记录需要定时调用的函数的定时器实现。优势在于进行查找时可以直接根据函数指针进行查找,但不支持c++11的lambda表达式。
为了支持lambda表达式而使用字符串作为查找标准的定时器实现。
typedef std::function<void(float)> ccSchedulerFunc;
主要用于lambda表达式的类型。
typedef struct _listEntry
{
struct _listEntry *prev, *next;
ccSchedulerFunc callback;
void *target;
int priority;
bool paused;
bool markedForDeletion;
} tListEntry;
双向链表结构的节点,记录了某节点的定时update的基本信息。
在定时任务触发时调用,此函数仅调用目标的update函数。
指向目标的指针,通常情况目标是创建定时器的节点。
执行的优先级,优先级越小越先执行。
任务是否暂停(通常取决于节点是否在正在运行的场景上)。
是否被标记为删除。被标记的任务会在下一帧的Scheduler的update末尾被删除(下一帧不会执行这个定时任务)。
typedef struct _hashUpdateEntry
{
tListEntry **list;
tListEntry *entry;
void *target;
ccSchedulerFunc callback;
UT_hash_handle hh;
} tHashUpdateEntry;
存储需要执行update的单个节点的任务信息。
指向定时任务列表的指针,但实际上一个节点只能有一个update函数,因此在正常情况下大小最大为1。
指向最后一个插入的定时任务节点的指针。
存储信息的hash表,用于根据target指针快速查找节点后。
typedef struct _hashSelectorEntry
{
ccArray *timers;
void *target;
int timerIndex;
Timer *currentTimer;
bool paused;
UT_hash_handle hh;
} tHashTimerEntry;
存储需要执行自定义定时任务的单个节点的任务信息。
存储需要执行的定时任务数组。
调用定时任务时,存储调用任务所在数组的下标。
调用定时任务时,指向当前正在调用的定时器。