【VR项目开发系列】使用UE4开发VR项目_性能优化(三)_思路和方法
发表于2016-11-06
本文是《使用UE4开发VR项目-性能优化》的第三篇。希望能和您分享一下在UE4 VR项目优化的基本思路方法和技巧。
前篇请参考这里:
(四)GPU渲染线程分析
如果遇到GPU瓶颈最快的验证方法是改变分辨率 降低分辨率可以极大提高帧数
如果帧数有大幅度提高 即是GPU瓶颈。如果影响不大,可能是面数太多。
一般GPU渲染线程问题大多数可能性是像素着色器(Pixel Shader)
ProfileGPU 命令可快速确定多个通道的 GPU 消耗
快捷键:Ctrl+Shift+,
r.ProfileGPU.ShowUI 对 UI 进行抑制
建议不要在编辑器里运行,开关编辑器也是有渲染开销的。渲染数据会产生误差。最好建立单独游戏(Standalone)运行环境
几个值得注意的数据项:
Base Pass
Deferred Decals
Lighting
SSR(环境反射)
Translucency(半透明)
Postprocessing(后期处理效果)
Particle(粒子)
**当Base Pass很高,可以使用命令行打开Early Z Pass 可以降低 Base Pass 但同时会少量增加DRAW CALL**
检查影响GPU效率的内容查看有无超标现象
比如分辨率、HMD SP、投影贴图大小
ViewMode检查
当三角面密度太高(高到三角面小于2*2像素 往往发生在远处物体上) 很容易出现问题。
分别查看三角面、顶点、灯光数量、阴影设置、Actor数量
LOD 关闭Shadew 、灯光屏幕面积
顶点太多
点动画的Shader处理过于复杂
Tessellation 过于复杂
多重UV、过多的SG
查看Staticmesh Editor里点和面数的差别是否大
点没有合并、场景GPU粒子模拟数量过多
材质复杂度
Quality、Switch、Sin、 Pow、 Cos、Divide、Noise 这些节点很耗费资源
减少材质Shader的指令的数量。减少Texture Sample的数量:把经常使用到同一个物体上的图案合在一张贴图上;去掉对质量影响很小的贴图,比如Specular、AO等。尽量使用QualitySwitch,Sin, Pow, Cos, Divide, Noise节点。多向量的计算量总是大于单向量的计算量。
遮挡的culling计算
使用预算可见性剔除遮挡的对象。
延迟灯光
当使用lightingfunction、IE、接受投影、区域光、复杂shadingmodes的时候会变得更昂贵。反射SSR如果有问题,请关掉它。另外后期AO也很耗费资源。
(五)CPU逻辑线程分析
引起Draw Call 数量增多的原因
1、同屏Actor过多、材质复杂性过于复杂。 (合并Actor、降低材质复杂度)
2、材质ID太多、重用材质贴图(把同一材质合并成一个物体)
3、每个Actor上的Feature 太多(主要增加投影属性 增加Custom depth属性)
4、过多灯光投影(检查投影计算来自哪些物体被投影)
Mesh Draw call 可以检查静态模型统计器来解决问题
Actor 设置 Feature 会增加DrawCall数量的是 custom depth
通过检查工具来设置Showflag 使用Property matrix 来过滤
使用排除法,隐藏各种元素 查找Draw Call 数量过多的因素
隐藏HUD (HUD占用很多性能,Showflag.slate 1)
还可以使用移动设备上的CMS增强阴影(4.12)
Rerdring>Mobile>Combined>StaticandCSM shadrring
接收物体选项:ReceicvCombined Static CSM shadows from stationary lights
UE4里由于使用了延迟灯光,所以灯光的优化比前向渲染方便的多。最快速最有效的方法:使用静态光源。如果使用的是动态光源,要减小Lighting Cull、半径、衰减、 Cone大小角度等等。总之尽量减少重叠。
投影的开销最大不是来自于PixelShader,而是来自于被投影的Mesh面数太多,还会被灯光数量,投影物体数量放大。关闭投影的灯光;减小范围或张角;减面,加LOD
可以使用r.Shadow.MaxResolution 命令用来查看阴影分辨率数据。
Stat Game
Stat Scenerendering
命令可以显示
DrawCall数量 (计算公式:Mesh数量 * Mesh ID * 投影灯光数量)
Particle粒子
复杂的UI
Decal 贴花
静态Mesh
动态Mesh
查看影响最大的部分 ,再次使用Show Flag 开关渲染特性来查看这些特性对DRAW CALL和帧数的影响
DrawCall优化:
打开Statistics统计面板,按使用次数排序Actor。查找使用次数最多的MESH 的ID ,如果ID是负数,那么就可以做优化。
例:如果有60个MESH 资源 其中有一半使用同一资源,那么就需要考虑需要用Merge Actors(融合Actor)来降低ID数量。优先减少使用频率最高的Mesh ID。这个操作可以减少这60个MESH中50%以上的DrawCall.(优化模这步骤建议放在最后才去考虑)
Staionary灯光和动态灯光要尽量的少,并且能不投影的尽量不要投影。并且减少光源间Overlaid(覆盖)
控制台:r.VisualizeOccludedPrimitives 1
命令主要用来判断场景中哪些遮挡掉的物体是被渲染的。
绿色的框就是没有绘制的对象.,如果有Actor在遮挡后面但是并没有被绿色的框画出来,这时候引擎认为这个Actor是可见的,造成消耗。这种情况一般是边界(Bounds)设置太大,一些非Root Motion的动画要注意。当Actor从A点移动到B点,边界会自动变大。就可能出现Actor 在遮挡物体后,但引擎仍然认为Actor是可见的并将它绘制出来。
粒子优化:
StatParticle
把占屏幕面积较大的,靠视点较近的,半透明较多的,材质复杂的,边界盒较大的,粒子数量多的进行集中优化。离视点较远的,可以使用LOD减少粒子绘制。当GPU进行立体渲染(Stereo Rendering)的时候,当视点越近,视差看到位移的位置就越远。离视点近的粒子很容易出错。引擎里的粒子大多数都是面向摄像机的一个片。当引擎进行立体渲染的时候,粒子片总是朝向左边摄像机。这时候右眼摄像机就出现了视差错误。离视点越近的粒子,立体化渲染时错误越明显。为了避免这种错误,可以把粒子做成实体模型。
后期优化:
下面是一组后期优化组合:
Post processingsetting
Scene color
Fringe intensity 0
Grain intensity 0
Color gradingintersity 0
Bloom setting
LPV 0
Ambient occlusion 0
DOF Method Gaussian0
Motion blur all 0
AA FXAA
SSR 0 Max roughness0.01
Ambient cubemap 0
Profiler
最后可以使用Profiler将数据捕获到磁盘上进行分析。
(六)可能遇到的问题和优化方法
最常见问题的原因包括:
测试环境不合适,比如灯光没构建。
双目渲染Actor太多,多材质ID
模型面数太多并且没有使用LOD,没有合理使用剔除
灯光类型使用没有规划,大面积动态投射阴影
大面积使用透明
HMD(头显)刷新频率
使用的灯光类型
构建 VR 项目时使用静态光照 和 光照图。如需使用动态光照,应尽量减少动态灯光的数量。如场景为室外,须将定向光照设为动态而非静态,然后开启级联阴影贴图(CSM)并尽量进行简单设置,即可生成阴影。
VR & VFX
在 VR 项目中多数情况下,需要使用静态网格体替代 2D 粒子模拟 VFX(如爆炸或烟雾拖尾)。近场特效或离摄像机非常近的特效在 VR 项目中效果上佳,但特效须由静态网格体粒子组成。
VR 和透明度
在 3D 图形渲染中,透明度的开销非常之大,因为每帧都需对其进行整体再次求值,以确保未发生变化。正因为再次求值的存在,VR 项目中透明度的渲染开销极大,大于其带来的效果增益。然而,使用 DitherTemporalAA 材质函数可解决解决这一难点。此材质函数将使材质拥有外观上的透明度,并避免常见透明度问题(如自我排序)。
多边形减面
在 VR 游戏中,玩家观察的自由度更高,执行减面操作可能导致玩家看到不应该看到的物体,因此不能进行此操作。
阴影投影
去掉大部分动态着色器(DynamicShader),
用BP控制角色脚步离地面远近来缩放脚下阴影片面大小。
Reflection Capture 减少 尽量不要重叠
关掉场景SSR 用材质模拟SSR效果
打开SM联级动态阴影
创造性作假:
三角面:
远处mattinpaiting
投影面片,渲染在贴图上
使用PrecomputedVisibilityVolume(预遮挡计算)
遮挡较多的地方可以大幅度提高渲染效率
使用CullDistanceVolume(裁剪体积)
根据Mesh在屏幕上所占像素尺寸裁剪模型
内存分配
CUP RENDER瓶颈
stat scenerendering
材质ID太多
重用材质贴图,尽量把同一材质物体合成为一个物体
actor太多,如果材质复杂这个因素还会加成
合物体,尤其是中远处
每个actor上的feature太多,比如增加投影的属性,增加custom depth的属性
太多灯光投影(这里投影的消费来自于需要计算哪些物体需要被投影)
除了以上的优化手段,有更多规范需要在制做之前进行测试并制定规范。
比如目标硬件是什么?美术在制做原型的时候就去设置一些美术标准,根据标准来做,后期再做比较统一的优化,这样效率可能会比较高一点。在做了基本的性能优化和分析后,接下来更进一步的就要进行美术迭代资源了做LOD,做剔除,调整渲染参数,优化材质指令。等等VR既需要表现好的的效果,又要更高的流畅度,同时VR本身的开销又很高,所以对优化的要求就更大。本文粗略的整理了开VR项目中对于VR性能优化的一些思路流程和技巧。希望本文的分享能对您VR项目的优化有一点点的帮助。(后一篇文章将把文中流程整理成简表供大家参考)