腾讯光子工作室群 的《绝地求生:刺激战场》在今年2月9日全平台开测以来,备受全球玩家喜爱。这款万众瞩目的UE4手游是如何在保证原汁原味玩法的同时做好资源的优化,执行效率的提升,移动平台操作方式的优化的?并且在短短数月内将这款热门IP 制作成手游提供给国内玩家无疑对是一个巨大的挑战。
为此我们采访了 Epic Games 中国技术支持团队,让他们谈谈在《绝地求生:刺激战场》项目上做技术支持的一些经验分享。
1. 在国内,手游平台用户数量巨大,虚幻引擎在手游平台上有哪些值得推荐的优化?
不同的游戏类型和项目针对的目标用户定位有着不同的优化方案。在保证质量的同时还需要兼顾效率,需要团队在各方面做平衡,好在引擎提供了多种工具可以帮助开发者达到这样的目标。主要有三个方向。
- 资源把控:利用好引擎编辑器下的统计工具和ViewMode来做美术资源的规划和profiling,可以在项目开发中比较好的控制资源使用。
- 查找性能瓶颈:利用引擎的各种stat和showflag以及CPU profiler和对应硬件的gpu profiler等工具,可以进一步查找性能瓶颈和热点模块做更有针对性的优化。
- 兼容性把控:利用好Scalability和DeviceProfiler来做兼容性和性能的取舍。
2. PC 版的《绝地求生》对电脑的要求很高,在移动端制作100 人对战同样类型的游戏会遇到什么样的瓶颈,在虚幻引擎中是如何解决这些问题的?
PC 版和移动版有许多的区别,首先电脑版本的地图内容复杂度非常高,一般手游版本都会为了优化而把视距调的比较近,把变种比较多的房子,树木,植被以及各种装饰的种类减少,以便于合并批次,提高渲染线程效率。但是《绝地求生》手机版本为了更好的还原电脑版本的地图Scale和Layout,在这上面能做的妥协比较有限,所以在渲染线程,GPU以及内存上都面临着不小的挑战。
再者,更自然的动画动作需要的不单单是更高质量的动画资源,也需要比较复杂的动画混合逻辑来驱动,同屏幕多个这样的角色动画的混合计算也是不小的开销。另外场景中的大量需要模拟物理的载具对于物理计算也是不小的开销。
总体来说,这些因素加在一起,每一个小细节的提升和差异,都会对最终的优化带来额外的挑战。例如,如果没有那么丰富的变种的资源类型,那么可以把整个地形和场景资源都加在到内存中,只需要在渲染线程做culling就可以了,但是一旦数据量到达整体加在到内存中无法满足需求的时候,就必须使用无缝大地图的异步加载策略,无形中也提高了复杂度。
好在,虚幻引擎本身提供的无缝地图以及异步加载机制解决了很大的麻烦。引擎本身也提供了大量的分析工具,Epic Games 也和腾讯的研发团队紧密合作,针对项目特定的灯光环境组合,投影设置等做了不少引擎层的特定优化,更针对项目资源种类多,可视距离远的特点,做了一些特殊的功能。
3. 在3 至4个月时间内完成一款这样的游戏,Epic Games 提供了哪些技术支持?
Epic Games 技术支持团队针对开发团队在使用引擎时候遇到的各种问题提供了协助,帮助修复了不少bug,帮助解答了大量疑问,加速团队的开发,也和研发团队一起商量制定了多种优化策略。
这里列举一下我们做过的比较主要的优化功能模块,略去一些微小的改动:
- 光影贴图合一,在移动端将贴图采样次数从3次减少到1次。sdf在ETC2下放alpha后的压缩效果,在移动设备上损失并不大,相对来说,减少的采样次数以及减少的内存是相当大的优化,所以是个很好的tradeoff。
- 渲染的次序调整,大型物件(如天空、地表)渲染放到最后,提高GPU效率。
- 优化了Drawing Policy的排序方式,减少Draw Time。渲染线程的效率除了总体提交的绘制调用次数,DC之间的状态设置API调用也很大程度影响着渲染线程的CPU性能,这里更好的sorting方式很显著的改善了性能。
- 在移动端可以根据项目灵活定制,最优化PixelShader的开销:
- 某些情况下去掉Reflection Cubemap Sampler
- 某些情况下去掉Lightmap,仅使用Static Shadow
- 去掉ILC
- Android增加Texture Streaming支持,降低内存,提高GPU效率,针对不同档位的机器都能有比较好的针对RAM Budget的控制。
- FOV Distance Culling,可以根据开的倍镜调整后的FOV来计算物件的culling,开镜后很远处的草依然能正常绘制。
- 减少一些数据结构(如FStaticMeshSceneProxy)在Shipping版本中的大小,优化内存。由于游戏的地图大,物件数量繁密,种类又多,单个物件的内存layout的极致优化无疑能更好的减小内存占用。
- Dynamic Instancing, 用于大型世界中减少Draw Call。根据当前View动态合并同VertexType的资源,同时可以支持不同的材质实例在单个DC中完成,把材质的uniform拼合到了instance的vertex stream中。
- LOD模型尽量使用同样的Material(而不是在原有的Material上做一个简化的Material),有助于减少Shader Switch。
- 在ES3.0下,绘制Shadow Depth的时候去除了ES2强制需要的Color RT,省掉了客观的内存。
- 添加了安卓平台的剪贴板复制粘贴功能。
- 添加了移动平台的LLM进行更准确的资源分类的内存统计。
- 可以将远距离的Shader设置为极简模式,降低GPU开销。
- 尝试渲染线程和实际Graphic API分离到两个线程,可以并行执行。(RHIThread)"
4. 国内手机的不同的系统,硬件规格非常不统一,在提高适配性方面做了哪些工作?
针对不同机型遇到的不同问题,在引擎中做了一些work around,例如利用r.OpenGL.StripExtensions去掉某些设备支持不好的扩展等工作。更多问题可能涉及到和硬件厂商的保密协议不方便透露
5.对于其他想使用 UE4 做多人大地形环境手游的团队,Epic Games 技术支持团队有什么建议呢?
在项目前期做好充分的规划,并且充分利用好引擎提供的工具,例如虚幻引擎近期推出的两个大版本(4.18和4.19)中包含了对于手游和大地形的优化更新(包括服务器部分),做多人大地形游戏的团队可以特别关注一下。
开发团队的不懈努力和支持团队的精诚合作让这款作品能够顺利面世,Epic Games 技术支持团队的经验分享可以为其他想使用虚幻引擎制作多人大地形环境的手游团队以启发。