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

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】优先级:
        定时器类还有很多通过优先级去处理的方法,逻辑不算复杂,用得也较少,就没细看了……

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/625733.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniApp 顶部导航栏右侧添加文字按钮

{"path" : "pages/allin/MessageCenter/MessageCenter","style" : {"navigationBarTitleText": "消息中心","enablePullDownRef…

torch: 返回最大的几个值--topk()

torch.topk() 是 PyTorch 中的一个函数,用于从张量(tensor)中选取最大的 k 个值及其对应的索引。这个函数对于需要找到最大值或者对数据进行排序的场景非常有用。 函数的基本语法如下: torch.topk(input, k, dimNone, largestTrue, sortedT…

如何在Eclipse IDE中安装TestNG插件

目录 使用Eclipse Marketplace安装TestNG插件 通过输入URL安装TestNG 1.点击安装新软件 2.输入URL以安装TestNG 3.遵循正常的安装过程 4.重新启动Eclipse 在Eclipse中安装TestNG插件的视频 在这篇文章中,我们将介绍如何在Eclipse IDE中安装TestNG插件&#x…

JVM-Arthas高效的监控工具

一、arthas介绍 3.选择监控哪个进程 4.进入具体进程 二、arthas的基础命令与基本操作 1.查询包含Java的系统属性: 命令:sysprop |grep java 1.查询不含Java的系统属性: 命令:sysprop | grep -v java 3.打印历史命令 命令&#…

Android 自动滚动的RecyclerView,手动滑动和自动滑动无缝衔接,手动滑动时数据不重复

概要 做一个自动滑动的列表,用于展示聊天记录或者通知栏信息等,还是使用主流的RecyclerView来做。网上有很多案例,但当手动滑动时会一直无限循环,数据重复的出现,如果想要自动滑动时能无限循环,手动滑动时又…

Vue Grid Layout ( 栅格布局 )

Vue Grid Layout -️ 适用 Vue.js 的栅格布局系统 (相关使用记录) 参考文章~朴:shu参考文章我说爱你啊中文文档官方文档 安装 npm install vue-grid-layout --save 或yarn add vue-grid-layout导入组件 import VueGridLayout from vue-grid-layout;注册组件 expor…

C语言从入门到实战——结构体与位段

结构体与位段 前言一、结构体类型的声明1.1 结构体1.1.1 结构的声明1.1.2 结构体变量的创建和初始化 1.2 结构的特殊声明1.3 结构的自引用 二、 结构体内存对齐2.1 对齐规则2.2 为什么存在内存对齐2.3 修改默认对齐数 三、结构体传参四、 结构体实现位段4.1 什么是位段4.2 位段…

基于springboot的流浪动物救助管理系统

🍅点赞收藏关注 → 私信领取本源代码、数据库🍅 本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目希望你能有所收获,少走一些弯路。🍅关注我不迷路🍅一 、设计说明 1.1研究背景 随着…

MStart | MStart开发与学习

MStart | MStart开发与学习 1.学习 1.MStart |开机LOG显示异常排查及调整

windows平台高dpi介绍

flutter在windows平台如何自定义dpi设置 系统层级的支持(windows平台对高dpi的支持) 主要有两点: 设置系统的缩放比例 (系统及系统自带的app会根据这个设置来进行缩放;自己的app需要结合自己设置的dpi awareness来实现对应的dpi支持)设置进程的dpi aw…

Linux系统中负载较高问题排查思路与解决方法

Load 就是对计算机干活多少的度量,Load Average 就是一段时间(1分钟、5分钟、15分钟)内平均Load。 一、Load分析: 情况1:CPU高、Load高 通过top命令查找占用CPU最高的进程PID;通过top -Hp PID查找占用CPU…

BIOS知识枝桠——RAID 磁盘阵列

文章目录 前言一、RAID介绍二、RAID等级分类1.RAID02.RAID13.RAID24.RAID3和RAID45.RAID5和RAID66.RAID77.RAID10 BIOS下组建RAID 前言 假设存在多块磁盘,如果不组建阵列,磁盘与磁盘之间是没有任何关系的。磁盘A和B,放在A中的文件与B磁盘没有…

vue中使用component中的is渲染组件如何使用,:is 等价 v-if渲染组件。

动态组件顾名思义动态加载不同的组件&#xff0c;is属性用于加载不同组件&#xff0c;传参使用属性传递 1、使用v-for遍历component&#xff0c;组件都会执行 <componentv-for"(item, index) in TAB_PANE":key"index":is"item.componentName"…

Java多线程——并发和并行、实现方法

多线程 并发和并行 实现方法 代码演示 方式一 package com.qiong.thread1;public class MyThread extends Thread{Overridepublic void run() {for (int i 0; i < 20; i) {System.out.println(getName() "Hello World");}} }package com.qiong.thread1;public…

训练营四十四天 | ● 完全背包● 518. 零钱兑换 II ● 377. 组合总和 Ⅳ

完全背包 先物品再背包和先背包再物品都行&#xff0c;背包正序遍历&#xff0c;可以重复选取 先物品再背包是组合&#xff0c;不讲究各个物品的不同顺序&#xff0c;因为先顺序遍历物品&#xff0c;所以物品只有一种排序&#xff0c;即组合 先背包再物品是排序&#xff0c;物…

运筹说 第65期 | 动态规划的基本概念和基本原理

20世纪50年代初&#xff0c;美国数学家R. Bellman 等人在解决多阶段决策优化问题时提出了一种高效的求解方法——动态规划&#xff08;Dynamic Programming&#xff09;&#xff0c;该方法基于多阶段决策优化问题的特点&#xff0c;把多阶段问题转换为一系列互相联系的单阶段问…

2024抖店选品方法,及侧重方向思路(全新版本),可收藏备用

我是王路飞。 做无货源抖店的商家&#xff0c;牢记【选品重于泰山】这句话。 要知道电商的本质就是产品&#xff0c;你所有的运营手段也都是围绕产品进行的&#xff0c;店铺内的流量也都是冲着产品来的。 产品不行&#xff0c;哪怕再多的流量、再高的曝光率&#xff0c;也带…

2024年全网最全春招时间线

2024年全网最全春招时间线 春招&#xff0c;许多同学可能会误以为这是春天才会进行。 你可能会想&#xff0c;期末刚考完试&#xff0c;先享受下寒假&#xff0c;再欢度春节&#xff0c;收些红包&#xff0c;甚至还能抽空去理个发型。等到春日明媚时&#xff0c;再参加春招活…

linux docker安装 rustdesk

这里写自定义目录标题 1&#xff1a;软件介绍&#xff1a;2&#xff1a;安装1. 服务器端2. 客户端 3&#xff1a;配置5&#xff1a;其他1:rustdesk 官方Docker Compose 1&#xff1a;软件介绍&#xff1a; 名称作用官网项目地址rustdesk实现多端互控https://rustdesk.com/inde…

将github项目导入gitee中

首先将原gitee项目中以下不必要的文件删除掉&#xff0c;并把github中的文件下载到gitee目录下&#xff1a; rm -rf * git clone [链接]cd 进入下载后的目录&#xff0c;将下载后的git相关文件删除&#xff1a; cd [git项目名] rm -rf .git回到gitee项目文件夹&#xff0c;将…