cocos2d-js 浏览器与JSB内存管理机制的不同
写这边文章的主要目的是为了理解使用cocos3d-js开发app时,浏览器调试与真机情况不一致的原因
一、浏览器中内存管理机制
HTML5版本运行时,整个游戏只存在JS脚本与一些必要的资源文件,这时候内存管理是由JS内存管理机制来控制的。
JS内存管理有一套非常智能的机制,称为垃圾回收器。垃圾回收器有两种策略--引用计数与标记清除,判断某个对象是否可回收,
然后周期性启动回收线程把之前已标记为可回收的对象销毁回收。
引用计数:引用计数使用系统记录一个对象被引用的次数,当对象被引用的次数变为0时,该对象即被视作垃圾而被回收;
这是一种比较简单高效的策略,但是引用计数对循环引用的情况难以处理;这时候就引入了另一种策略:标记清除
标记清除:这样的方法是产生跟踪对象的关系图,然后进行垃圾回收。其算法是首先将程序中正在使用的对象视为“根对象”,
从根对象開始查找它们所引用的堆空间,并在这些堆空间上做标记,但是这种方法往往会产生比较大的计算开销;
不断怎么说,JS的内存管理足够智能,使得程序员可以不必关注内存管理,反而要关注如何让JS的内存管理机制能够搞高效的
运转。
二、JSB
cocos2d-js在发布为app时,使用的是JSB,而JSB底层使用的是cocos2d-x,当代码运行时,就存在了两套运行环境--JS运行环境和Cocos2d-x
的镜像运行环境。项目的代码在JS运行环境中每添加一个节点,cocos2d-x中就会相应的添加一个相同的节点,但是这两个运行环境是不完全
相同的,比如说内存管理机制:JS使用JS自己的垃圾回收机制,而cocos2d-x使用的是cocos2d-x自己的一套内存管理机制--智能指针的变种:
计数器机制(不是上方的引用计数)
cocos2d-x为几乎所有的类添加了一个基类Ref类,这个类只有一个作用:管理cocos对象的计数,retain()计数加一,release()计数减一
若计数为零,则自动释放该对象(原因之后解释)
而支持cocos2d-x自动内存管理的类(Node、Action等)都存在一个方法Create(),这个Create中有两个要关注的点:new与autorelease();
在使用create时,会使用new一个对象,并且计数设为1(retain()),然后会调用autorelease(顾名思义会自动释放该对象,计数减一);
现在来看看autorelease,它会将对象放入AutoreleasePool池中,有一个AutoreleaseManger来管理AutoreleasePool,在每一帧结束的
时候,AutoreleasePool中的对象会调用release,若计数为0,则会内释放,这样就实现了cocos2d-x的内存自动回收机制。
三、造成错误的原因
举个栗子:
let ball = new cc.Sprite("");
this.scheduleOnce(function(){
    this.addChind(ball);
}.bind(this),2);
这段代码在浏览器上时没有问题的,但是打包到手机上,就会出错。原因很简单,new之后并没有马上addChind,这时候计数为一,一帧之后被清除,2s之后再去添加
就会找不到该对象。
这时候可以改成下面的代码
let ball = new cc.Sprite("");
ball.retain();    //计数加一
this.scheduleOnce(function(){
    this.addChind(ball);
    ball.release() //计数减一
}.bind(this),2);
cocos2d-js 浏览器与JSB内存管理机制的不同的更多相关文章
- javaScript 内存管理机制
		大家好,今天分享的主题为 JavaScript 内存管理机制,本次分享将从以下三部分进行讲述: js 内存管理与 js 垃圾 常见的 GC 算法 V8 引擎的垃圾回收 js 内存管理与 js 垃圾 关 ... 
- cocos2d-x 3.0  内存管理机制
		***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ... 
- 【Cocos2d-x 3.x】内存管理机制与源码分析
		侯捷先生说过这么一句话 : 源码之前,了无秘密. 要了解Cocos2d-x的内存管理机制,就得阅读源码. 接触Cocos2d-x时, Cocos2d-x的最新版本已经到了3.2的时代,在学习Coco ... 
- 正确认识Android的内存管理机制,合理关闭进程 (一)
		随着大家收货后会有很多乐粉晒内存,为啦方便大家,在网上搜集了一些相关Andriod管理的相关机制合理管理内存,整理下发个贴. 首先要知道Android系统是基于Linux 2.6内核开发的开源操作系统 ... 
- Tensoflw.js - 02 - 模型与内存管理(易懂)
		Tensoflw.js - 02 - 模型与内存管理(易懂) 参考 W3Cschool 文档:https://www.w3cschool.cn/tensorflowjs/ 本文主要翻译一些英文注释,添 ... 
- 浅谈Linux内存管理机制
		经常遇到一些刚接触Linux的新手会问内存占用怎么那么多?在Linux中经常发现空闲内存很少,似乎所有的内存都被系统占用了,表面感觉是内存不够用了,其实不然.这是Linux内存管理的一个优秀特性,在这 ... 
- ARC内存管理机制详解
		ARC在OC里面个人感觉又是一个高大上的牛词,在前面Objective-C中的内存管理部分提到了ARC内存管理机制,ARC是Automatic Reference Counting---自动引用计数. ... 
- 深入了解C#系列:谈谈C#中垃圾回收与内存管理机制
		今天抽空来讨论一下.Net的垃圾回收与内存管理机制,也算是完成上个<WCF分布式开发必备知识>系列后的一次休息吧.以前被别人面试的时候问过我GC工作原理的问题,我现在面试新人的时候偶尔也会 ... 
- Spark 1.6以后的内存管理机制
		Spark 内部管理机制 Spark的内存管理自从1.6开始改变.老的内存管理实现自自staticMemoryManager类,然而现在它被称之为"legacy". " ... 
随机推荐
- python后端面试题
			1. 果壳 电话面试: 说一下TCP的三次握手,四次挥手,为什么会这样? http安全的性的了解,说一下对cookie和session的了解: 对mysql的了解,说一下你常用的数据类型,char和v ... 
- 11462 Age Sort(计数排序)
			内存不够用,用计数排序可以解决问题. #include<iostream> #include<cstdio> #include<cstdlib> #include& ... 
- Spark入门实战系列
			转自:http://www.cnblogs.com/shishanyuan/p/4699644.html 这一两年Spark技术很火,自己也凑热闹,反复的试验.研究,有痛苦万分也有欣喜若狂,抽空把这些 ... 
- DIV横向排列_CSS如何让多个div盒子并排同行显示
			如何让多个div盒子并排同行div横向排列显示呢? 我们先设置3个div盒子对象,什么css样式都不设置看看效果.代码如下: 三个div盒子均独占一行显示 div盒子本身默认样式属性是独占一行,而解决 ... 
- Httpclient远程调用WebService示例
			我们将Web Service发布在Tomcat或者其他应用服务器上后,有很多方法可以调用该Web Service,常用的有两种: 1.通过浏览器HTTP调用,返回规范的XML文件内容 2.通 ... 
- Java代码使用正则验证和常用工具方法
			1.正则验证邮箱 public static boolean checkEmail(String email){ boolean flag = false; try{ String check = & ... 
- Kerberos的hive链接问题
			javax.security.auth.login.LoginException: Checksum failed 之前碰到过类似的问题,都是因为服务器端的keytab问题:多半是因为重新生成了key ... 
- 日志管理系统ELK6.2.3
			https://www.jianshu.com/p/88f2cbedcc2a 写在前面 刚毕业工作的时候,处理日志喜欢自己写脚本抓取数据分析日志,然后在zabbix上展示出来.但是开发要看日志的时候, ... 
- mysqldump全备份脚本mysqlallbackup.sh
			库小,大概16G左右,每天增量很小,不到100M,所以用mysqldump每天全量备份,将备份结果信息发送到email通知DBA. mysqlallbackup.sh :MySQL DataBase ... 
- Asp.NET Core+ABP框架+IdentityServer4+MySQL+Ext JS之验证码
			验证码这东西,有人喜欢有人不喜欢.对于WebApi是否需要验证码,没去研究过,只是原来的SimpleCMS有,就加上吧. 在WeiApi上使用验证码,关键的地方在于WeiApi是没有状态的,也就是说, ... 
