cocos2d自己总结的几个和内存相关的问题
昨天第一次把程序放到真机上运行,结果程序运行2,3秒后,直接当掉。当时就被吓啥了,马上就要交程序了,以前用模拟器运行都是好好的,咋个一上真机就不行了啊?在网上一搜,才发现是内存出了毛病。于是检查了下内存占用情况,不看不知道,一看吓一跳,程序初始加载内存就有360m!,玩了几关后,内存马上就飚到了500m。这可太恐怖了。于是自己花了1整天的时间,仔细研究了一下cocos2d的内存问题。经过一系列优化,把内存占用降到了最高只有190M左右,这才解决了这个让人紧张万分的问题。以下是我整理的几个和内存相关的点,希望对遇到同样内存问题的朋友有所帮助!
1.慎用大图片
图片占用内存大小的算法为一张1024*1024的图片,加载成纹理后,占用1024*1024*4(4m)内存。渲染成精灵后,又会占用和纹理一样的内存,所以这种图片占用的总内存是8m。(绘制精灵的时候,以精灵的绘制这种图片的大小计算内存,例如只绘画这张图片的 某个 28*28大小的 区域, 那么只需要一个 32 * 32 *4 = 4K的内存大小)
2.图片尺寸很重要
图片尺寸里有大陷阱,1024*1024和1025*1025的图片看似差不多,其实内存占用有天壤之别,因为cocos2d对图片的尺寸是按2的N次方自适应的,所以1025*1025的图片加载后实际纹理大小为2048*2048,纹理将占用8m内存!是1024*1024那张图片的2倍。所以遇到类似尺寸图片,最好先用PS调整下大小。
3.使用工具查看内存占用
用xcode自带的Leaks工具可以很方便的查看程序占用的情况和寻找内存泄露的堆栈。
4.检查对象有没被释放
当代码越来越复杂的时候,你就要担心某些对象可能在其他你没注意的地方给保留了引用计数,导致你在对这个对象使用release方法时,实际对象并没有被dealloc掉。所以你得通过在每个对象的dealloc方法中打上断点调试或者输出日志,来确认该对象是否真的被释放了。
5.使用真机测试
一般在模拟器中,因为电脑内存本身较大,所以在这种情况下,即使你的程序占用内存很高,也不会收到任何警告和异常。但是如果在iphone或者ipad上进行真机测试,因为设备可用内存较少,所以大多数的内存问题就会暴露出来。所以提早进行真机测试是很有必要的。
(在真机上,程序运行效率也会大大提升,在模拟器上游戏帧数10帧不到,放到真机上居然是60帧满的,mac mini的性能真是菜啊!)
6.内存警告。
当机器内存吃紧的时候,会给程序一个内存警告消息。这个消息分为1和2两种等级,等级1的时候基本上问题不大。等级2的时候就要注意了,通常这时离崩溃不远了(程序内存占用在350M左右一般会收到等级2的警告。)。如果程序的内存占用超过400M,基本上这时程序就会直接被操作系统杀死,表现在ipad上就是程序直接退出。而这时候程序不会打印任何有助于你检查的log!
惊世科技 张世本
QQ:454882367
MSN:supershiben@hotmail.com
2011 / 8 / 20
[解决办法]
谢谢分享
[解决办法]
用sprite sheet 将纹理合在一起,能有效降低内存。
另外,“渲染成精灵后,又会占用和纹理一样的内存,所以这种图片占用的总内存是8m”,这样说不对。仅仅纹理占用内存。
还有,“在真机上,程序运行效率也会大大提升,在模拟器上游戏帧数10帧不到,放到真机上居然是60帧满的”,真机是模拟的方式,也就是用x86跑arm,用台式机的cpu跑当然速度不一样了。这不同于android那种仿真的方式。
如果游戏有音乐的话,那对内存的占用也是相当大的
[解决办法]
感谢分享
[解决办法]
不错。。。。
[解决办法]
你好,
已加你的QQ,我们一起进步...