4月11日,由unity公司举办的Unite
2016大会在上海正式举行,在4月12日的案例分享专场会议上,天神互动U3D高级开发工程师康凯以手游《苍穹变》为例讲述了3DMMOARPG游戏开发过程中的优化思路和方法。
以下是演讲实录:
康凯:大家上午好,天神互动是一家2009年成立的公司,公司主要是开发MMO项目,产品有微端版的《苍穹变》在腾讯游戏大厅上线,我这次分享的是我们开发的手游版《苍穹变》的一些经验。
我自己是天神互动unity3d高级开发工程师,在天神有机会参与PC版和手游版苍穹变的设计、开发和优化方面的工作。苍穹变手游iOS最低配置是iPhone4S,我从三个方面和大家分享开发苍穹变手游版的经验,主要按照项目时间顺序。前期我们会准备基础知识,因为苍穹变手游是我们开发的第一款MMOARPG手游,接下来跟大家说一下开发过程中的关键点,最后是性能优化。
前期基础准备工作对于整个后期的结果至关重要,所以我们做了一些知识方面的准备,包括CPU、GPU硬件支持我们自己科普了一下,包括驱动程序、图形API,当时针对的平台是iPhone,Unity深入的了解了一下,移动平台上MMOARPG有一个很关键的矛盾,需要解决ARPG庞大复杂的功能需求和对性能的要求,游戏首先不能崩溃、不能卡顿还不能发烫,在移动平台有限的硬件资源条件下做开发、比我们开发PC版的MMO复杂很多,我们面临很多的挑战。
这是我们的一些前期知识准备得到的结论,结论是一般3D游戏瓶颈主要在渲染方面,渲染问题包括三个方面,CPU、GPU和内存,由于手机上采用的是内存、显存共享的方式,因此不存在传统PC上数据从内存到显存传输的瓶颈,在移动平台上我们更加关注CPU和GPU。
CPU众所周知最大的瓶颈是Drawcall,而它的本质是GPU不具备融错内容,所以要求CPU的合法性,这样导致一个比较严重的问题,在于我们的CPU向GPU提交数据。
开发过程中的关键点,首先团队准备,我们先要确定目标机型,如果没有目标这个事情无法衡量性能优化的指标是否达标,性能指标主要是Drawcall和内存如何在场景、角色、特效和UI之间进行分配,有句比较受用的话,说优化做的好、不如前期设计规划的好,像这种大型项目,前期如果没有一个良好的规划,后续各个工种之间沟通上成本会非常高。
接下来我们讲团队成员对硬件达成共识,就是花一些时间对美术非技术人员,和策划人员进行一些图形学方面的培训,这在一个大型项目中是非常值得的,告诉他们哪些东西消耗多少,我们需要怎么应对,有时候他们会想出更好的解决方案。
美术规范文档,它的重要性在于如果是大型项目,像我们的MMOARPG一般团队四五十人的规模,美术人员占比很高,如果前期没有科学合理的规范,美术同学到项目后期会涉及到项目的大量返工,我们找了同行测试、调研,调研了八家公司。工作流同理,我们参与人员众多,我们需要规划清晰的工作流,确保每个部门的输入输出尽量减少耦合工作。工具准备,我们会前期准备好一些工具确保我们工作流的顺畅。
接下来客户端框架设计,我本人是客户端开发工程师,所以只能给大家讲讲客户端的框架设计,至关重要的三个方面,第一方面是资源加载模块,包括依赖式打包,资源CDN放缓存,从服务器到硬盘,硬盘到内存如何妥善释放掉。资源加载模块是我们要解决的一号问题,因为这块出问题整个游戏进不去的,整个开发过程中必须保证这一条通道的畅通,我们的做法是放最优秀的技术人员解决这方面的问题。
然后GamePlay框架,简单说是角色的移动战斗和换装这块,我们采用纵横模式,纵横框架纵向采用分层,举个例子,角色管理器,角色管理状态机这种纵向结构,每个底层不会有上层的引用。
接下来是UI框架,UI框架是我们放在第三个但重要性并不是第三,苍穹变手游版客户端代码有20万行,80%以上是UI的逻辑,UI对整个项目的高速开发非常重要,我们需要设计一套,并且UI程序员工作占比也比较高,一个开发团队七八个客户端大概有5到6人做UI逻辑这部分,部分需要高速并行的开发,策划的需求变动比较剧烈,因此我们需要良好的UI框架让各个模块之间能够并行、以比较良好的速度运转。
然后谈一下关于性能优化方面的经验,但是请大家注意这次分享的是苍穹变手游版的优化经验,而苍穹变手游我们定位的是iPhone4S这个机能的设备,有些东西不一定是非常适用于现在的iPhone5S之类,我们了解清楚基础原理,再有目的的针对特定的机型做特定的优化。
关于TA(技术美术),大型团队里面我们经验是开发手游版的MMOARPG必须配备TA,要货真价实的TA,因为3DMMO游戏是一种密集型的应用,最大量的硬件资源消耗在于图形渲染,就是我们内存也好、CPU也好、GPU也好这方面需要有一个合格的TA帮我们解决美术资源到程序中的一系列问题,包括美术规范的制定和后期的优化方案的提出。
性能优化的基本原则是我们前提有一个技术美术,第一步是找到瓶颈,如前所说,凭借要么是CPU要么是GPU,而这两方面的优化方案截然不同,如果问题出在CPU、优化GPU会得到相反的结果,找到瓶颈需要一些工具,推荐的是Adreno Profiler,,另外一个是Unity自己的工具,这个像红框里面看到的,可以看到一些信息是被CPU卡住还是被GPU卡住。
接下来讲纹理贴图,第一步要解决纹理贴图的问题,因为贴图在ARPG游戏里面内存占比最高的,性能消耗也是最高的,纹理压缩大家可以看一下公式,如果256x256贴图不采用是256K,采用压缩是32K,如果游戏有上百兆纹理题图、那么压缩后可能之为原来的5%,游戏包体能有更小,并且纹理贴图的尺寸如果采用纹理压缩,纹理贴图的数据更容易被二级缓存缓存,也可以大幅提高性能,其实纹理压缩并不是很复杂。
然后采用适合的尺寸,一个物件占屏幕100×100没有必要采用256x256贴图的,但是实际项目中参与美术人员众多,场景规模非常大,纹理贴图数量多,这一点是非常容易被忽视的,造成我们宝贵的内存和GPU、浮点运算的浪费。
接下来Alpha通道分离,这个问题我们到后期优化后解决不了这个问题,我们请了一个外国人,国外*的图形学专家,他给我们说了一系列的优化方案,其中有一条叫做Alpha通道分离,是说Alpha通道的贴图,建议拆成两张一张不带Alpha通道,一种是带的,这个好处是纹理压缩格式不带Alpha通道,我们拆出来以后能够兼容广大的安卓设备,另外一条好处单独拆分的Alpha通道可以缩减尺寸,因为Alpha通道图大部分是不透明或者透明,基本是01,我们可以缩减尺寸可以对它进行更高强度的纹理压缩。
然后我们说Shader优化的重要性,在于可变成渲染管道里面想接入GPU浮点运算次数,能做的是在于Shader,Shader这方面大家想象一下,我们假设象素着色器每一个象素额外多一部分乘法运算,iPhone 960×640的象素每帧要多6万次的符点运算,如果Shader写了多一步浪费乘法运算,每秒会多出3000万次的浮点运算。减少象素着色器的运算量,我们建议优先采用低精度的数据类型,这些在某些GPU上能够以更短的时间周期执行完毕,再说精确点这些在苹果的GPU使用低精度浮点运算是这样,安卓的设备上不一定。
场景,场景是游戏里面内存和GPU和CPU消耗大户,怎么解决这个问题呢?一些比较有用的经验是场景的Mesh烘焙后删除多余的信息,当数量变成十万级的时候是非常可观的,我们的经验是删除之后在某些场景内存能够节约3到5兆,iPhone4S上是不错的,能把节约出来的这部分内存用来把场景做的更漂亮。另外地形用的是T4M,这是美术同学们自己总结,用T4M导出obj在3dmax里二次压缩有更好的效果。接下来是植物,用Mesh雕刻边缘,这些被切除的边缘不会浪费掉宝贵的浮点运算次数。接下来手动区域合并,Unity自己自带合并,有动态合并和静态合并,这两点我们项目没有使用,静态合批导致内存增大,我们采用的是手动区域合并,把临近的物件进行网格的合并。
接下来角色,我们并没有把角色做到次世代这么高的精度,角色的骨骼、动画有些设备在CPU进行运算的,而CPU从4S到5S硬件跑分从2000分到1.5万分性能翻7倍,但是CPU只是从两个双核1G到1.3G,因此角色技术是一个严峻的挑战,在没有有效技术解决同屏角色问题以前,我们对于角色的顶点数和骨骼数依然谨慎对待。然后动画,动画这块耗CPU也耗内存,一个主角攻击动作400K,所以降低动画精度,缩短动画时间,动画按需加载,一个是SkinMeshRenderer。
接着特效,场景、角色和特效是性能三大杀手,特效对性能杀的是GPU,我们如果一个屏幕上叠加了960×640半透区域,那就是三千万次乘以10,这个实际上我们游戏到现在依然没有一个比较好的解决方案,只能是把这些采用Mesh雕刻,多余的部分进行切除,现在能解决是减少半透区域在屏幕的面积,我们测试整个屏幕的半透明的化、性能上帧数要掉10帧,如果一样是420层的半透区域缩小到10×10象素可以跑满帧,所以半透区域对性能影响是很大的,消耗了我们的浮点运算能力,也耗了宝贵电量。均匀分配特效时间,包括技能特效起飞、飞行爆炸,这些时候需要尽量的均匀分配粒子出现的时间。
到最后跟大家分享两句比较受用的话,游戏一部分是基于科学的模拟,一部分是绘画,我们可以采用一些障眼法,由整个团队合作,由美术、技术和策划想出一些好办法能够大幅度节约运算量达到比较好的效果。另外一部分是越是尊重和理解硬件的限制我们游戏越能得到良好的表现,我的演讲完毕,谢谢大家。
(来源:GameLook)