我的北京游戏开发总结【三】
大家好,我是Syc,多谢大家一直以来对VC驿站的支持!
书归正传,以上两篇文章就是个人对于该款游戏框架方面的一些简单分析,此外还有一些比较重点的经验性总结给vc驿站-www.cctry.com的网友罗列出来,捞点干的东西给大家压轴。当然这些东西也不都是我这次去北京学习之后才了解到的,以前也都会注意这些问题,但是我这次去北京做项目深深的体会到了这些技术点的重要性,因为都在项目中有充分的体现:
1、内存方面的问题一定注意,同时要及早发现,及早解决。大家平时在写代码的时候就应该多注意内存的问题,溢出、泄露之类的,还有一个是效率问题。本身移动设备上受硬件条件的限制,不同于pc,所以内存不能无限制的去用,另外,iOS与 Android 的系统中的程序都是运行在沙盒模式下,一旦您的程序内存超标系统就会直接Kill掉你,所以如果大家的程序资源比较多,不要在程序启动的时候就一下子全都载入,这样比较浪费,也怕内存吃不消。不过有人会说那我用到一个载入一个,不用的时候就释放总该行了吧?但完全这样做也不能说永远是正确的,这就是我说的要考虑内存效率的问题,一些类似数字显示的数字图片资源,比如:游戏分数、游戏消耗时间、游戏剩余时间等等,在你的程序中会很经常的用到,你同样是用的时候载入不用的时候释放,这样资源来回进行内存的切换会耗费更多的时间,效率受影响,所以类似这样的数字资源可以在程序启动的时候载入,程序退出的时候再释放了,毕竟占用的内存不大。
另外,Cocos2d-x本身在类似CCSprite这样的类中都有提供Cache缓存机制,所以这个也是建议大家去使用的,可以提高效率,但是最好理解了他的原理之后再好好的去使用,不要一味的向Cache中添加东西,这样即使内存中实际的资源是一份也是不行的,因为其引用计数是多个,所以在进行释放的时候是不会完全释放的。再一个,大家在做项目的过程中遇到问题了最好及时解决不要等到项目要结束的时候再一起查内存方面的问题。我们这个项目就遇到了这么一个情况,最后才查内存的问题,但是发现真要是想改起来的话改动会比较大,但是项目周期马上要结束了,所以时间上来不及,最后还是通过其他的方式来解决的;
////////////////////////////////////////////////////////////////////////////////
// 备注:本篇文章来自 vc驿站:http://www.cctry.com
// C、C++、VC++ 各种学习资源,免费教程,期待您的加入!
/////////////////////////////////////////////////////////////////////////////////
2、代码注释方面要多写、勤写,大家有的可能平时自己写程序的时候不经常写注释,没这个习惯,包括我在内也一样。但是当多个人一起合作开发一个比较大的项目,代码量慢慢增加的时候你就会发现平时写注释的好处了,有时候自己前期写的代码到后期都得好好想一会才能理清思路,后期还有可能是你去改动别人写的代码,所以这个时候如果对方代码一点注释都没有,你敢上去就修改吗?肯定不敢,必须先读懂对方这块代码的实现流程,弄懂了之后才能进行流程的修改以及Bug的修复;
3、善于使用assert、log输出之类的调试手段,随着代码量的增加,虽然你的代码有注释,但还是不够的,可能程序某一块的功能异常,虽然你加上了些 if-else 的判断,但是程序没有断住,所以异常信息捕获不到,这个时候你就要去Debug查找,肯定会花费一定的时间。使用assert就不同了,程序会直接类似断点一样的断住,可以节省不少时间的;
4、程序的可扩展性要注意,当然这里面的可扩展性我不仅仅是指宏观上面的程序架构,微观到程序上的某一个机能也是要注意的。如果可以封装成某个函数或类尽量把相关机能封装起来,这样也方便其他模块去调用,同时对于后期的程序处理方面也是非常易于修改和移植的。否则很多机能都写在一起,如果后期要进行流程的修改可能不太容易,改动会比较大。在这个项目中就深深的有体会,前期的开发人员将所有的两个场景切换中间都加了个进度条的中间场景,同时在这个中间场景中进行了些下一个场景的资源前置加载等工作,场景之前的关联性比较大,但是后期策划案有调整:战斗结束之后切换到结算场景时不需要这个中间的过渡场景,因为前期模块化做的不是很好,所以我们后期的修改工作就麻烦多了……
5、程序开发人员与美术人员之间的协调工作要做好,毕竟大家都是在合作一个项目,所以,如果一个功能直接让美术人员做幅图片比让程序人员用代码开发省时省力的多,那么何乐而不为呢?比如,要对一幅彩色图片进行灰化处理,用程序来实现也是可以的,不过得弄懂这个图片处理算法,之后才能实现,但如果让美术人员用ps来对这个图片做处理的话可能2分钟就搞定了……
////////////////////////////////////////////////////////////////////////////////
// 备注:本篇文章来自 vc驿站:http://www.cctry.com
// C、C++、VC++ 各种学习资源,免费教程,期待您的加入!
/////////////////////////////////////////////////////////////////////////////////
6、别人的代码也不是完美无错的,包括Coco2d-x的也一样,本身Coco2d-x现阶段来说也是个半成品。另外,对于Coco2d-x这样的跨平台东东,在一个平台下没问题,不一定在另外的平台下就没问题。之前做了个文字滚动的功能,发现在Win32平台下CCLabelTTF组件并没有像其文档上说明的那样正常的实现了相关的功能,而是有偏差,所以我们修改了Coco2d-x引擎中Win32部分的实现代码,修复了其Bug,当然这个功能在iOS平台下是正常的;
7、再说一个封装移植的技巧吧,也是从北京某大牛那学的:C是C++和Objective-C的中间桥梁!之前做了一个IAP(In App Purchases)程序内付费这么一个东西,主要是针对iOS平台的,所以苹果提供了底层的实现,不过是基于Objective-C语言的,我们的游戏是用C++编写,所以就要对IAP部分的底层Objective-C实现进行封装,供C++去调用。刚开始确实没什么思路,后来看了相关代码之后理解了,可以通过C语言在中间中转一下,毕竟Objective-C和C++都可以无缝和C语言进行互调,所以C语言就在中间起了一个Bridge的作用;
8、要实现一个相对独立的新机能时,可以先在一个小工程或者小demo中去试做,如果成功的实现了再移植到自己的程序项目中,这样可以避免一些其他方面干扰的问题。这个游戏项目使用的数据库是SQLite3,可以直接使用任意一款SQLite数据库查看工具查看和修改其存放的数据,为了安全起见,不让用户随便修改游戏配置及奖励信息,所以我们要对数据库进行加密,这里使用的是WxSQLite,但是得重新下载编译SQLite3和WxSQLite的代码,中途也遇到了不少问题,当时我就不确定是我们工程的问题,还是各种库弄到一起冲突了,外在因素比较多。所以这个时候我就新建了个小工程进行测试,最后完美的解决了……然后再合成到我们的游戏项目的工程中,这样还是非常不错的!
9、要考虑到多平台对应的可移植性问题,避免类似“%2s”的指定宽度格式化字符串问题发生,事实证明Windows平台下验证的比较宽松,会忽略“%2s”中的‘2’,因为根本就不支持,只有“%s”,所以会得到格式化后的结果字符串,而在iOS平台下就比较严谨,既然不支持这种格式化字符串就直接返回一个空串,所以两个平台下的返回结果就不一样了,Windows平台下正常,iOS平台下就产生了问题;
////////////////////////////////////////////////////////////////////////////////
// 备注:本篇文章来自 vc驿站:http://www.cctry.com
// C、C++、VC++ 各种学习资源,免费教程,期待您的加入!
/////////////////////////////////////////////////////////////////////////////////
10、游戏的设计应该从玩家的角度去考虑,从玩家的角度去看待问题以及解决问题,另外关卡设计等的从易到难,这个难并不是我们要刻意的去难为玩家,而是要让玩家在玩游戏的过程中有种爽与过瘾的感觉,这样才能增加游戏的可玩性,吸引住玩家!
好了,总算是写完了,这三个月来总结的东东就先跟vc驿站-www.cctry.com的网友分享到这里,以后再有好的东西还会给大家写的,最后还是希望大家一如既往的支持vc驿站-www.cctry.com,谢谢大家!