cocos2dx内存管理的一些看法

来源:未知 责任编辑:智问网络 发表时间:2013-11-12 17:12 点击:

今年年初进入一家游戏公司,正式开始游戏引擎的学习,之前的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函数。

 


另外多一句,微云引擎类似。

 

    发表评论
    请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
    用户名: 验证码:点击我更换图片
    最新评论 更多>>

    推荐热点

    • cocos2d-x学习笔记(19)--label 、label atlas
    • cocos2d-x学习笔记(23)--地图的使用3--CCTMXLayer
    • Cocos2d-x学习(一):HelloWorld
    • cocos2dx在xcode下开发,编译到android上(2)
    • cocos2d 设置屏幕默认方向
    • Cocos2d-x 2.0 之 Actions “三板斧” 之一
    • cocos2d-x学习笔记(22)--地图的使用2(TMX) --Z-Order、AnchorPoi
    • cocos2d-x学习笔记(18)--游戏打包(windows平台)
    • cocos2d-x学习笔记(16)--spritesheet(精灵表单)
    网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
    Copyright © 2008-2015 计算机技术学习交流网. 版权所有

    豫ICP备11007008号-1