Cocos2dx3.10 autorelease

一、引用计数机制:

通过给每个对象维护一个引用计数器,记录该对象当前被引用的次数。

当对象增加一次引用时,计数器加1;而对象失去一次引用时,计数器减1;当引用计数为0时,标志着该对象的生命周期结束,自动触发对象的回收释放。

引用计数的重要规则是每一个程序片段必须负责任地维护引用计数,在需要维持对象生存的程序段的开始和结束分别增加和减少一次引用计数.

二、结合Ref,AutoReleasPool,PoolManage看内存管理

理论:

Ref是引用计数的模型:

1、Ref抽象类(不能实例化,只能由子类实例化);

2、创建默认引用计数为1;//: _referenceCount(1)

3、调用retain引用计数加1;

4、调用release引用计数减1;

5、调用autorelease并没有使引用计数减1,而是交给自动释放池来管理。

AutoReleasPool自动释放池

1、AutoReleasPool是一个Ref的容器,用Vector<Ref>存储Ref中AutoRelease的成员;(std::vector<Ref*> _managedObjectArray;)

2、AutoReleasPool支持addObject,clear(vector中Ref执行release),contains,dump(打印当前Vector中Ref的引用计数的信息)

3、源代码AutoReleasPool使用方式:PoolManager::getInstance()->getCurrentPool()->addObject(this);

PoolManage池管理器

1、AutoreleasePool创建的时候PoolManager::getInstance()->push(this)把this存储;(std::vector<AutoreleasePool*> _releasePoolStack;)

2、PoolManager支持push,pop,isObjectInPools,getCurrentPool;

3、Dirctor->mainloop->每一帧中DrawScene之后PoolManager::getInstance()->getCurrentPool()->clear();清理当前Autorelease的Vector;(_managedObjectArray)

做一个测试来查看:_managedObjectArray,_releasePoolStack的内容信息:

1、_managedObjectArray元素的push顺序:

Ref->RenderState->StateBlock->SchedulerScriptHandlerEntry->GLView->FrameBuffer->CameraBackgroundDepthBrush->Camera->EventListener->Scene

2、_managedObjectArray的表结构体信息

3、mainloop在drawScene之后,清理_managedObjectArray,清理完毕之后,再次绘制页面的时候,会重复走之前的加载流程;

4、_releasePoolStack的结构体信息:

_releasePoolStack在执行首次AutoRelease方法的时候会push;若如果程序不自己push,_releasePoolStack会有一个AutoReleasPool;

三、mainloop中自动释放

分析一帧都做了什么事情,都涉及到什么,然后再来看自动释放。

Ref的子类有:

事件、Event, EventDispatcher, EventListener,

动画、Action, ActionManager, Animation, Animation3D, AnimationCache, AnimationCurve< componentSize >, AnimationFrame,;

物理、Physics3DConstraint, Physics3DObject, Physics3DShape, Physics3DWorld,PhysicsShape,

渲染、RenderState, RenderState::StateBlock

文件、联网等;

一帧之内所做的事情(FPS):

1、事件检查和处理:在每一帧开始,C2d检查事件,有则处理分发事件。

2、动画更新:ActionManager会对每一个元素注册的所有动画执行响应计算,并更新其对应的属性值;

3、默认处理物理模拟碰撞;

4、程序自定义更新;

5、UI树的遍历;UI树的遍历主要是给每一个元素计算坐标变换矩阵,以及根据指定的逻辑深度排序,生成正确的绘制顺序。每个节点别遍历之后,讲发送绘制命令至绘制栈;

6、渲染系统根据员孙的globalZorder进行绘制,绘制完毕,交换前后缓冲区,将当前帧的内容回到屏幕上;

7、poolManger释放当前所有的autorelease对象;所以我们只关心对象的创建和使用,不需要关心其释放;

每一个步骤都会计入Ref对象类型的Ref对象,所以销毁的内容就比较清楚了;

时间: 2024-08-05 05:42:41

Cocos2dx3.10 autorelease的相关文章

cocos2dx-3.10 45度地图 tiledmap+A*寻路

45度地图 寻路主要参考了某位博客文章,链接如下: cocos2dx 45度Staggered格式A*寻路 曼哈顿算法(待优化) 另外也参考了某位作者的正方形A* 寻路,所以这套A* 算法是可以兼正方形寻路也可以45度菱形寻路的. 现贴下代码: 地图类: #ifndef _MAP_LAYER_H_ #define _MAP_LAYER_H_ #include <cocos2d.h> #include "Role.h" #include "Astar.h"

VS2013+cocos2d-x3.10 调试项目同时在控制台(黑窗--终端)打印信息

今天!有会儿空功夫,装了cocos2d-x v3.10. 新建项目,打开,发布,打包!(打包环境配置),真是一键搞定派. 好吧!这就是发展吧.快,简,易.只要你喜欢随心所欲. 在小玩之余发现了一个奇怪的事情,标准输出信息(如std::cout.printf等)不是都是输出到控制台的(也就是传说中的黑窗)?控制台那? 只有调试的游戏项目孤零零的站在那里! 我这里除了把HelloWorld!换了张图片以外!还有就是加了个onTouchBegan(),onTouchEnd()用于输出打印触摸的点的坐标

cocos2d-x3.10 适配 IPV6

cocos 依赖的三方库涉及到 IPV6 问题的库为 curl, websocket, cocos 自己提供的模块需要适配的有: HttpClient AssetsManagerEx SocketIO WebSocket Console ScriptingCore 如果你需要支持纯IPv6网络,只需要更新CURL和libwebsocket网络. 1. 下载 cocos2d-x-3rd-party-libs-bin 2. 更新 curl 拷贝解压出来的文件夹中的 curl 目录到cocos2d-x

Cocos2dx 3.10版编译安卓报卷标错误

  环境: Java-sdk 1.7 Python2.7 Cocos2dx-3.10 Lua5.1 VC++2005-2013 Ant 1.10.1 android-ndk-r10d   1.错误截图 C++编译完成,生成apk包出错 2.解决过程 2.1最初怀疑磁盘问题,格式化磁盘/修复磁盘坏道也没用,尝试几台机器有同样的错误,排除磁盘问题. 2.2 用cocos命令行手工执行编译,编译成功,推测可能是Python执行cmd命令的BUG 2.3 找到build_android.py查看py执行

cocos2dx spine之一 :spine缓存 (c++ &amp; lua)

cocos2dx版本为3.10 1.在使用spine的过程中,发现了一个比较严重的问题:每次创建SkeletonAnimation的时候都会很卡,即使是使用同一个骨骼数据skeletonData. 跟踪代码发现,在每次调用函数spine::SkeletonAnimation::createWithFile (const std::string& skeletonDataFile, const std::string& atlasFile, float scale = 1);的时候都需要重新

cocos环境配置和打包apk

环境: Win10 + vs2015 + cocos2d-X-3.10 开发  软件的安装与环境配置: 资源准备:(后面备注的版本为笔者所选的) 1  python (python-2.7.3) 2  CocosForWin-v3.10(官网可下载) 3  vs2015 分别安装以上三个软件,路径没有限制,但是路径名称最好不要出现中文/空格等特殊字符,包括后面建立项目时项目的存放路径,最好用纯英文+"-",比如"cocos2d-x-3.10",因为笔者以前就因为路径

NSNumber

1.NSNumber是用来封装基本类型的对象,任何数据封装成NSNumber的时候都可以进行相互比较,或者逻辑运算 2.NSNumber的声明 NSNumber * intNumber = [[[NSNumber alloc] initWithInt:9] autorelease]; NSNumber * floatNumber = [[[NSNumber alloc] initWithFloat:9.0f] autorelease]; NSNumber * doubleNumber = [[[

自定义 cell 自适应高度

#import "CommodityCell.h" #import "UIImageView+WebCache.h" @implementation CommodityCell - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { self = [super initWithStyle:style reuseIdentifier:re

Cocos2dx 3.x 新建项目编译很慢的解决方案

一.前言 最近在用Cocos2d-x(后面我简称"Co-x")开发项目,发现一个问题: Co-x 3.x版本在windows下,新建一个项目,使用VS2013编译时,会很慢很慢(尽管Co-x源项目已经编译过). 经过摸索,究其原因是:3.x版本中,新建项目时是直接将Co-x相关的源项目复制到所建项目的指定目录,即新建项目引用的是复制后的Co-x源项目,这样VS编译新建项目时,就会把复制的Co-x源项目重新编译一遍,时间必然很长(就算ssd还是要20来分钟,要知道以前2.x编译新建项目时