VR游戏猎影计划性能优化经验

发表于2017-03-06
评论11 4.3k浏览

VR游戏双屏渲染对硬件和游戏性能有比较高的要求,使用UE4开发VR游戏时需要在游戏画面质量和运行效率之间做权衡,VR游戏在现如今VR设备(Oculus或HTC)上要能够流畅的体验游戏帧率需要达到90帧,因此最大限度开发引擎性能提高游戏品质是制作一款VR游戏必不可少的工作。
猎影计划VR项目开发耗时1年多,中间也在陆陆续续熟悉UE4这款引擎的的各种特性踩各种坑。由于开发前期没有对性能这块进行太多关注导致后期游戏显得比较臃肿,需要花很多时间和精力来优化猎影计划的游戏性能,现在主要对猎影计划的性能优化方面做个比较全面的总结。
UE4自带了很多性能检测工具,包括CPU和GPU的Profile工具和显示游戏实时渲染数据的各种命令行工具,最常用的两个命令如下:
“stat unit”命令能够显示当前帧的总时间,游戏线程时间,DrawCall时间和GPU时间。

“stat fps”能够显示当前游戏帧率。

CPU优化

VR游戏主要性能瓶颈还是在GPU方面,CPU方面也需要进行关注,保证游戏Game线程每帧耗时在11毫秒以下。
普通游戏的CPU消耗主要集中在物体组件的Tick逻辑,物理,骨骼动画更新,动画蓝图逻辑,对象生成和销毁,资源IO,音频播放等方面。UE4的Session Frontend工具能够分析游戏一段时间内的CPU数据。
游戏运行过程中命令行输入“stat startfile”开始捕获游戏运行数据,一段时间后输入“stat stopfile”结束捕获,先关捕获的数据存在游戏工程中SavedProfilingUnrealStats目录下,启动Session Frontend工具加载这个文件,查看GameThread树的内容就能查看这段时间CPU的消耗分布。示例如下:

项目优化过程中经过分析发现CPU最耗时的部分在人物角色SkeletalMesh的检测是否与其他物体重叠的事件(Update Overlap Event)。当SkeletalMesh开启Generate Overlap Event选项时引擎会进行重叠检测。

人物角色越多约耗时,因此开启该选项需要谨慎,就算必须要开启时也要进行动态开启关闭,保证最低性能消耗。
另外骨骼动画模型的碰撞盒子数量也会对游戏性能有非常显著的影响,盒子越多游戏更新检测每个角色碰撞重叠物理等等所耗的时间越长,因此需要严格限制碰撞盒大小和数量。

其次CPU耗时主要在角色骨骼更新和动画蓝图刷新逻辑中,此消耗也与角色数量成正比,角色数量越多耗时越长,因此需要控制游戏中同时存在的角色数量,骨骼数量和动画蓝图复杂度,并且当角色不可见时关闭骨骼刷新,如下所示:

动画蓝图的复杂度还可以根据当前角色模型的LOD进行进一步优化,在动画蓝图的动画融合图表中可以设置动画节点的LOD阈值,用于控制在动画模型在不同层级的LOD状态时动画节点是否刷新/计算,因此可以在低LOD层级时降低动画蓝图复杂度从而提高CPU性能。

越复杂的模型开启物理后越耗时,因此需要对模型的碰撞进行设置,而且不同类型的物体所需要的碰撞通道也不同,比如触发器类型的物体就不需要开启碰撞通道只需要对特定类型的物体开启重叠通道就可以了。因此在开发过程中需要严格设置不同物体的碰撞通道值,最大限度优化游戏CPU性能。

在物体TICK方面也可以进行相应的优化,效率最高的当然是尽量降低TICK逻辑的复杂度,保证每帧刷新逻辑耗时最小。其次,对刷新率不需要特别高的物体可以在Actor蓝图中降低TICK调用的频率。

GPU优化——UE4性能相关工具

UE4自带一系列工具用于对游戏渲染性能进行分析,最直观的就是一系列stat命令,最常用的除了stat fps和stat unit外还有以下一些命令可以实时查看游戏运行性能。

除此之外,UE4还提供一些实时控制游戏渲染物体的命令,让用户灵活查看各种物体的渲染效果。
ShowFlag命令可以控制某些物体是否渲染从而简化场景渲染,例如ShowFlag.StaticMesh 0就可以影藏场景中所有StaticMesh,从而达到查看其他物件渲染信息的目的。

r.命令能够灵活控制某些效果是否打开关闭,达到在游戏运行过程中实时控制画面渲染质量的目的。例如r.PostProcessAAQuality (0,1,2,3,4,5,6)可以控制后处理抗锯齿质量(关,很低,低,中,高,很高,最大)。

与其他游戏引擎一样UE4提供了GPU Profile工具,游戏运行时在命令行输入“StatGPU”命令就能打开GPU Profile面板查看当前帧的GPU渲染耗时信息。

GPU优化经验相关

在整个优化过程中总结出了一系列经验,这里分别进行罗列总结。

 ● 灯光和阴影
灯光和阴影应该是游戏中除了场景本身复杂度外耗时最高的部分了,严格控制场景中Dynamic和Stationry是非常重要的。
一个好的游戏关卡灯光设计应该是尽量少的添加Stationary灯光,除非迫不得已否则不添加Dynamic灯光,严格控制灯光是否产生阴影,绝对杜绝不必要的动态阴影。
UE4在4.14中支持了ForwardShading渲染管线,对灯光要求不高数量少的游戏中建议采用这种渲染模式能够进一步提升游戏渲染性能。
VR游戏中开启阴影可能会导致DrawCall数量成指数型增长,因此猎影计划中对低配机器我们采用的方案是合理控制Static灯光数量,关卡中不允许存在Dynamic灯光,尽量少的添加Stationary灯光,除了天光和Static灯光其他所有灯光都不勾选CastShadow选项,渲染设置中也关闭动态阴影,最大程度减少灯光和阴影性能消耗。

此外合理控制灯光覆盖范围大小也很重要,如果项目采用了Deffered Shading(UE4引擎默认采用模式),还可以通过查看Stationary灯光互相之间叠加复杂度来查看灯光范围设置是否合理。

一个好的灯光范围设置安排应该是蓝色和绿色居多,红色表示灯光叠加过于复杂需要改善。

● 场景复杂度
作为决定游戏优化难易程度的关键因素,场景复杂度是GPU优化过程中需要持续进行优化和改善的模块。一个由美术同学搭建好的场景,其设计安排的合理性直接决定后期优化的难易程度。
关卡场景的复杂程度由以下几个因素决定:
静态和骨骼模型的数量及复杂程度;
模型材质的复杂程度;
耗时高物体占据视野的范围;
物体相互间的遮挡关系。
猎影计划在以上各个方面几乎都踩过坑,因此专门针对以上几个方面进行了相关的优化。
首先对场景中静态和骨骼物体的数量进行控制,添加设计标准:同屏物体三角形面数不超过100万面,在低配机器中去掉装饰性的物件比如草,树等等。然后严格控制模型的复杂度,较复杂的模型都加上合理的LOD设置。

保证VR模式中DrawCall数量低于2000。
为了进一步优化性能,对于很多同类型小物件Actor进行了Actor合并,从而进一步减少DrawCall数量。
其次对复杂材质进行修改简化,在保证效果的前提下最大限度优化精简材质复杂度,控制复杂材质的使用数量和范围。下图的材质就是不合理的,计算节点和叠加材质太多需要简化。

● 性能采集工具
采用Intel的GPA这款性能采集工具对游戏进行中的某一帧进行性能分析,查看DrawCall数量和具体耗时细节,针对性的对耗时高的DrawCall对应的渲染物件进行优化。


如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引