GMGC开发者训练营|盖娅互娱研发技术总监刘琛:
由GMGC主办的第六届全球游戏大会(简称GMGC北京2017)今日在北京国家会议中心正式拉开帷幕。从3月15日起至3月17日,为期三天的这场全球游戏顶级盛会将带您连接未来。本届大会以“Connecting·Future|连接未来”为主题,内容涵盖游戏、未来科技、直播、电竞、IP联动、VR等多个领域,GMGC还将携手资本方共同打造“文化创意”与“科技创新”的国际双创峰会。来自全球多个国家和地区的重磅嘉宾及行业大佬们将带来精彩的主题演讲和对话环节,共同探讨初心、精品游戏制作、流量变现、游戏出海、海外市场、页游端游、数字产业等众多热门焦点话题。
盖娅互娱研发技术总监刘琛以MMORPG手游研发技术要点为题进行了精彩演讲,以下为现场实录
刘琛大家上午好!我是来自盖娅互娱的研发总监刘琛,现在的团队大部分来自于之前的各大游戏研发公司,团队有深厚的MMORPG游戏研发经验。我今天与大家分享技术难点与要点。分三部分,跟大家探讨MMO手游的特点,客户端和服务器的技术要点,版本制作&测试要点。
大家提到MMO会想到大世界,这个世界让玩家在地图上有一种虚拟世界的代入感。地图的制作对地图的资源和交互的要求很高。MMORPG端游和手游发展很多年,系统复杂,有一种模式存在,大家可以想到背包、战斗和任务,甚至是副本还有各种PVE和PVP,资源种类很多。我们可以看到MMORPG的手游较大,这对资源的控制和资源的优化提出了很高的要求。MMORPG分为两个阵营、回和与计时,都是偏重数值和策略方面的要求。MMO有非常多的活动,都是即时在线PK的,或者说配合完成的。MMORPG社交属性较强,很多人称为大型多人在线的情景聊天。我们提出了很多的要求,有比较方便的聊天界面,也有语音聊天甚至是视频聊天的功能,在这方面提出了很多的要求。
MMORPG手游客户端的特性、引擎选择,我们使用的版本是5.3.6。Unity的引擎在研发的过程中版本更新很快,但每一个版本都会有新的功能和新的特性会解决一些漏洞,也会引入一些新的漏洞,对漏洞没有办法修改只能绕过去,所以使用一个自己觉得稳定可靠的版本保证的上线。因为系统很多,资源量大,后面会讲资源怎样优化。手机性能限制,资源量大加载到手机内存中所占的内存很大,但手机的内存和CPU以及电量也好,其实都是有非常严格的限制,我们不能在这上面去太放肆,限制对我们的表现力提出了较好的要求。热更新,因为MMORPG的系统很多,更新频繁,会有很多漏洞,这需要我们在线上不能换包要及时的解决。热更新包括资源和代码。社交性强,我们会有第三方的插件帮我们完成不太擅长的流域。仙剑在上线的时候可以比较好的引导玩家进行游戏。
客户端的架构,底层是资源及脚本更新,有比较复杂的资源加载管理模块,服务器进行通信可发送歇息,视频和语音以及账号等第三方SDK。上层的Unity提供了非常强大的功能,包括场景模块和对话模块,还有非常强大的UI框架和UGUI。我们更新了自己的场景和角色模块,包括复杂的战斗。作为客户端开发来讲,大部分的逻辑开发功能都是在UI上,后续的更新也是,基本上都是UI更新,所以UI框架的设计目标就是只需要更新UI代码和Lua的资源。
Unity资源管理。Unity提供非常方便的资源管理机制,包括资源加载和卸载都有一整套的API。但Unity的资源管理和加载卸载有致命缺点,它的资源卸载虽然方便,但并不智能,也不精细,它的资源卸载是需要把所有的资源都检查一遍,然后确定不用了以后才会去释放,但这个检查是非常耗时的。一个地图的游戏会经常加载和卸载各种各样的资源,所以如果我说调用这种函数会造成非常卡的感觉,这是我们需要避免的地方。我们在资源管理方面是自己做的,生成assetbundle时,把资源的依赖建立好存在文件里,加载的过程中会加载引用计数,可以很快的加载和卸载资源,保障内存的控制。可能大家会想为什么Unity不好,因为Unity的资源是可以循环引用的。大家知道循环引用是引用技术里最不能避免的一种问题,但其实我们在游戏开发中很少会循环这种资源。Unity性能。UI要注意层级和模块的划分合理,很多的常用UI在隐藏时不要隐藏或者禁用,我们要移出摄像机的镜头,这样回来时不会有这种激活问题。关注Overdra,我们之前有策划做UI用全透的底图,但虽然是看不见的但也会有损耗。场景方面,根据小场景和大场景,这是静态加载,静态Batch还是动态分块加载,这种性能表现的比较好。在地图上我们用LOD的办法,让大家在可以看到的范围内尽量减少渲染。角色方面控制面数和贴图的质量,大家想要一种玩的感觉还是想要看到很多玩家在一起呢,所以要控制角色控制面数。Unity的动画文件很大。贴图压缩,在大家做手游的过程中,一定要使用跟平台相关的压缩原理,PVR很方便,但质量很低,所以在UI不能用,安卓可以用ETCD,因为现在安卓平台的支持广泛的就是ETC1,但它的问题在于没有贴图,但我们我们还要修改。制作的过程中大家尽量保持一致,但在打包的过程中,大家需要做好打包的脚本根据不同的平台压缩不同的纹理,生成不同平台的包。对象池和资源池,不是所有的资源不使用就要立即释放,还有关于频率和资源特性的策略,这样不至于平台的加载卸载消耗自己的网络。在合适的地方主动触发GC和Unity的资源清理。清理LOG输出和字符的串拼凑,有时候会造成CPU损耗。两个工具,Unity Profiler、Frame Debugger,要检查自己的性能到底损耗在哪里。UWA公司的文章非常干。
热更新是手游领域必须具备的功能,我们要注意文件分布的合理性,单包不能太大,如果太大的时候加载会耗时。策划配置是Lua,大部分的客户端逻辑,场景和战斗都是UI功能,所以Lua是热更新的重点。我们需要有版本控制机制去更新,使用版本控制文件,我们所有的资源和Lua根据版本打成差异包,客户端根据版本控制下载差异包。注意CDN缓存问题,很多重名的文件大家不要放在CDN上。域名劫持。
Lua,现在很多的框架都在用,但uLua是使用频率最高的,一部分是Lua的虚拟家,还有就是C#与Lua的应用。在一些非关键点,我们可以先GC,在卡的时间比较长的时候,我们可以再完整GC。Lua使用有非常严重的问题是内存泄露,主要的原因是Unity的Mono和Lua的虚拟家之间互相看不到,所以两个虚拟机之间的对象相互引用的时候,没有办法回收释放。一定要明确哪一些东西用,哪一些东西不用的。Lua性能,内存占用,削减文件大小。Lua的执行效率没有问题,但它在Lua和C#相互调用的时候效率很低,我们在开发的过程中把一些频繁调用的模块放在C#上,减少Lua与C#的相互调用。热更新是所有手游都要具备的,热更新里面最重要的就是使用Lua来连接。
MMORPG手游服务器的特点。在线实时交互,数据变动频繁响应要求高,大部分的逻辑在服务器完成,防止作弊。因为你做的事情别人也要看到,这样才会有世界的感觉,服务器的逻辑非常复杂,对服务器逻辑的编写要求高。手游领域要注意网络的稳定性,网络切换也会引起断线,所以断线的体验要做到无缝和舒适,要有离线的网络机制,这样离线了整个队伍可以继续玩,这是比较好的。代码和配置支持热加载,因为MMO系统很多,上线的测试比较短可能会遗留一些漏洞,如果在现场爆发出来对游戏的口碑造成很大的伤害,所以我们要支持在线解决一些漏洞的问题。开服一段时间以后,要有跨服和合服的机制。
各大游戏厂商服务器框架基本类似,大部分都会有网端服务器,这是服务客户端进行通信的。游戏服务器负责网络协议模块和数据库模块,绿色的部分是游戏里面比较重要的工作,逻辑部分,包括场景,战斗、属性、物品等各种各样的东西。会有公共的服务器来负责账号和登录,以及充值唯一名服务器用来保证名字。其它的部分主要看各团队熟悉什么,有自己编写的,也有引进的。
网络层有PCP、UDP、WebSocket、Http。协议层的主要功能是定义文件,客户端的服务器生成协议代码,发送接受协议,序列化和反序列化。网络层和协议层比较好的开源。数据库,多线程,利用CPU多核能力。支持事务,发生未知错误时保持数据完整。单服的读写功能是我们最关注的,支持合服和跨服。
打包和测试是MMO游戏研发到上线的一个环节,这个环节的效率和时间消耗可以保证游戏是否能够正常上线,或者说上线之前是否要通宵熬夜。不管是代码还是资源配置都需要SVN管理的,这分为开发版本和线上版本的分支。平时会在开发版本提交,但提交时需要有任务单号和漏洞,我们在任务和漏洞测试通过以后会把它挑出来合并到线上分支,这是半自动化的过程非常方便。合并完分支后可以自动化制作游戏包,相信大家会使用Jenkins的工具,看使用Unity还是自己的框架来写这些工具。如果使用Unity为了减少打包过程中的时间,建议对资源差异处理精细,不要重新导入打包。测试非常辛苦,研究研究自动化测试工具,基于操作的测试工具,基于Unity的测试工具,基于Lua脚本的测试工具,Lua是非常方便的脚本语言,目标是让测试人员很方便地写出自动化测试,减少测试中的工作量。机型适配测试,刚开始做手游会买很多设备自己做适配,但现在一方面引擎的通用化,受益于很多云测试平台可以方便准确地测试出游戏在安卓平台上的适配率。
仙剑的项目我们一直在摸索和学习,希望与大家一起探讨完善,能够给玩家提供更好的体验,谢谢大家。
关于GMGC
GMGC成立于2012年9月,是全球第三方移动游戏行业组织,目前在全球拥有30多个国家或地区近300名会员企业,成员中包含开发商、发行商、服务商、投资商等。GMGC秉持“共建共享,合作共赢”的理念,为产业上下游企业搭建合作、交流、学习的平台,促进产业共同发展。由GMGC主办的全球游戏大会(GMGC北京)、全球游戏开