LayaAir destroy 销毁与 removeChild 移除节点

 

目录

destroy  释放内存

编码示例

removeChild 移除节点


destroy  销毁节点

1、JavaScript 运行时无法启动垃圾回收器,要确保一个对象能够被回收,需要删除对该对象的所有引用。Sprite 提供的 destory() 方法会帮助设置对象内部引用为 null。

2、例如,以下代码确可保对象能够被作为垃圾回收:

var sp = new Laya.Sprite();//创建一个Sprite实例
sp.destroy();//将sp内部引用设置为null

3、当对象设置为 null ,并不会立即将其从内存中删除,只有系统认为内存足够低时,垃圾回收器才会运行。内存分配会触发垃圾回收(而不是对象删除)。

4、垃圾回收期间可能占用大量CPU并影响性能。通过重用对象,尝试限制使用垃圾回收。此外,尽可能将引用设置为null,以便垃圾回收器用较少时间来查找对象。有时(比如两个对象相互引用),无法同时设置两个引用为null,垃圾回收器将扫描无法被访问到的对象,并将其清除,这会比引用计数更消耗性能。

5、释放内存是内存优化方式之一,官方文档:https://ldc.layabox.com/doc/?nav=zh-js-3-2-1

destroy(destroyChild:Boolean = true):void

[override] 销毁此对象。destroy对象默认会把自己从父节点移除,并且清理自身引用关系,等待js自动垃圾回收机制回收。destroy后不能再使用。 destroy时会移除自身的事情监听,自身的timer监听,移除子对象及从父节点移除自己。

S

编码示例

中间是一个 Label 对象,通过按钮点击来控制创建与销毁,实现代码如下:

//初始化引擎,设置宽高并开启WebGL渲染模式
Laya.init(1080, 1820, Laya.WebGL);//atlas_comp:打包好的图集资源路径,./ 表示当前路径也就是项目输出路径 bin 目录,"./"" 可写可不写
//skin_button:button按钮的路径。这里注意:因为 button 组件被打包在了图集 comp.atlas 中,所以组件的路径接着图集的路径写
var atlas_comp = "./res/atlas/comp.atlas";//也可以直接是 res/atlas/comp.atlas
var skin_button = "comp/button.png";//comp是图集的名称,button.png是图集中组件的全名
var label_show = null;
//加载资源成功后,执行 onLoaded 回调方法
Laya.loader.load(atlas_comp, Laya.Handler.create(this, onLoaded));function onLoaded() {var btn_1 = createBtn("创建对象");var btn_2 = createBtn("销毁对象");btn_1.pos(30, 10);//按钮显示的位置btn_2.pos(400, 10);//按钮显示的位置btn_1.on(Laya.Event.CLICK, this, function () {//为按钮绑定单击事件/**当舞台中不含有 label_show 对象时,则创建*/if (label_show == null || !Laya.stage.contains(label_show)) {createLabel();console.log("创建标签");}});btn_2.on(Laya.Event.CLICK, this, function () {//为按钮绑定单击事件/**当舞台中已经含有 label_show 对象时,则销毁*/if (label_show != null && Laya.stage.contains(label_show)) {/*** destroy():销毁此对象。* destroy对象默认会把自己从父节点移除,并且清理自身引用关系,等待js自动垃圾回收机制回收。* destroy后不能再使用。 destroy时会移除自身的事情监听,自身的timer监听,移除子对象及从父节点移除自己*/label_show.destroy();console.log("销毁对象");}});createLabel();
}function createBtn(text) {var btn = new Laya.Button(skin_button);//创建一个 Button 实例btn.label = text;//按钮上显示的文本内容btn.labelSize = 25;//按钮文本标签的字体大小btn.width = 120;//设置按钮的宽度btn.height = 50;//设置按钮的高度Laya.stage.addChild(btn);//将Button添加到舞台上return btn;
}//显示一个标签
function createLabel() {label_show = new Laya.Label("LayaAir");//创建标签对象label_show.fontSize = 40;//设置标签字体为20pxlabel_show.color = "#fff";//字体颜色白色label_show.pos(200, 20);//标签显示位置Laya.stage.addChild(label_show);//添加到舞台
}

removeChild 移除节点

1、优化 Sprite 可以通过尽量减少不必要的层次嵌套,减少Sprite数量,以及非可见区域的对象尽量从显示列表移除或者设置visible=false

如上所示当雨箭射击到横杆上的时候就会从舞台中移除此节点,然后回收到对象池 Pool,实现代码如下:

class Arrow {constructor() {Laya.init(1136, 640, Laya.WebGL);//初始化引擎,不支持 WebGL自动切换为CanvasLaya.Stat.show(0, 0);/**显示性能面板 */Laya.stage.scaleMode = Laya.Stage.SCALE_SHOWALL;//按照最小比率缩放this.count = 0;//成员变量,用于记录每一次创建的雨箭的个数this.total = 100;//成员变量,设置每一次雨箭创建的总数this.penetrate = 5;//雨箭穿透横杆的深度,后一次都在前一次的基础上加上 penetratethis.showBar();//显示一个横杆(矩形表示)/*** 帧动画,每间隔 1 帧调用一次回调函数* 注意:如果直接使用 Laya.timer.frameOnce(10, Laya.stage, this.animation); 则是不对的,此时其中的 this 表示的是 Stage 对象* 使用了 ES6 的箭头函数,此时其中的 this 才表示当前类 Arrow*/Laya.timer.frameLoop(1, Laya.stage, () => { this.createArrow() });}/**顶部随机位置创建雨箭*/createArrow() {if (this.count < this.total) {/*** getItemByClass(sign: string, cls: any) 根据传入的对象类型标识字符,获取对象池中此类型标识的一个对象实例.*      当对象池中无此类型标识的对象时,则根据传入的类型,创建一个新的对象返回.*      sign 对象类型标识字符.cls 用于创建该类型对象的类.@return 此类型标识的一个对象* Image 和 Clip 组件是唯一支持异步加载的两个组件,比如 img.skin = "abc/xxx.png",其他 UI 组件均不支持异步加载*/var image_arrow = Laya.Pool.getItemByClass("arrow", Laya.Image);image_arrow.skin = "res/arrow.png";//设置 Image 组件皮肤var random_x = Math.random() * 1136;//设置 Image 随机的 x 的坐标var random_y = Math.random() * 100;//设置 Image 随机的 y 的坐标image_arrow.pos(random_x, random_y);//设置组件显示的位置Laya.stage.addChild(image_arrow);//将组件添加到舞台/**当创建的雨箭数量达到总数的 3分之1时,让雨箭开始移动 */if (this.count > (this.total / 3)) {this.animation();}this.count++;//每创建一个雨箭,将记录数加1} else {//当创建的雨箭数量达到总数时,移动雨箭this.animation();}console.log("当前箭头数:" + this.count + ",箭头总数:" + this.total);}/**雨箭动画——向下移动 */animation() {//获取舞台中当前所有的子节点,包含了所有的雨箭以及 下面的横杆var stage_numChildren = Laya.stage.numChildren;for (var i = 0; i < stage_numChildren; i++) {//变量所有舞台中的所有子节点,当是横杆时,则直接进入下一个,否则是雨箭时则移动 y 坐标var image_arrow = Laya.stage.getChildAt(i);if (image_arrow == null || image_arrow.name == "bar") {continue;}image_arrow.y += 5;//改变y坐标,移动雨箭/**当雨箭达到横杆以及穿透进入时,则移除节点(雨箭) */if (image_arrow.y > (500 - image_arrow.height + this.penetrate)) {Laya.stage.removeChild(image_arrow);//移除子节点Laya.Pool.recover("arrow", image_arrow);//回收到对象池}}console.log("stage_numChildren=" + Laya.stage.numChildren + ",penetrate=" + this.penetrate);if (Laya.stage.numChildren == 1) {//当舞台中只有横杆一个子节点时,说明雨箭以及全部消失,此时将 cout 置0,进入下一波this.count = 0;this.penetrate += 10;//将穿透横杆的值增加}}/*** 显示一个横杆——箭头运动到此时就清除箭头*/showBar() {var sprite = new Laya.Sprite();sprite.graphics.drawRect(0, 500, Laya.stage.width, 10, "#795815");Laya.stage.addChild(sprite);sprite.name = "bar";}
}new Arrow();//运行本类

示例图片资源:

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Javascript removeChild()不能删除全部子节点的解决办法

在Javascript中&#xff0c;只提供了一种删除节点的方法&#xff1a;removeChild()。 removeChild() 方法用来删除父节点的一个子节点。 语法&#xff1a; parent.removeChild(thisNode) 参数说明&#xff1a; 参数 说明 thisNode 当前节点&#xff0c;即要删除的节点 parent 当…

CSDN 每日一练用例数据缺失了怎么办?

CSDN 每日一练用例数据缺失了怎么办&#xff1f; 引子1、用例与结果不匹配2、阅读理解困难3、用例数据缺失 用例数据缺失&#xff0c;却有人 AC &#xff1f;神奇的 c28761 津津的储蓄计划70093 近视的小张 小结最后的吐槽 引子 老顾最近几个月经常在 CSDN 举办的周赛上浑水摸…

Spring中bean的初始化和销毁几种实现方式详解

关联博文&#xff1a;Spring中Bean的作用域与生命周期 Bean的生命周期 &#xff1a; 创建bean对象 – 属性赋值 – 初始化方法调用前的操作 – 初始化方法 – 初始化方法调用后的操作 – …-- 销毁前操作 – 销毁方法的调用。 先放一张图吧。 【1】init-method和destroy-me…

js-removeChild()

下面给大家介绍Javascript removeChild()删除节点的方法&#xff0c;具体详情如下所示&#xff1a; 在Javascript中&#xff0c;只提供了一种删除节点的方法&#xff1a;removeChild()。 removeChild() 方法用来删除父节点的一个子节点。 语法&#xff1a; parent.removeCh…

删除节点removeChild()

removeChild() 方法从子节点列表中删除某个节点。如删除成功&#xff0c;此方法可返回被删除的节点&#xff0c;如失败&#xff0c;则返回 NULL。 语法: nodeObject.removeChild(node) 参数: node &#xff1a;必需&#xff0c;指定需要删除的节点。 我们来看看下面代码&a…

Js removeChild、addChild

1. <html><head><meta http-equiv"Content-Type" content"text/html; charsetUTF-8"><title>添加删除记录练习升级</title><link rel"stylesheet" type"text/css" href"ex_2_style/css.css&qu…

【注意】js 里面 removeChild 使用的坑

这有坑啊&#xff0c;使用removeChild 循环删除 子元素们的时候 是【0】而不是【i】 这是因为 你每次删完一个 子元素们的 下标就会发生改变 比如 allSpan【0】 allSpan【1】 removeChild(allSpan【0】) 以后 &#xff0c;allSpan【1】 就不再是 allSpan【1】了&#xff0c;…

关于removeChild() 方法

removeChild() 方法 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 开发工具与关键技术&#xff1a; JS 撰写时间&#xff1a;2021/7/8 注意红色箭头指向内容&#xff0c;本文将分为6张图片&#xff0c;并按从上到下顺序操作 1.我们先简…

4.C++多线程-- unique_lock(类模板)

1.unique_lock 1. unique_lock<mutex> myUniLock(myMutex); 完全可以取代lock_guard 2. unique_lock 也可以使用----std::adopt_lock 3.使用adopt_lock&#xff0c;之前要先使用lock. 4.std::chrono::milliseconds my_sleepTime(20000)//20000毫秒 std::this_thread:…

打开浏览器的同时会在主页外同时打开芒果TV,抖音等网站

问题&#xff1a;每次打开谷歌浏览器的同时会同时打开芒果TV&#xff0c;抖音等网站。导致每次都要进行网页关闭&#xff0c;非常麻烦。 解决&#xff1a;在扩展程序中有一个叫做“省钱购”的程序&#xff0c;只需要将其移走就可以了。 扩展程序的位置&#xff1a;自定义及控…

最新超漂亮UI仿芒果TV听书网站模板双端+苹果CMS内核

正文: 苹果cms超漂亮UI高仿芒果TV听书网站模板带手机端。 手机版修改logo&#xff0c;ting_wap/images/logo.png 电脑版修改logo&#xff0c;ting_pc/img/logo.png 编辑推荐后台推荐5颗星&#xff0c;新势力/热播榜单后台推荐9颗星。 程序: wwyfeu.lanzoum.com/iQ0F00gbt…

芒果播放器介绍

芒果播放器 芒果全能播放器能播放所有格式的视频、音频文件、以及主流图片文件。短小精悍、简洁明了、绿色&#xff0c;无广告&#xff0c;其FLASH播放比暴风音影更真实。原本为教育教学服务&#xff0c;广大师生反应较好&#xff0c;现全面推广。 【1.1版下载地址】 http://…

非常简单下载芒果tv视频的方法(无需安装任何软件)

1、打开芒果tv网站&#xff0c;找到需要下载的视频地址比如&#xff1a;https://www.mgtv.com/b/328606/5533377.html?fpase 2、打开网页&#xff1a;https://www.parsevideo.com/mgtv/ 3、输入需要分析的视频地址&#xff1a; 4、分析结果如下&#xff0c;并点击第二行的下…

最新芒果TV视频下载方法-马赛克视频助手

芒果TV是一款资源丰富的互联网视频平台。它除了可以看视频外&#xff0c;还可以将这些视频下载下来。但官方是不支持视频下载的&#xff0c;那么芒果TV该怎么下载视频么&#xff1f;接下来就让我们一起去看看吧。 今天小编就教大家如何把上面喜欢的视频下载下来 1.这里我们需…

芒果TV 2021 互联网人才招聘

长沙&#xff0c;关键词是什么&#xff1f; 小龙虾、臭豆腐 马栏山 中国最具幸福感城市 芒果TV&#xff0c;关键词是什么&#xff1f; 天生青春&#xff0c;NO.1 中国互联网百强 世界媒体五百强 理想&#xff0c;非得在北上广实现么&#xff1f; 其实&#xff0c;追梦的路上不一…

Android TV 开发之 TV视频播放器

Android TV视频播放器VideoView 不想往下看可以直接在GitHub上面克隆到自己的项目中 GitHub地址 闲谈 最近公司又给了一个新任务&#xff0c;说要做电视机顶盒开发&#xff0c;这个机顶盒开发之前也没有接触过啊&#xff0c;没经验&#xff0c;这使我走了很多坑&#xff0c;写…

芒果TV会员,月卡最低9.9元,年卡最低128元!

全国首部湘商题材电视剧《一代洪商》&#xff0c;将于3月27日在央视八套&#xff08;电视剧频道&#xff09;播出&#xff0c;芒果TV将线上播出。该剧由王少华编剧&#xff0c;路奇担纲导演&#xff0c;孟凡耀担任总制片人&#xff0c;张丰毅、李立群、张睿、张含韵等人主演&am…

芒果tv官网服务器维护,芒果tv看不了【解决方案】

win7系统有很多人都喜欢使用,我们操作的过程中常常会碰到win7系统芒果tv看不了的问题。如果遇到win7系统芒果tv看不了的问题该怎么办呢&#xff1f;很多电脑水平薄弱的网友不知道win7系统芒果tv看不了究竟该怎么解决&#xff1f;其实不难根据下面的操作步骤就可以解决问题1.DNS…

jquery mini下载_【芒果tv湖南卫视直播】-芒果TV播放器下载v6.3.4 官方正式版

芒果tv湖南卫视直播电脑版最近也改版更新了&#xff0c;在西西在认识中这些媒体一般是不会重视客户端这块的&#xff0c;新版比旧版大了不少&#xff0c;因此软件的版面也是大气了很多&#xff0c;不过对于用户来说只要能及时的观看湖南卫视的节目已经热播的电视剧就OK了哦。芒…