cocos2dx内存管理的一些看法
今年年初进入一家游戏公司,正式开始游戏引擎的学习,之前的ios学习,对现在的游戏引擎学习还是有很大的帮助的,虽然使用c++,但却能时刻感受到ios框架对于cocos2dx的巨大影响。
由于之前一直使用arc,所以对于什么时候该release,什么时候该retain,还真是不熟悉,c++也忘记的差不多了,没关系,重新开始好了。
不说废话了,开始cocos2dx内存管理之旅吧。
c++中,new与delete是一对,而继承c的还有malloc和free,delete比free则多一个类的析构动作,所以类最好还是使用new和delete配套使用,而在cocos2dx的框架中,经常可以看到的是create函数,比如cclayer,ccsprite,进入create函数查看可以看到实际上就是new以后autorelease了一下,而autorelease又做了什么呢?幸好是开源代码,很容易跟进去瞧瞧,CCPoolManager::sharedPoolManager()->addObject(this);原来是加入了pool池,再进入addObject看看,能看到原来是加入的CCAutoreleasePool。那么到底这个池是怎么使用的呢?
可以看到appController.mm文件中有ios的传统入口函数,
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
而在函数外部可以看到一个static变量:
staticAppDelegate s_sharedApplication
静态变量应该是最先创建的,所以可以看到
CCApplication::CCApplication()
{
CC_ASSERT(!sm_pSharedApplication);
sm_pSharedApplication =this;
}
之后继续进入入口函数,在入口函数中可以看到最后那句
cocos2d::CCApplication::sharedApplication()->run();
这是一句关键,可以看到率先进入
boolAppDelegate::applicationDidFinishLaunching()中,而此时开始需要使用到CCDirector了,下面这句
CCDirector::sharedDirector(),我想大家都比较熟悉了,就不用多做解释了,当第一次使用它的时候,会调用director的init函数,在init函数中会看到
CCPoolManager::sharedPoolManager()->push();这就开始了pool池的初始化,CCPoolManager中有个池栈m_pReleasePoolStack,池栈专门存放的是一个一个的池,而我们添加进去的object就是放入当前池中。
当
boolAppDelegate::applicationDidFinishLaunching()函数成功完成以后进入了主循环,学过vc的都知道,如果想不让程序退出,那就必然会有一个主循环存在。函数
[[CCDirectorCallersharedDirectorCaller]startMainLoop];启动了这个循环,在startMainLoop中可以看到
displayLink = [NSClassFromString(@"CADisplayLink")displayLinkWithTarget:selfselector:@selector(doCaller:)];又是一个关键点,
有人会问,displayLink不是一个id类型吗?不止如此,看到那个NSClassFromString了吗?其实它就是那个CADisplayLink,至于这个类是用来做什么的的呢?就是一个不断刷新的类,而刷新频率由帧率设置决定,就不多谈了。这个里面主要谈到的是doCaller这个函数,在这个回调函数中,会执行下面的操作:
if (m_bPurgeDirecotorInNextLoop)
{
m_bPurgeDirecotorInNextLoop =false;
purgeDirector();
}
else if (!m_bInvalid)
{
drawScene();
// release the objects
CCPoolManager::sharedPoolManager()->pop();
}
也就是说每次主循环,都会有一次pool的清理,把那些计数为0的object都删除掉。这就是cocos2dx中autorelease的内存管理方法了。
讲了这么多,居然还才刚刚接触到重点,哈哈,看来还是有些啰嗦。
那就是如何使用了release和retain了。
总结如下:
1. 当使用create的时候,都是被加入了autorelease的,所以如果需要使用的话,要记得retain一下啊;
2. 如果使用的是new,那么就要记得不用的时候一定要release啊;
3. 一般来说cocos2dx的CCNode都是有create的,比如CCArray不用担心释放问题;
4. vector这些c++函数不要忘记释放内存啊;
5. 最好是不要混用,如果你对他们很清楚,ok,可以的;
6. 为了格式统一,我一般喜欢自己创建create函数。
另外多一句,微云引擎类似。
cocos2dx内存管理的一些看法的更多相关文章
- cocos2d-x内存管理
Cocos2d-x内存管理 老师让我给班上同学讲讲cocos2d-x的内存管理,时间也不多,于是看了看源码,写了个提纲和大概思想 一. 为什么需要内存管理 1. new和delete 2. 堆上申 ...
- 2、COCOS2D-X内存管理机制
在C++中.动态内存分配是一把双刃剑,一方面,直接訪问内存地址提高了应用程序的性能,与使用内存的灵活性.还有一方面.因为程序没有正确地分配与释放造成的比如野指针,反复释放,内存泄漏等问题又严重影响着应 ...
- cocos2dx内存管理机制
参考以下两篇文章 http://blog.csdn.net/ring0hx/article/details/7946397 http://blog.csdn.net/whuancai/article/ ...
- cocos2d-x内存管理(见解)
cocos2d-x 延续了cocos2d 和OC的引用计数的内存管理机制! 下面我们来看看CCDriectro类 CCPoolManager::sharedPoolManager()->push ...
- cocos2d-x 内存管理浅析
Cocos2d-x用create创建对象, 这个方法已经被引擎封装成一个宏定义了:CREATE_FUNC, 下面是这个宏定义的实现: #define CREATE_FUNC(__TYPE__) \ ...
- cocos2dx 内存管理的理解
关于引擎内存管理的细节,网上有大量的详解,这里概括一下: cocos2d-x 的世界是基于 CCObject 类构建的,所以内存管理的本质就是管理一个个 CCObject. //CCObject 内部 ...
- cocos2dx 内存管理
转载自 ocos2dx 内存管理 - 小花原创博客 - 博客频道 - CSDN.NET http://blog.csdn.net/ring0hx/article/details/7946397 coc ...
- Cocos2d-x内存管理研究<二>
http://hi.baidu.com/tzkt623/item/46a26805adf7e938a3332a04 上一篇我们讲了内核是如何将指针加入管理类进行管理.这次我将分析一下内核是如何自动 ...
- Cocos2d-X内存管理研究<一>
http://hi.baidu.com/tzkt623/item/651ca7d7a0aff6e055347f67 半夜没事干,研究内核,作为我cocos2d-x的第一篇教程.cocos ...
随机推荐
- Visual Studio 2013环境下操作vc6/vc7/vc8等低版本平台项目【编译|生成|调试】
现代化的开发环境,微软一直在推出更新换代,我们所处的技术环境在日新月异的变化:不过在中国多数人们一边疲惫的追赶着时代的步伐,一边坚守着自己所获悉所掌握的那些紧吧吧的知本.对技术工具的掌握并非他们所想要 ...
- TextView控件
1.手动创建(不建议): TextView tv = new TextView(this); tv.setContent("你好"); setContentView(tv); 2. ...
- git config找到下载的路径URL
有时想在别的机器上下载自己的上传的源代码,发现git不像svn那么方便一眼就能看到下载地址,这两天在网上查了一下,终于找到方法了. 一般本地的github目录下总会有一个.git目录,点击进入,可 ...
- Fedora 18 安装前指南
Secure Boot 与 Win 8 随着 Win8 的发布,先前关于 Secure Boot 和 UEFI 的诸多猜测也得到了证实,Fedora 18 也将如同当初计划的那样使用 shim + ...
- ACM组队安排
Problem Description ACM亚洲区比赛结束,意味着开始备战明年的浙江省大学生程序设计竞赛了! 杭州电子科技大学ACM集训队也准备开始组队. 教练想把所有的n个队员组成若干支队 ...
- iOS 多线程详解
iOS开发 多线程 概览 机器码是按顺序执行的,一个复杂的多步操作只能一步步按顺序逐个执行.改变这种状况可以从两个角度出发: 对于单核处理器,可以将多个步骤放到不同的线程,这样一来用户完成UI操作后其 ...
- 【转】分享II→IV FPGA本人的几个版本电源模块设计的方案
很多人问我FPGA的电源怎么怎么着,当然也有人瞎忽悠乱设计,当然我的设计也不是很完美...这里把我当年第一次设计FPGA,到现在的电源方案,几个演变.分析的过程,给大家讲讲... (1)FPGA电源方 ...
- Solr4.8.0源码分析(26)之Recovery失败造成的宕机原因分析
最近在公司做SolrCloud的容灾测试,刚好碰到了一个比较蛋疼的问题,跟SolrCloud的Recovery和leader选举有关,正好拿出来分析下. 现象是这样的:比如我有一台3个shard的So ...
- java Active Object模式(下)
Active Object模式的评价与实现考量 Active Object模式通过将方法的调用与执行分离,实现了异步编程.有利于提高并发性,从而提高系统的吞吐率. Active Object模式还有个 ...
- 可重入与线程安全(大多数Qt类是可重入,非线程安全的)
可重入与线程安全 在Qt文档中,术语“可重入”与“线程安全”被用来说明一个函数如何用于多线程程序.假如一个类的任何函数在此类的多个不同的实例上,可以被多个线程同时调用,那么这个类被称为是“可重入”的. ...