cocos 的CCScheduler模块

scheduleSelector函数-》查找m_pHashForTimers是否有存储回调的Obj类实例,否,创建新条目tHashTimerEntry,指向回调类实例,tHashTimerEntry中有个属性存储timer数组,调用CCTimer的initWithTarget函数,初始化计时器实例。


CCScheduler模块的update会遍历所有条目,获取条目中存储的单条计时器实例,调用计时器实例的update函数。计时器的update会判断传入的时间是否能够触发调用,进而调用obj实例的回调函数,若timer中存在脚本处理器,则进行脚本调用。


CCScheduler定义所有的计时器调用,CCDirector则是在初始化的时候,通过m_pScheduler->scheduleUpdateForTarget(m_pActionManager, kCCPrioritySystem, false);将CCActionManger加入了计时器调用。所以CCDirect调用暂停接口的时候,通过CCScheduler不仅暂停了所有的动作,也暂停了所有的计时器。若想只是暂停动作,需要调用动作管理器的暂停所有动作的接口,pauseAllRunningActions;


注意每个Node获得的CCActionManger都是同一个实例,指向CCDirector


js的schedule函数:

会创建target,类型为JSScheduleWrapper,并把node对应的jsobj和回调函数对应的jsobj存入类中,当schedule定时调用静态函数scheduleFunc时候,会调用回调函数,把node作为函数this,tick作为参数。

下面看看JSScheduleWrapper在c++层面的逻辑:

node获取getScheduler,获取的schedule调用scheduleSelector,把selector和创建的target加入计时器列表;


如何避免同一个node,重复创建target:

JSScheduleWrapper的静态函数getTargetForJSObject可以查找node对应的obj所已经保存的targetarray,然后遍历之,找出target的回调js函数与传入的回调js一致的target,

存在,就不创建新的target,不存在,则创建新的target


新的target会调用setTarget保存调用的node,调用setTargetForSchedule保存回调js到target列表的映射,在删除的时候,根据回调js找到target列表,遍历target,比较getTarget保存的node,然后一致的删除;

之所以这么复杂,因为两个node可能定时调用同一个js函数,同一个node可能定时调用多个js,所以node和js回调两个一起才能做key。


node的unschedule

传入js回调,只是把target中的一个timer删除的,target还在,

target的删除时在循环中,对target的selector调用后,循环末尾里面, if (m_bCurrentTargetSalvaged && m_pCurrentTarget->timers->num == 0)判断通过的时候删除,

m_bCurrentTargetSalvaged 是代表是否回收遍历的target的,搜索时候发现,在unschedule的时候,如果发现target的timers为0,就要回收;因而通过判断,就好删除target节点。


节点删除时候的计时器回收:

node删除子节点的时候,会调用cleanup,进而执行脚本管理器的cleanupSchedulesAndActions函数,遍历jsobj的映射target列表,把所有target删掉
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值