我的第一个游戏FoodieThebug完成之后的心得体会
距离上次发博客已经有两个月的时间过去了,期间好几次想抽出时间来写,最后却总是因为某些原因没动手。主要原因是最近确实太忙了,一边要做兼职游戏开发(full版,lite版,christmas版),一边还在给导师打工,做一个mes系统。每天从早上8点加班到晚上10点,回到学校都快11点了,确实太累了。所以,有点时间,我都在逛论坛,看文章。今天上午忙里偷闲,于是准备静下心来,谈一谈我的第一个iphone游戏开发的心得体会,跟大家分享一下。
关于我制作的游戏的内容,我上次在新浪微博上已经发了一个视频,公司美工比较给力,看起来游戏内容还不错。呵呵,心里还是比较开心的。这个游戏采用cocos2d和box2d制作而成,而box2d只用到了其中一部分功能,即碰撞检测和AABB query。游戏从今年5月份开始做,真正完成大概在11月份左右。后来的游戏数值微调,界面修改,代码优化大概花了1个月左右的时间。上架的时候出了很多问题,由于后来我去做mes了,于是游戏gameCenter和广告部分,还有一些菜单页面是公司的同事帮忙一起完成的。这中间代码合并的时候,出了点问题,导致上架之后,发现还有一个很严重的bug,结果不得不重新拿去送审。还有后来的lite版本,由于不符合apple的送审规范,结果被reject了,又得重新改。最搞笑的是,full版第一次送审的时候,程序大小有110多M,因为要同时支持高清和普清的,但是,不知道什么时候,我在代码里面加了一句[CCDirector sharedDirector] setContentScaleFactor:1.0];结果,高清图片都浪费了,实际程序还是不支持高清的,白白占用了那么多突然间。而且对于size大于20M的程序,是不可以通过蜂窝网下载的。而我后来查看了一些排名靠前的游戏,几乎全部是size小于20的。而最近的一个榜首的游戏,amazing breaker,大小是19.5M,卡的那么死。说明游戏大小对于下载是来说影响确实不容忽视。后来,我想重新支持高清模式,结果发现内存使用过多,程序经常crash。最后,没有办法,只得舍弃Retina display了。最终full版加christmaas更新,差不多47M,最终版本估计还有差异。该版本还在送审中,应该马上能在apple store 里面看到了。
说了这么多,接下来我谈谈自己的几点心得体会吧,希望对第一次动手开发iphone游戏的童鞋有所帮助。
第一点:从一开始就关注程序内存使用!
大家看了我的博客,想必现在都在使用texturePacker来制作大图以节省内存和程序大小,还有响应速度。但是,使用texturePacker有几个要注意的地方。首先,制作出来的大图尽可能地充分利用空间,图的大小最好在1024×1024.不用制作2048×2048的图。因为有些老版本的设备最大只支持1024×1024的大小。充分利用空间是什么意思呢?就是把空白区域占满!一定要想尽办法占满,由于是菜单界面和其它非游戏画面,因为这些画面不需要加载到一个batchNode里面去,所以可以多个场景的图交叉引用。但是,如果是游戏里面的场景,因为有动画,所以,最好还是把相关的动画制作成pvr.ccz大图,比如player.pvr.ccz。还有一点,在init方里面
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"GameOver.plist"];
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"Achievement.plist"];
需要对应的在dealloc方法里面:
[[CCSpriteFrameCache sharedSpriteFrameCache] removeSpriteFramesFromFile:@"GameOver.plist"];
[[CCTextureCache sharedTextureCache] removeTextureForKey:@"GameOver.pvr.ccz"];
因为pvr.ccz文件是压缩格式,他在第一次加载的时候会调用系统的解压缩程序,造成内存急剧上升,所以,在游戏画面loading的时候,一定不要loading太多,特别是在高清设备上,有时候由于你内存使用过多,可能会被系统直接kill掉。还有,很多童鞋都有这样的经历,就是在切换场景的时候,提示内存警告,特别是高清模式下面。这里有几个小技巧,可以帮忙大家避免这个问题。首先,制作的pvr.ccz图片不要太大,像素格式用rgba4444的,这样可以节约一半内存。当然,如果使用这种像素格式,那必须加抖动,否则你的画面会模糊不清的。其它,要保证每一个场景的dealloc方法在replaceScene的时候都有调用,你可以在debug模式下面用CCLOG在dealloc函数里面输出。如果场景切换的时候没有调用,说明你这个场景的内存有问题。有可能被某个对象retain了,其retainCount在replaceScene的时候没有减少到0,所以dealloc方法是不会调用的。如果dealloc方法都没有调掉,那么这其实就是一种内存泄露,因为你很有可能会在这个scene里面定义很多对象。
还有一点,dealloc的顺序,先释放自己的,再调用[super dealloc].对于想支持高清的童鞋,还有一个建议就是,使用部分高清。背景图片不高清,而其它icon和按钮高清,这样给人的感觉,你的程序还是支持高清的。关于cocos2d里面如何部分支持高清,可以参考这个链接。
第二点:从一开始就关注程序大小!
我觉得一个好游戏的标准,至少有一条,就是size不超过20M.这需要很强大的功底才行的。包括游戏设计,不能使用大量的图片来堆积出一个以内容为主的游戏。不过初期,为了抢眼,这种游戏制作起来还是比较方便的。但是,程序大小超过20M有个不好的地方,就是用户必须通过电脑下载同步。而不能直接通过3G网络下载。这对于有一些人士来说,他们会觉得很不方便,所以,无形之间会影响你的游戏的下载量。美工在制作图片的时候,尽量使用小图,音效师在制作音效的时候,音效格式最好使用mp3,而且背景音效最好在800KB以下。否则一个游戏下来,音效都有10多M,那太难了。
不单是内存的使用要斤斤计较,而且其它游戏资源,也是一样。包括字体文字。如果只是为了显示分数,那么在制作字体文件的时候,就可以不包含字母。还有,有些时候,比如同一个icon,在不同的场景大小不一样时,也没有必须制作两张图,可以制作一张大图,然后在需要使用小图的地方,设置一下scale就行了。当然,最重要的是要学好opengles,很多效果,能不用图片实现的,就尽量不要用。而且好多效果,单纯用图片也是制作不出来的。我现在也在想尽办法学习opengles,这玩意儿太重要了!
第三点:从一开始就关注游戏FPS。
所谓FPS就是游戏的帧速,可以通过设置AppDelegate里面的[director setDisplayFPS:YES];来开启。通过游戏的帧速,你一定要保持在40帧以后。最好是60帧。而且要多测试几个设备,如果4代的touch或者iphone都不能达到40帧以上的话,那么你真的要注意优化你的帧速率了。那么,优化帧速率有哪些方法呢?记住一个准则就行了:永远不要在使用的时候才去创建!这里面不仅仅指游戏图片资源,音效资源,还包括游戏里面的各种对象。必须要事先创建好,需知,创建内存属于io操作,那是相当慢的,会极大地影响游戏的帧速率。所以,大家游戏里面要用到的对象,都可以用一个CCArray装起来,然后把visible设置为NO,然后在需要使用的时候,那从这个array里面选择一个visible为NO的,然后show出来。这个array的功能就相当于我们熟悉的内存池。box2d为什么不让你手动去new对象,而是由world对象去管理创建和销毁。效率!因为考虑连续内存分配、cache命中等原因。所以,大家这个一定要注意。还有游戏中的action,也需要先创建好,然后retain,这样游戏中就可以重复使用,但是,千万要记得在dealloc方法里面release掉。当然,优化FPS的方法还有很多很多,比如使用CCLabelBMFont显示分数,而不是CCLableTTF,比如优化那些耗时长的代码段,提高算法效率。这个要看个人经验积累,我自己也是个初学者,所以不能给大家更多的建议,希望朋友们一起分享一下,这样可以让大家都少走一些弯路。
第四点:除了制作游戏,你还需要关注点其它的
比如apple store上架审核规则,比如如何打包制作ipa,比如code signing,比如debug,比如音效格式、图片格式等。这些看似不重要的东西,对后面的游戏发布起着灰常重要的作用。还有代码编码风格,代码管理工具(git)使用,变量命名艺术,类编写原则等。建议大家读一读《代码大全》和《程序员修炼之道》。以前读过一些,当时只觉经典,但是实际获益并不是很多。最近重读之后,有种豁然开朗的感觉。温故而知新,真理也!为什么我又讲到这里了,因为,游戏是要update的,如果前面的代码没写好,后面的update极有可能引入大量的bug,导致没法update。而且,设计师的想法是在你制作游戏过程中不断完善的,这中间会不断地提需求,让你改,让你更新。如果代码很乱,那会累死去。我个人是个面向对象和设计模式爱好者,阅读了大量的设计模式、敏捷开发、重构的书籍,对于游戏的架构和模式也有非常浓厚的兴趣。所以,今后,我尝试写一些游戏模式和架构方面的文章。
最后,如果大家有想翻译游戏教程的,可以联系我(why?因为我们目前组成了灰常具有激情的团队,我们想在这个物欲横流的时代做点有价值的事!加入我们吧!)。版权归译者所有,大家可以建立自己的博客,然后我转载也可,两边同时发也行。总之,一句话,help you , help me,help us,help all。
从小就有开发游戏的梦想,现在终于实现了,而且在这么酷的设备上,简直就是legend of awesomeness!本科为了做游戏了,学习了4年C++,结果还是没能做出一个游戏,想想真不值啊。希望在这里,能给后来的ios游戏开发爱好者带去一份帮助。
欢迎大家和我讨论ios游戏开发的问题 :)
要论坛交流,请点击传送门!
著作权声明:本文由http://www.cnblogs.com/andyque原创,欢迎转载分享。请尊重作者劳动,转载时保留该声明和作者博客链接,谢谢!