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--基本代码规范
python代码规范:一.标识符 所谓的标识符就是对变量.常量.函数.类等对象起的名字 python语言在任何场景都严格区分大小写!!! python对于标识符的命名有如下规定: 第一个字符必须是字母 ...
- Django 基础 路由系统
Django框架简介 MVC框架和MTV框架(了解即可) MVC,全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图 ...
- 20165210 Java第二周学习总结
20165210 Java第二周学习总结 教材学习内容总结 - 第二章学习总结 标识符与关键字: 重点在50个关键字 标识符并不能是关键字 标识符的第一个字符不能是数字字符 Unicode字符集简单了 ...
- 关于stl advance函数移动步数超过容器大小(越界)的研究
今天使用advance遇到个问题,当advance移动步数超过容器大小时,表现的结果居然不一样. 再来看下stl源码 template<typename _BidirectionalIterat ...
- Java 参数的和
public class CommandParamter { public static void main(String[] args) { // TODO Auto-generated metho ...
- LintCode Sliding Window Matrix Maximum
原题链接在这里:http://www.lintcode.com/zh-cn/problem/sliding-window-matrix-maximum/ 题目: Given an array of 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.. ...
- [转]HTTP详解(1)-工作原理
1. HTTP简介 HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议.它可以使浏览器更加高效,使网络传输减少. ...
- iOS系统架构和Object-C基本数据类型(1)
iOS系统架构 基本数据类型 思维导图 下载 注:打开思维导图的软件:Mindjet MindManager 9
- 蓝桥杯 基础练习 BASIC-19 完美的代价
基础练习 完美的代价 时间限制:1.0s 内存限制:512.0MB 问题描述 回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的.小龙龙认为回文串才是完美的.现在给你一个串,它不一定 ...