今天跟大家伙儿聊聊我最近在“大型游戏”项目上的折腾,真是累死个人!
老板大手一挥,说要做个“史诗级”的大型游戏。我当时心想,史诗级?那得多少人多少钱!结果一看,就给我一个前端小组,人手嘛五个,包括我。钱嘛自己想办法。
行,硬着头皮上。得选技术栈。大型游戏,性能肯定得顶上去。我寻思着,这玩意儿得用个靠谱的引擎,当时调研一圈,Unity、Unreal、Cocos Creator都看。Unity上手快,资源多,但性能上差点意思;Unreal引擎太重,我们这小团队hold不住;Cocos Creator轻量级,但感觉做大型游戏又差点劲儿。综合考虑一下,还是选Unity,毕竟咱人少,得先能跑起来再说,后期优化慢慢搞。
引擎定,接下来就是开发流程。大型游戏,代码量肯定巨大,没有好的代码管理,那还不得乱成一锅粥?果断上Git,然后又配GitLab,这样代码提交、分支管理、代码审查都能搞起来。团队里每个人都必须遵守Git flow,不然直接打屁股!
美术资源也是个大头。美术那边导出的模型、贴图,动不动就几个G。为方便管理,我让他们也用Git提交,只不过用的是Git LFS(Large File Storage),专门用来管理大文件的。这样,美术资源也能版本控制,再也不怕“昨天那个版本贼好看,今天怎么改丑”的悲剧重演。
开发过程中,遇到的坑那是数不胜数。我们想直接用Unity的默认UI系统,后来发现性能实在太差,尤其是UI元素一多,直接卡成PPT。没办法,只能自己写UI渲染逻辑,用UGUI深度定制,疯狂优化DrawCall,各种Batching、Object Pooling,搞得我头发都快掉光。
还有内存管理,大型游戏,内存泄漏那就是噩梦。Unity的Garbage Collector(GC)经常抽风,动不动就Stop The World,卡顿几秒钟。为解决这个问题,我们只能尽量避免频繁创建和销毁对象,能用对象池的就用对象池,能复用的就复用,尽量减少GC的压力。
网络同步也是个麻烦事儿。我们想做个多人在线的游戏,服务器和客户端之间的数据同步必须得快。一开始想用Unity的UNet,结果发现这玩意儿早就停止维护,坑太多。没办法,只能自己搞,用Mirror这个开源网络库,自己魔改,各种优化,才勉强能跑起来。
好不容易把游戏的主体功能做完,测试的时候又发现各种bug。UI显示错位、角色穿墙、AI智障……每天都在修bug的路上。用TestFlight做内部测试,然后又找些玩家做外部测试,收集一大堆反馈,然后又开始疯狂修bug。
这回“大型游戏”项目真是把我给折腾惨。虽然过程很痛苦,但学到的东西也很多。深刻体会到,做大型游戏,技术选型很重要,开发流程很重要,性能优化很重要,测试也很重要。以后再也不敢轻易接这种“史诗级”的项目,除非老板肯多给几个人,多给点钱!
还没有评论,来说两句吧...