【五】CocosCreator-CCScheduler.js源码分析

发布时间:2024年01月12日

PS:只是看源码学习过程中把认为重要的内容以笔记的形式记录下来。

【1】HashTimerEntry:用于保存指定target的事件定时器相关参数的数据结构。

【2】_hashForTimers:targetId作为key,HashTimerEntry【2】对象作为value的hash数组。

【3】ListEntry:用于保存指定target的update定时器相关参数的数据结构

【4】_hashForUpdates:targetId作为key,ListEntry【4】对象作为value的hash数组。

【5】proto.initWithCallback:初始化各种变量,以下是各种变量的解释:
this._lock:用于在执行trigger【7】时上锁。
this._scheduler:定时器本身。
this._target:要注册的目标对象。
this._callback:回调函数。
this._elapsed:运行的总时间。就是把每次update的dt相加。
this._interval:每次执行定时器的时间间隔。
this._delay:多久后定时器才开始生效。使用schedule注册默认,不设置此参数默认为0
this._useDelay:delay大于0就是use了delay。
this._repeat:重复多少次。使用schedule注册默认,不设置此参数默认cc.macro.REPEAT_FOREVER
this._runForever:是否一直循环播放。

【6】proto.update:执行定时器逻辑,这个类的最核心函数啦~
1.if (this._elapsed === -1) :因为初始化时_elapsed值就是-1,所以我理解为第一次update是不会执行逻辑直接跳过的。
2.如果是一直循环的函数的话,只要大于时间间隔就执行trigger【7】。
3.如果使用了Delay的话,要等Delay时间到了才开始执行trigger【7】。
4.如果设置了_interval,则_elapsed > _interval才trigger。
5.如果不是一直循环的话,调用次数超过了_repeat,就移除定时器。

【7】proto.trigger:调用回调函数。

【8】_timeScale:时间间隔缩放比例。
? ? ? ? 默认值为1,在update时,会根据这个比例缩放dt(帧时间差)值。可以通过这个值做成快进或者慢动作等效果。

【9】enableForTarget():如果对象不存在_id的话,给对象添加一个唯一的_id。
? ? ? ? 需要使用定时器之前,最好都调用一下这个函数,来保证target对象存在_id。

【10】schedule():设置一个新的定时器。
1.如果callback不是function的话,就把target和callback对调(这步的目的没看懂……)
2.如果不传入repeat或者delay参数的话,默认repeat是cc.macro.REPEAT_FOREVER,delay为0
3.通过targetId作为key从_hashForTimers获取对象element,如果对象不存在则创建。
4.创建一个callbackTimer并且进行初始化,然后把timer丢到element的timers队列中。

【11】scheduleUpdate():创建一个带优先级的定时器。
1.通过targetId作为key从_hashForUpdates获取对象element,如果element存在,则仅当优优先级发生变化且?_updateHashLocked为false时,才删除原有element对象,再创建新的。
2.创建element对象。
3.根据优先级大于小于或等于0,把element放进对应队列中(_updates0List、_updatesNegList、_updatesPosList)
4.最后再把element放进_hashForUpdates。

PS:在CCDirector类里面,就是通过此接口注册各大管理器的定时器。

【12】unschedule():取消定时器。
1.通过targetId获取element对象。
2.遍历element对象的timers,如果timer的_callback和传入的callback一致的话,则从timers里面移除此timer(等于移除了这个callback的监听咯)。
3.如果timers为空,这个target的所有监听都清空了,就可以从数组中移除整个element。
PS:对target下的其他callback没影响,只会移除指定的callback

【13】unscheduleUpdate():取消指定target的update定时器
1.通过targetId获取element对象。
2.如果element被lock了,则做一个标记(此标记用于在下一次update移除此target的update)
3.如果没被lock,则立刻移除此target的update。

【14】unscheduleAllForTarget():取消target的所有定时器。
? ? ? ? 其实简单理解,就是【12】和【13】的复合体,取消target的update还有清空所有注册的callback(其实就是直接移除element就OK了)。

【15】isScheduled():检查这个target是否存在一个callback回调的定时器。
? ? ? ? 逻辑大致上也就等于【12】的前两步,只是移除timer改成return true or false而已。

【16】element.paused &&?elementUpdate.entry.paused:
? ? ? ? 两个paused代表着整个target的状态是否暂停。通过pauseTarget()和resumeTarget()能对值进行修改,不过调用这两个方法,都是同时设置这两个变量的开关,让整个target的所有update达到同时开关所有定时器的目的。而isTargetPaused()方法则会返回其中一个paused作为target是否暂停的依据(因为两个变量同时设置的,所以返回其中一个作为结果也就OK了)

【17】优先级:
? ? ? ? 定时器类还有很多通过优先级去处理的方法,逻辑不算复杂,用得也较少,就没细看了……

文章来源:https://blog.csdn.net/a42626423/article/details/135459538
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。