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

supershiben 2011-08-20 12:51:56
昨天第一次把程序放到真机上运行,结果程序运行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
...全文
579 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhousmith2011 2011-09-03
  • 打赏
  • 举报
回复
好贴,学习
程序员小迷 2011-09-03
  • 打赏
  • 举报
回复
你好,
已加你的QQ,我们一起进步...
yukiwang313 2011-08-25
  • 打赏
  • 举报
回复
不错。。。。
InvincibleSS 2011-08-25
  • 打赏
  • 举报
回复


感谢分享


sniffer12345 2011-08-22
  • 打赏
  • 举报
回复
用sprite sheet 将纹理合在一起,能有效降低内存。
另外,“渲染成精灵后,又会占用和纹理一样的内存,所以这种图片占用的总内存是8m”,这样说不对。仅仅纹理占用内存。
还有,“在真机上,程序运行效率也会大大提升,在模拟器上游戏帧数10帧不到,放到真机上居然是60帧满的”,真机是模拟的方式,也就是用x86跑arm,用台式机的cpu跑当然速度不一样了。这不同于android那种仿真的方式。
如果游戏有音乐的话,那对内存的占用也是相当大的
念茜 2011-08-21
  • 打赏
  • 举报
回复
谢谢分享
wuyu637 2011-08-21
  • 打赏
  • 举报
回复
nice留名字干啥啊?
 首先,对于一个完全没有mac开发经验,甚至从没摸过苹果系统的开发人员来说,首先就是要熟悉apple的那一套开发框架(含开发环境IDE、开发框架uikit,还有开发语言objective-c)。对于有一定编程经验的人来说,学习objective-c可能1-2周时间就够了,但是,要真正用好这门语言,并且最大限度地利用这门语言来提高开发效率的话,那就需要时日了。这里推荐两本书《objective-c基础教程》和《iphone开发基础教程》,这两本都是圣经级的巨作,我相信每一个iphone开发人员应该都不会错过这两本书的。   等你xcode和objective-c摸熟之后,或者说,上面提到的那两本书看完之后。这时候,你就可以开始学习游戏开发了。而目前,我个人觉得使用开源的游戏框架cocos2d来开发iphone上面的游戏是首选。为什么呢?其一,它是免费的,其二,它有强大的社区支持,而且网上还有许许多的优秀的辅助资源,包括教程、类库、工具程序、物理引擎、声音引擎等等。   接下来,我谈谈学习cocos2d,我觉得最好的资源有两个,就是两个网址:一个是cocos2d官网www.cocos2d-iphone.org,特别是论坛,你学习过程中遇到的任何问题到可以去那里提问。还有一个,就是http://www.raywenderlich.com/博客。这是一个牛人,我非常喜欢的一个牛人!首先,他写的教程非常清晰明了,一看就会,但也不失深度。而且在他的博客里,除了讲述cocos2d和游戏编程之外,还有iphone应用开发的一些知识。我觉得任何人都不应该错过他的博客!   另外,市面上现在有一些cocos2d方面的书籍,但是我只下载到了《Learn iPhone and iPad Cocos2D Game Development》这本书的电子版,听说网上已经有人在尝试翻译这部书了。不知进度如何。 上面提到的这本书的翻译教程链接是:http://www.cocoachina.com/bbs/read.php?tid-55155.html 这本书也写得非常好,里面非常系统地讲解了开发iphone和ipad上面的游戏需要注意的一些问题,比如内存很少的问题等。同时书里还涉及了cocos2d开发中大部分的内容,基本上可以说是所有的内容。同时,这本书的作者的网站也是不容错过的资源。 www.learn-cocos2d.com,里面有许多非常有用的链接,大家可以去看看。   当然,我忘记了一个很重要的部分。我看的第一个教程,就是知易写的cocos2d系列教程,教你如何使用tile map做一个坦克大战的游戏。这一系列的教程也是经典之作啊!:) 1.知易Cocos2D-iPhone 游戏开发教程001 (341) 2.知易Cocos2D-iPhone 游戏开发教程002 (94) 3.知易Cocos2D-iPhone 游戏开发教程003 (71) 4.知易Cocos2D-iPhone 游戏开发教程004 (73) 5.知易Cocos2D-iPhone 游戏开发教程005 (65) 6.知易Cocos2D-iPhone 游戏开发教程006 (66) 7.知易Cocos2D-iPhone 游戏开发教程007 (102)   等你把上面的内容都看得差不多的时候。这时候你需要做的是什么呢?没错!实践!实践!开发几个自己的小游戏。比如超级玛利、雷电什么的。如果要进一步深入学习cocos2d,那里仔细研究它里面testBed里面的例子工程是非常不错的选择,还有box2d testbed里面的例子。(现在大部分排名靠前的游戏,比如angry birds和tiny wings 都使用的box2d物理引擎!)   还有什么呢?呵呵,如果大家不嫌弃的话,我会翻译一些非常好的英文资料奉献给大家(大概每周2-3篇的样子,如果人气比较旺,我就加把劲啦!:)),当然还有我自己的一些心得和体会。总之,希望我们能够共同学习,一起进步。开发属于自己的游戏! 补充一点:www.ipadev.org,国人办的,这个网站相当不错!给大家推荐一下,上面有斯坦福大学iphone开发视频教程中英文字幕版1-6集,还有超过100本的iphone开发方面的电子书可下载(速度很快哦!)。   更新:如果大家在学习和工作中遇到什么问题,请给我留言,大家一起讨论一下。或者大家在看我翻译的教程的时候,如果实践起来有问题,也可以留言。或者说我翻译的不够好,请大家务必指出来!这样对以后的人都有好处。当然,如果大家觉得自己看起E文来有些吃力,或者相信我本人的翻译质量的话,如果找到一些好的E文资料或文章,也欢迎发个地址给我,我再翻译出来。谢谢!

29,027

社区成员

发帖
与我相关
我的任务
社区描述
主要讨论与iOS相关的软件和技术
社区管理员
  • iOS
  • 大熊猫侯佩
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧