【六】CocosCreator-CCObject.js源码分析

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

        本来是想写CCNode的,结果发现CCNode继承BaseNode,BaseNode再继承CCObject,那么,就先来看CCObject吧~

        在CCObject类中,他是通过给原型方法赋值来实现类似成员函数相关的功能,如:prototype.destroy = function () {}。

【1】destroy():销毁对象。【因为这个方法很重要,所以我每步都插入关键的核心代码】
1.把需要销毁的对象加到销毁队列objectsToDestroy中。(不会立马销毁)

prototype.destroy = function () {// 省略上下文objectsToDestroy.push(this);// 省略上下文
};


2.在CCDirector的主循环里,再当前帧渲染之前调用deferredDestroy()进行销毁。

mainLoop: CC_EDITOR ? function (deltaTime, updateAnimate) {// 省略上下文} : function (now) {// 省略上下文// Updateif (!this._paused) {// 省略上下文// Destroy entities that have been removed recentlyObj._deferredDestroy();}// 省略上下文}},


3.【deferredDestroy函数内部】遍历objectsToDestroy,如果对象还没销毁,则调用_destroyImmediate。然后把删掉的对象从objectsToDestroy队列里面清除。

function deferredDestroy () {var deleteCount = objectsToDestroy.length;for (var i = 0; i < deleteCount; ++i) {var obj = objectsToDestroy[i];if (!(obj._objFlags & Destroyed)) {obj._destroyImmediate();}}// if we called b.destory() in a.onDestroy(), objectsToDestroy will be resized,// but we only destroy the objects which called destory in this frame.if (deleteCount === objectsToDestroy.length) {objectsToDestroy.length = 0;}else {objectsToDestroy.splice(0, deleteCount);}if (CC_EDITOR) {deferredDestroyTimer = null;}
}


4.【_destroyImmediate函数内部】在对象销毁前,调用_onPreDestroy(). 所有的子类就可以在这个接口里做一些销毁对象前需要执行的操作了。
5.【_destroyImmediate函数内部】调用_destruct(),清除实例的所有引用。

prototype._destroyImmediate = function () {if (this._objFlags & Destroyed) {cc.errorID(5000);return;}// engine internal callbackif (this._onPreDestroy) {this._onPreDestroy();}if ((CC_TEST ? (/* make CC_EDITOR mockable*/ Function('return !CC_EDITOR'))() : !CC_EDITOR) || cc.engine._isPlaying) {this._destruct();}this._objFlags |= Destroyed;
};


6.【_destruct函数内部】调用compileDestruct()构造出“析构函数”,然后调用destruct(this)析构函数清除实例的所有引用。

prototype._destruct = function () {var ctor = this.constructor;var destruct = ctor.__destruct__;if (!destruct) {destruct = compileDestruct(this, ctor);js.value(ctor, '__destruct__', destruct, true);}destruct(this);
};


7.【compileDestruct函数内部】会遍历对象的key,然后用自带的原型方法hasOwnProperty去检测对象的自有属性,然后把所有自有属性置空再赋值给propsToReset。
8.【compileDestruct函数内部】判断如果有构造函数,则是类类型,同样把类里面的string、object、funciton等置空赋值给propsToReset。
PS:上面的7,8两个步骤很关键,大致意思就是构建一个propsToReset出来,key值用对象的key,value就是置空的值。
9.【compileDestruct函数内部】返回一个方法(可以勉强理解为“析构函数”),方法内部其实就是遍历propsToReset,把propsToReset的值赋值给对象,从而真正实现了清除实例的所有引用。

function compileDestruct (obj, ctor) {var shouldSkipId = obj instanceof cc._BaseNode || obj instanceof cc.Component;var idToSkip = shouldSkipId ? '_id' : null;var key, propsToReset = {};for (key in obj) {if (obj.hasOwnProperty(key)) {if (key === idToSkip) {continue;}switch (typeof obj[key]) {case 'string':propsToReset[key] = '';break;case 'object':case 'function':propsToReset[key] = null;break;}}}// Overwrite propsToReset according to Classif (cc.Class._isCCClass(ctor)) {var attrs = cc.Class.Attr.getClassAttrs(ctor);var propList = ctor.__props__;for (var i = 0; i < propList.length; i++) {key = propList[i];var attrKey = key + cc.Class.Attr.DELIMETER + 'default';if (attrKey in attrs) {if (shouldSkipId && key === '_id') {continue;}switch (typeof attrs[attrKey]) {case 'string':propsToReset[key] = '';break;case 'object':case 'function':propsToReset[key] = null;break;case 'undefined':propsToReset[key] = undefined;break;}}}}if (CC_SUPPORT_JIT) {// compile codevar func = '';for (key in propsToReset) {var statement;if (CCClass.IDENTIFIER_RE.test(key)) {statement = 'o.' + key + '=';}else {statement = 'o[' + CCClass.escapeForJS(key) + ']=';}var val = propsToReset[key];if (val === '') {val = '""';}func += (statement + val + ';\n');}return Function('o', func);}else {return function (o) {for (var key in propsToReset) {o[key] = propsToReset[key];}};}
}

【2】_objFlags:应该是记录对象的状态吧,状态的定义在CCObject.js也有,但具体每个状态什么时候用到,暂时在CCObject还没看到,估计是给子类使用的?

【3】cc.isValid():这个我们经常用来判断对象是否还有效的方法,就是通过_objFlags的状态来判断的。

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

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

相关文章

【Gephi项目实战-带数据集】利用gephi绘制微博肖战超话120位用户关系图,并计算整体网络指标与节点指标

数据集在评论区&#xff0c;B站演示视频在评论区&#xff01; 简介 最近2天需要用到gephi做社会网络分析&#xff0c;于是从0开始接触gephi并摸索出了gephi的基本使用指南。下面将结合真实的节点文件与边文件&#xff0c;利用gephi绘制社会网络并计算相关测量指标。整个过程会…

简单介绍Spring Security 的认证机制和授权机制

Spring Security 认证机制 Spring Security 的认证机制是一个用于确认用户身份的过程&#xff0c;它是基于Spring框架提供的一套全面的安全和身份验证特性。认证机制允许应用程序确认用户是否为他们所声明的用户&#xff0c;通常通过用户名和密码或其他凭证来完成。Spring Sec…

数据库学习笔记2024/2/5

2. SQL 全称 Structured Query Language&#xff0c;结构化查询语言。操作关系型数据库的编程语言&#xff0c;定义了 一套操作关系型数据库统一标准 2.1 SQL通用语法 在学习具体的SQL语句之前&#xff0c;先来了解一下SQL语言的通用语法。 1). SQL语句可以单行或多行书写&…

扩展鸿蒙ArkUI日期组件

鸿蒙ArkUI日期组件使用的是DatePickerDialog.show基础上扩展的表单式输入组件&#xff0c;方便在输入日期方式快速使用及复用。 /*** 日期*/ Component export default struct DiygwDate{//绑定的值Link Watch(onValue) value:string;// 隐藏值State valueField: string valu…

(5)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—12种聚类算法说明与归纳

目录 一、12种聚类(无监督学习)算法说明和区分比较 聚类算法的类型(一) ​编辑导入函数库 加载数据集 ​编辑 (1)K-Means --Centroid models (2)Mini-Batch K-Means -- Centroid models (3)AffinityPropagation (Hierarchical) -- Connectivity models (4)Mean Shift…

DBNet详解及训练ICDAR2015数据集

论文地址&#xff1a;https://arxiv.org/pdf/1911.08947.pdf 开源代码pytorch版本&#xff1a;GitHub - WenmuZhou/DBNet.pytorch: A pytorch re-implementation of Real-time Scene Text Detection with Differentiable Binarization 前言 在这篇论文之前&#xff0c;文字检…

vue2之父子组件BUG

父组件&#xff1a;&#xff08;如果这样写&#xff09; <count-down:start-time"changeStartTime":end-time"changeEndTime"/>则changeStartTime就算写在计算属性里&#xff0c;也可能子组件不会在自动随着父组件的数据更新重新给子组件传值&#x…

微信小程序的图片色彩分析,窃取网络图片的主色调

1、安装 Mini App Color Thief 包 包括下载包&#xff0c;简单使用都有&#xff0c;之前写了&#xff0c;这里就不写了 网址&#xff1a;微信小程序的图片色彩分析&#xff0c;窃取主色调&#xff0c;调色板-CSDN博客 2、 问题和解决方案 问题&#xff1a;由于我们的窃取图片的…

基于Langchain-Chatchat + chatGLM3 轻松在本地部署一个知识库

前面三篇分别讲解了如何在本地环境部署大模型&#xff0c;那么今天简单的通过 Langchain-Chatchat 和 chatGLM3结合在本地环境搭建一套属于自己的大模型知识库。 往期llm系列文章 基于MacBook Pro M1芯片运行chatglm2-6b大模型如何在本地部署chatGLM3基于ChatGLM.cpp实现低成…

论文阅读-通过云特征增强的深度学习预测云工作负载转折点

论文名称&#xff1a;Cloud Workload Turning Points Prediction via Cloud Feature-Enhanced Deep Learning 摘要 云工作负载转折点要么是代表工作负载压力的局部峰值点&#xff0c;要么是代表资源浪费的局部谷值点。预测这些关键点对于向系统管理者发出警告、采取预防措施以…

企业动态 | UFAPKU“金融科技”沙龙走进同创永益——前沿技术在金融科技领域的应用

金融科技作为金融发展的驱动力量&#xff0c;对金融行业有着深远的影响。金融行业通过技术创新和数字化转型&#xff0c;极大地提高了金融服务和产品的效率和便捷性。1月21日&#xff0c;UFAPKU“金融科技”第二期沙龙在北大校友企业同创永益北京总部举办&#xff0c;数十位来自…

python增量同步文件夹中的文件

要增量同步文件夹中的文件&#xff0c;可以使用Python的shutil模块。以下是一个示例代码&#xff0c;它可以将源文件夹中的新增文件复制到目标文件夹中&#xff0c;并保留文件的时间戳和访问权限。 import os import shutil import time# 源文件夹和目标文件夹的路径 src_dir …

请问CTF是什么?请介绍一下关于隐水印的知识特点技术原理应用领域技术挑战

目录 请问CTF是什么&#xff1f; 请介绍一下关于隐水印的知识 特点 技术原理 应用领域 技术挑战 请问CTF是什么&#xff1f; CTF&#xff08;Capture The Flag&#xff0c;夺旗比赛&#xff09;是一种信息安全竞赛&#xff0c;常见于计算机安全领域。这种比赛模拟各种信…

fastjson 导致的OOM

fastjson 导致的OOM 示例代码 public static void main(String[] args) throws Exception {try {List<Integer> list JSONObject.parseArray("[2023,2024", Integer.class);}catch (Exception e){System.err.println("error");}System.out.println…

一文搞懂 springboot 如何融合数据源

1、简介 springboot 支持关系型数据库的相关组件进行配置&#xff0c;包括数据源、连接池、事务管理器等的自动配置。降低了数据库使用的难度&#xff0c;除了 mysql 还支持 Derby、H2等嵌入式数据库的自动配置&#xff0c;MongoDB、Redis、elasticsearch等常用的 NoSQL 的数据…

BGP邻居故障检测

第一种情况:如果AR2和AR4采用直连建立邻居,则排查步骤如下: 1)在AR2和AR4上使用ping x.x.x.x命令检查AR2和AR4用于建立EBGP邻居关系的直连地址连通性是否正常。如果不能ping通。则需要使用二分法从网络层向下层逐层进行排查,首先检查接口地址及路由的可达性,修改完成后,如…

Codeforces Round 914 (Div. 2)(D1/D2)--ST表

Codeforces Round 914 (Div. 2)(D1/D2)–ST表 D1. Set To Max (Easy Version) 题意&#xff1a; 给出长度为n的数组a和b&#xff0c;可以对a进行任意次数操作&#xff0c;操作方式为选择任意区间将区间内值全部变成该区间的最大值&#xff0c; 是否有可能使得数组a等于数组b…

WEB3:互联网发展的新时代

随着科技的飞速发展&#xff0c;互联网已从最初的信息交流平台发展为涵盖了工作、生活、娱乐、教育等众多领域的复杂系统。我们将其称之为“WEB3”&#xff0c;这个名称是对互联网新时代的高度概括&#xff0c;标志着我们已经迈入了WEB3时代。 在WEB3时代&#xff0c;互联网将…

MySQL 函数触发隐式转换应对策略

文章目录 前言1. 环境介绍2. MySQL 5.72.1 执行计划2.2 虚拟列优化2.3 原理解析 3. MySQL 8.03.1 执行计划3.2 函数索引优化3.3 原理解析 前言 MySQL 中&#xff0c;当 SQL 索引字段使用了函数的话&#xff0c;会出现隐式转换的问题&#xff0c;导致索引失效&#xff0c;从而导…

C# CAD界面-自定义窗体(三)

运行环境 vs2022 c# cad2016 调试成功 一、引用 二、开发代码进行详细的说明 初始化与获取AutoCAD核心对象&#xff1a; Database db HostApplicationServices.WorkingDatabase;&#xff1a;这行代码获取当前工作中的AutoCAD数据库对象。在AutoCAD中&#xff0c;所有图形数…