Bootstrap

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定时器,如果已存在则更新优先级。

;