目录

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();//运行本类

示例图片资源:

LayaAir destroy 销毁与 removeChild 移除节点相关推荐

  1. 图解集合8:红黑树的移除节点操作

    红黑树移除节点 上文详细讲解了红黑树的概念,红黑树的插入及旋转操作,根据测试代码建立起来的红黑树结构为: 本文先研究一下红黑树的移除操作是如何实现的,移除操作比较复杂,具体移除的操作要进行几次旋转和移 ...

  2. mysql 集群怎么卸载节点_Greenplum移除节点

    基于某某原因,我们的Greenplum需要卸载一个节点(测试环境的Greenplum集群),由于该集群使用了很久,里面有许多开发所需要的数据,所以在卸掉一个节点后,还要保证数据不会丢失. 当然,期间也 ...

  3. mysql 集群怎么卸载节点_Redis集群重新分片(新增/移除节点)【理论】

    Redis集群重新分片(新增/移除节点)[理论] 发布时间:2020-06-25 10:16:16 来源:51CTO 阅读:6915 作者:张德帅ya 栏目:数据库 redis集群重新分片原理:(增加 ...

  4. k8s NoSchedule k8s 设置污点 NoExecute有点复杂 移除节点 drain和不可调度cordon

    驱除pod 移除节点 参考文章:https://www.jianshu.com/p/752be98e9077 # drain 移除同时驱逐 cordon 不可调度 uncordon 可调度 kubec ...

  5. 使用 kubectl drain 从集群中移除节点

    对节点执行维护操作之前(例如:内核升级,硬件维护等),您可以使用 kubectl drain 安全驱逐节点上面所有的 pod.安全驱逐的方式将会允许 pod 里面的容器遵循指定的 PodDisrupt ...

  6. 如何动态的向zookeeper中加入或移除节点

    什么叫做动态的加入或移除节点? 简单理解就是在zookeeper集群不停止的情况下,向这个集群中加入新的节点或移除现有的节点.这是zookeeper3.5+才有的新功能. 搭建一个zookeeper集 ...

  7. 记hadoop集群黑名单移除节点出现问题及解决

    首先区分一下通过直接下线服务和通过黑名单来移除节点的区别,这两个动作都会涉及到block副本数不够而复制移动恢复的问题,但是通过黑名单的话可以同时移除多个节点,这个是两种情况的主要区别: 步骤: 1. ...

  8. php removechild,介绍删除节点函数removeChild()用法

    删除节点removeChild() removeChild() 方法从子节点列表中删除某个节点.如删除成功,此方法可返回被删除的节点,如失败,则返回 NULL. 语法: nodeObject.remo ...

  9. 关于移除节点的IE和Firefox的兼容问题

    代码 function FunNode(obj)  {   var objNode = document.getElementById("NodeID");   if(objNod ...

  10. JDK8 HashMap--removeNode()移除节点方法

    1 /*删除节点*/ 2 final Node<K,V> removeNode(int hash, Object key, Object value, 3 boolean matchVal ...

最新文章

  1. 如何用python写程序设置当前打印机为默认打印机_从Python打印到标准打印机?
  2. POJ2402+模拟
  3. 万字长文,带你彻底理解EF Core5的运行机制,让你成为团队中的EF Core专家
  4. Windows Phone本地数据库(SQLCE):3、[table]attribute(翻译) (转)
  5. hb编程软件全称_什么是组态软件、组态编程?
  6. 大数据学习笔记:ZooKeeper练习
  7. 对于一组给定的叶子结点_高糊图片可以做什么?Goodfellow等人用它生成一组合理图像...
  8. RabbitMQ学习之spring-amqp的重要类的认识
  9. 【持续更新】高通蓝牙SoC系列文章索引
  10. 640-802 新版CCNA考试题库下载
  11. 认识netty+实战
  12. TcpClient Class
  13. Lisp自动画梯形_CAD lisp 求助一段代码实现自动画弧!
  14. 如何使用Arduino和R305制作指纹考勤系统
  15. [软件工程] UML 用例图详解
  16. java mysql 分区表_mysql分区表
  17. 一款全功能Markdown在线编辑器,让在线创作如此便捷简单
  18. 170929 逆向-Reversing.kr(Ransomware)
  19. 高可用性和高可靠性的规划与设计
  20. 使用cpolar配置内网访问(内网穿透)教程(超详细,简单)

热门文章

  1. java 启动顺序_java语句执行顺序
  2. 拓端tecdat|stata对包含协变量的模型进行缺失值多重插补分析
  3. 拓端tecdat|matlab预测ARMA-GARCH 条件均值和方差模型
  4. 原python基础概念整理_python基础知识脉络梳理总结
  5. UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0x80 in position 2
  6. Caffe的各个版本简介
  7. 强大高可用的数据可视化神器plotly_express实践记录
  8. scala学习笔记一------初步了解scala
  9. python-图像金字塔
  10. geekbench 3 android,Geekbench列表声称Xperia 3将包含12GB RAM并运行Android 10