记录一下Cocos2dX中内存管理的理解和试验
来源:互联网 发布:googletts语音数据 编辑:程序博客网 时间:2024/05/16 05:46
记录一下Cocos2dX中内存管理的理解和试验
一直弄C++的,还经常到底层晃荡滴,十分不习惯内存这么宝贵的资源不受自己控制的编程,就像大热天坐在电脑前打游戏,边上千把只蚊子飞来飞去一样难受。尤其是那个autorelease,大把的兄弟们分析了它的排队和删除机制了,但私心里总想,自己造出来的东西,为毛不能我想让它滚蛋就滚蛋,总在内存里挂着作甚。虽然autorelease这种机制确实有它的优点,但也没必要到处都用吧……,手机内存现在也不便宜啊。
一、我们的目标
C++的方式一般是new、delete成对用,我们的目标也就是这个,告别静态方法,告别 CREATE_FUNC宏,告别autorelease retain release,重要的是,autorelease的队列中不要加入我们不想加入的东西。
二、一点点摘吧出来
其次是避免使用静态create方法。
这里稍有些不严谨,本来应该构造和析构对应,但显然层对象在App构造的时候构造会@#¥#%@,没有去研究为什么,所以在applicationDidFinishLaunching构造吧,在析构函数中放掉。GameScene是继承Layer的类,实际就写了上面代码中那三个函数,就创建了一个Sprite贴进去而已。其中Scene的创建被我们拿到了AppDelegate中,没有集成到GameScene(虽然还叫这个名字),仍然用autorelease管理(使用静态方法创建)。我们主要看GameScene,可以发现,我们使用new实例化对象m_pMainLayer(类成员),直接调用了对象的构造函数,跟一下,实际就是调用了Layer::Layer(),申请了内存,但是没有autorelease,没有init。
那么,显然现在我们要管理如何放掉它了。如某些同学的说法,可以讲new和release对起来用,一开始我就是这么用的(注释中的内容),但实际情况是,直接用delete好了。现在看起来很像C++了吧,哈哈。
三、Sprite为什么没有用new、delete?
可能有兄弟已经注意到,Sprite,这个最需要我们精细管理的对象这里并没有使用new、delete。确实,一开始我想用来着,先new一个Sprite,然后用initWithFile载入图片,就像静态方法Create一样。但是编译器不干,为什么呢?
看看CCSprite的源码就知道了,CC_CONSTRUCTOR_ACCESS其实就是protect换张皮,换句话说,cocos2dx将new、delete保护起来了,不让用,必须autorelease。可以想见,Layer必然也是,那上面的Layer为什么可以?对了,只要继承一下就行了,此时内存完全由我掌控。
四、是不是有点作?
可能真是有点作吧,俗话说no zuo no die,可能有一天碰上莫名其妙的问题就是如此作出来的,所以立文为证,提醒自己一下。毕竟还是用惯了new、delete和自己亲力亲为的管理,强迫症使然,一个不用自己管的内存扔在那里总觉得这玩意指定泄露了。决定以后如此new、delete的来了,会不会有虾米问题?有木有高手指点一下?
五、现实报来得快
这两天搬家整房子,手头停了一段。今天捡起来按照前面“作”的内容完整的写下来才发现,原来还不仅仅是new delete受protect限制的问题,还有函数initWithFile,没办法,继承类里面加个公开函数包一下吧,这样外面就可以调用了。如何,下面这个是不是看起来舒服多了?如果还觉得不爽,重载个构造函数吧init替了吧,不过这样就只能ASSERT initWithFile返回True了。
哈哈,首先解决个人习惯问题,后面爬起代码来才会爽。
- 记录一下Cocos2dX中内存管理的理解和试验
- cocos2dx 使用过程中内存管理的理解
- 三分钟理解cocos2dx的内存管理
- 理解stl内存管理方式和cocos2dx不符
- cocos2dx的内存管理
- cocos2dx 的内存管理
- 学习cocos2dx的内存管理
- 记录一下servletcontext的理解
- android 中关于内存管理的记录
- 关于glibc中内存回收的试验
- 1.cocos2dx内存管理和CCArray,CCMenuItem
- 关于cocos2dx内存管理机制的记录
- 内存管理的理解
- 内存管理的理解
- 总结一下iOS中内存管理
- cocos2dx中CC_CALLBACK_N的理解
- 关于cocos2dx中create和new的理解
- Cocos2dx内存管理、优化减少内存和多线程方面的问题
- java反射
- 怎么样通过使用git来创建并提交你的第一个linux内核patch
- SOAP Array Overflow
- 《UNIX环境高级编程》中的apue.h
- Android-自定义meta-data扩展数据
- 记录一下Cocos2dX中内存管理的理解和试验
- js-jQuery对象与dom对象相互转换
- 第九周作业
- 4399骆海坚:如何打造页游核心竞争力
- [Bzoj2243][SDOI2011]染色
- linux系统管理--NFS配置
- C# DllImport用法和路径问题
- matlab画概率密度图
- 微软件为其他人请问而tyre我