今年年初进入一家游戏公司,正式开始游戏引擎的学习,之前的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内存管理的一些看法的更多相关文章

  1. cocos2d-x内存管理

    Cocos2d-x内存管理 老师让我给班上同学讲讲cocos2d-x的内存管理,时间也不多,于是看了看源码,写了个提纲和大概思想 一.   为什么需要内存管理 1. new和delete 2. 堆上申 ...

  2. 2、COCOS2D-X内存管理机制

    在C++中.动态内存分配是一把双刃剑,一方面,直接訪问内存地址提高了应用程序的性能,与使用内存的灵活性.还有一方面.因为程序没有正确地分配与释放造成的比如野指针,反复释放,内存泄漏等问题又严重影响着应 ...

  3. cocos2dx内存管理机制

    参考以下两篇文章 http://blog.csdn.net/ring0hx/article/details/7946397 http://blog.csdn.net/whuancai/article/ ...

  4. cocos2d-x内存管理(见解)

    cocos2d-x 延续了cocos2d 和OC的引用计数的内存管理机制! 下面我们来看看CCDriectro类 CCPoolManager::sharedPoolManager()->push ...

  5. cocos2d-x 内存管理浅析

    Cocos2d-x用create创建对象, 这个方法已经被引擎封装成一个宏定义了:CREATE_FUNC, 下面是这个宏定义的实现: #define CREATE_FUNC(__TYPE__) \   ...

  6. cocos2dx 内存管理的理解

    关于引擎内存管理的细节,网上有大量的详解,这里概括一下: cocos2d-x 的世界是基于 CCObject 类构建的,所以内存管理的本质就是管理一个个 CCObject. //CCObject 内部 ...

  7. cocos2dx 内存管理

    转载自 ocos2dx 内存管理 - 小花原创博客 - 博客频道 - CSDN.NET http://blog.csdn.net/ring0hx/article/details/7946397 coc ...

  8. Cocos2d-x内存管理研究<二>

    http://hi.baidu.com/tzkt623/item/46a26805adf7e938a3332a04   上一篇我们讲了内核是如何将指针加入管理类进行管理.这次我将分析一下内核是如何自动 ...

  9. Cocos2d-X内存管理研究<一>

    http://hi.baidu.com/tzkt623/item/651ca7d7a0aff6e055347f67        半夜没事干,研究内核,作为我cocos2d-x的第一篇教程.cocos ...

随机推荐

  1. arm Linux 系统调用过程

    系统调用是操作系统提供给用户(应用程序)的一组接口,每个系统调用都有一个对应的系统调用函数来完成相应的工作.用户通过这个接口向操作系统申请服务,如访问硬件,管理进程等等.但是因为用户程序运行在用户空间 ...

  2. 用Python高亮org-mode代码块

    文章同时可在我的github blog上阅读:http://cheukyin.github.io/python/2014-08/pygments-highlight-src-export-html.h ...

  3. Linux redhat

    挂载U盘 fdisk -l 可以列出所有的分区,包括没有挂上的分区和usb设备.我一般用这个来查找需要挂载的分区的位置,比如挂上u盘. mount /dev/sdb1 usb/

  4. cocod2d-x 之 HelloWorld

    cocos2d-x 2.2创建项目 进入cocos2d-x-2.2/tools/project-creator,运行命令 python create_project.py -project MyGam ...

  5. An erroroccurred while filtering resources

    maven报错: maven An error occurred while filtering resources Maven -> Update Project... resolved th ...

  6. 解决nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed错误

    重新启动服务器,访问web服务发现无法浏览,登陆服务器之 后进到nginx使用./nginx -s reload重新读取配置文件,发现报nginx: [error] open() "/usr ...

  7. 下载jdk-api 1.7文档

    第一步:查看你所下载的JDK版本.在cmd中输入“java -version”即可. 第二步:输入网址:http://www.oracle.com/technetwork/index.html 第三步 ...

  8. SQL语句の集锦

    6.删除数据后根据主键从备份表中恢复 insert  sameTable_1 (name,dz) select name,dz from sameTable_1_bak where not exist ...

  9. bzoj2180: 最小直径生成树

    Description 输入一个无向图G=(V,E),W(a,b)表示边(a,b)之间的长度,求一棵生成树T,使得T的直径最小.树的直径即树的最长链,即树上距离最远的两点之间路径长度. Input 输 ...

  10. [BZOJ 3236] [Ahoi2013] 作业 && [BZOJ 3809] 【莫队(+分块)】

    题目链接: BZOJ - 3236   BZOJ - 3809 算法一:莫队 首先,单纯的莫队算法是很好想的,就是用普通的第一关键字为 l 所在块,第二关键字为 r 的莫队. 这样每次端点移动添加或删 ...