首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Iphone >

cocos2d自己总结的几个和内存相关的有关问题

2012-01-19 
cocos2d自己总结的几个和内存相关的问题昨天第一次把程序放到真机上运行,结果程序运行2,3秒后,直接当掉。当

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,我们一起进步...

热点排行