写这边文章的主要目的是为了理解使用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内存管理机制的不同的更多相关文章

  1. javaScript 内存管理机制

    大家好,今天分享的主题为 JavaScript 内存管理机制,本次分享将从以下三部分进行讲述: js 内存管理与 js 垃圾 常见的 GC 算法 V8 引擎的垃圾回收 js 内存管理与 js 垃圾 关 ...

  2. cocos2d-x 3.0 内存管理机制

    ***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...

  3. 【Cocos2d-x 3.x】内存管理机制与源码分析

    侯捷先生说过这么一句话 :  源码之前,了无秘密. 要了解Cocos2d-x的内存管理机制,就得阅读源码. 接触Cocos2d-x时, Cocos2d-x的最新版本已经到了3.2的时代,在学习Coco ...

  4. 正确认识Android的内存管理机制,合理关闭进程 (一)

    随着大家收货后会有很多乐粉晒内存,为啦方便大家,在网上搜集了一些相关Andriod管理的相关机制合理管理内存,整理下发个贴. 首先要知道Android系统是基于Linux 2.6内核开发的开源操作系统 ...

  5. Tensoflw.js - 02 - 模型与内存管理(易懂)

    Tensoflw.js - 02 - 模型与内存管理(易懂) 参考 W3Cschool 文档:https://www.w3cschool.cn/tensorflowjs/ 本文主要翻译一些英文注释,添 ...

  6. 浅谈Linux内存管理机制

    经常遇到一些刚接触Linux的新手会问内存占用怎么那么多?在Linux中经常发现空闲内存很少,似乎所有的内存都被系统占用了,表面感觉是内存不够用了,其实不然.这是Linux内存管理的一个优秀特性,在这 ...

  7. ARC内存管理机制详解

    ARC在OC里面个人感觉又是一个高大上的牛词,在前面Objective-C中的内存管理部分提到了ARC内存管理机制,ARC是Automatic Reference Counting---自动引用计数. ...

  8. 深入了解C#系列:谈谈C#中垃圾回收与内存管理机制

    今天抽空来讨论一下.Net的垃圾回收与内存管理机制,也算是完成上个<WCF分布式开发必备知识>系列后的一次休息吧.以前被别人面试的时候问过我GC工作原理的问题,我现在面试新人的时候偶尔也会 ...

  9. Spark 1.6以后的内存管理机制

     Spark 内部管理机制 Spark的内存管理自从1.6开始改变.老的内存管理实现自自staticMemoryManager类,然而现在它被称之为"legacy". " ...

随机推荐

  1. JVM 知识点总览 - 高级 Java 工程师面试必备

    在江湖中要练就绝世武功必须内外兼备,精妙的招式和深厚的内功,武功的基础是内功.对于武功低(就像江南七怪)的人,招式更重要,因为他们不能靠内功直接去伤人,只能靠招式,利刃上优势来取胜了,但是练到高手之后 ...

  2. HANA Architecture

    1 HANA 是基于内存计算的.行列都支持.使用列存储,列存储的特点是高压缩,查询快,节约空间, ---SAP HANA supports both, but is particularly opti ...

  3. Asp.net 使用 Jsonp

    简介 由于JavaScript的安全机制,ajax不支持跨域调用.所以出现了jsonp. 实现 服务器 public string Jsonp(string name) { string result ...

  4. 32 python 并发编程之协程

    一 引子 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去 ...

  5. mac 上 mamp 配置虚拟主机 具体过程 ?

    https://www.zhihu.com/question/32320396 mac 上 mamp 配置虚拟主机 具体过程 ? 按照哪些配置什么的 都搞好了 但是还不好 配置的主机 制定的目录 还是 ...

  6. 【LeetCode】673. Number of Longest Increasing Subsequence

    题目: Given an unsorted array of integers, find the number of longest increasing subsequence. Example ...

  7. element table固定表头,表的高度自适应解决方法

    主要是通过在mounted生命周期中,改变tableHeight的值,来让表格的高度自适应. 标签: <el-table ref="table" :data="ta ...

  8. ftp上传下载 java FTPClient (zhuan)

    项目需要,网上搜了搜,很多,但问题也不少,估计转来转去,少了不少东西,而且也情况也不太一样.没办法,只能自己去写一个. 一,    安装sserv-u ftp服务器 版本10.1.0.1 我所设服务器 ...

  9. 快速沃尔什变换(FWT)学习笔记

    概述 FWT的大体思路就是把要求的 C(x)=A(x)×B(x)  即 \( c[i]=\sum\limits_{j?k=i} (a[j]*b[k]) \) 变换成这样的:\( c^{'}[i]=a^ ...

  10. BZOJ2716:[Violet 3]天使玩偶

    浅谈离线分治算法:https://www.cnblogs.com/AKMer/p/10415556.html 题目传送门:https://lydsy.com/JudgeOnline/problem.p ...