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". " ...
随机推荐
- 1008 Envy(好题¥)
1008: Envy 时间限制: 1 Sec 内存限制: 128 MB提交: 288 解决: 61[提交][状态][讨论版] 题目描述 今年的 ACM 比赛推出了一个赛后的娱乐活动,所有参赛选手排 ...
- AI探索(二)Tensorflow环境准备
Python + Tensorflow环境安装 Tensorflow支持Windows/Mac/Linux等三种操作系统, 其中windows下python需要安装3.5以上的版本 Mac/Linux ...
- js动态拼接参数到请求的url上
var queryConfig={ "page" : "index", "method" : 2, //1:按照方法A查看 2:按照方法B查 ...
- 201621123014《Java程序设计》第十周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 1. 常用异常 结合题集题目7-1回答 1.1 自己以前编写的代码中经常出现 ...
- Redis 高可用及分片集群,说了你也不懂
Redis 简介 Memcached: 优点:高性能读写.单一数据类型.支持客户端式分布式集群.一致性hash 多核结构.多线程读写性能高. 缺点:无持久化.节点故障可能出现缓存穿透.分布式需要客户端 ...
- Ubuntu 16.10 Apache PHP Server
/******************************************************************************************* * Ubunt ...
- Android Studio 学习 - Intent学习
今天开始仔细的学习Intent. 看的比较多,还在消化中,后续继续完善本篇笔记……
- HDU4585 Shaolin (STL和treap)
Shaolin HDU - 4585 Shaolin temple is very famous for its Kongfu monks.A lot of young men go to ...
- LeetCode Beautiful Arrangement II
原题链接在这里:https://leetcode.com/problems/beautiful-arrangement-ii/description/ 题目: Given two integers n ...
- shell for的用法
#!/bin/sh for1(){ for i in 1 2 3 4 5 6do echo "$i"done } for1#!/bin/shfor2(){for i in {1.. ...