作者:王文斓
虚拟现实(VR)能够带给用户前所未有的沉浸体验,但同时由于双目渲染、低延迟、高分辨率、强制垂直同步(vsync)等特性使VR对CPU渲染线程和逻辑线程,以及GPU的计算压力较大[1]。如何能有效分析VR应用的性能瓶颈,优化CPU线程提高工作的并行化程度,从而降低GPU等待时间提升利用率将成为VR应用是否流畅、会否眩晕、沉浸感是否足够的关键。Unreal* Engine 4 (UE4) 作为目前VR开发者主要使用的两大游戏引擎之一,了解UE4的CPU线程结构和相关优化工具能够帮助我们开发出更优质基于UE4的VR应用。本文将集中介绍UE4的CPU性能分析和调试指令、线程结构、优化方法和工具、以及如何在UE4里发挥闲置CPU核心的计算资源来增强VR内容的表现,为不同配置的玩家提供相应的视听表现和内容,优化VR的沉浸感。
UE4 VR应用的CPU差异化
上面介绍了几种VR应用的CPU优化技巧,然而优化只能保证VR应用做到不掉帧不眩晕,没法进一步提升体验。如果要提升VR体验,必须尽可能最大程度利用上硬件提供的计算能力,把这些计算资源转化成内容、特效及画面表现提供给最终用户,而这就需要根据计算能力对CPU提供相应的差异化内容。下面介绍其中五种CPU的差异化技巧。
布料模拟
UE4的布料仿真主要通过物理引擎分到工作线程进行计算,对逻辑线程影响较小。而且布料模拟是每帧都需要计算的,即使布料不在画面显示范围内,也需要进行计算来决定更新后会否显示到画面中,因此计算量比较稳定,可以根据CPU能力适配对应的布料模拟方案[17]。
可破坏物件
可破坏对象在UE4里也是通过物理引擎分到工作线程进行破坏模拟计算的,因此对于计算能力较高的CPU这部分可以加强,比如更多对象可以被破坏、破坏时出现更多碎片或者碎片在场景中的存在时间更长等。可破坏对象的存在会大大加强场景的表现以及沉浸感,设置过程可以参考[18]。
CPU粒子
CPU粒子是另一项比较容易扩展的模块,虽然从粒子数目来说CPU粒子较GPU粒子少,但采用CPU粒子能降低GPU的负担,较好地利用多核CPU的计算能力,而且CPU粒子具备下列独有的功能:
- 可发光
- 可设置粒子材质及参数(金属、透明材质等)
- 可受特定引力控制运动轨迹(可以受点、线或者其他粒子的吸引)
- 能产生阴影
开发过程中可以对不同CPU设置相应的CPU粒子效果。
3D音频 – Steam* Audio
对于VR应用来说,除了画面外制造沉浸感的另一个重要元素就是音频,具有方向性的3D音频能够增强VR体验的临场感,Oculus*曾经推出Oculus* Audio SDK[19]来模拟3D音频,但该SDK对环境音效的仿真比较简单,相对并不普及。Steam* Audio[20]是Valve*新推出的一套3D音频SDK,支持Unity* 5.2以上的版本及UE 4.16以上的版本,同时提供C语言接口。Steam* Audio具备下面几项特点:
- 提供基于真实物理模拟的3D音频效果,支持头部相关传输函数(Head-Related Transfer Function,HRTF)的方向音频滤波以及环境音效(包括声音遮挡、基于真实环境的音频传递、反射及混音等),另外也支持接入VR头显的惯性数据
- 能够对场景中每个对象设置音效反射的材质及参数(散射系数、对不同频率的吸收率等),环境音效的仿真可以根据CPU的计算能力采用实时或烘焙的方式处理
- 环境音效中很多设置或参数都可以根据质量或性能要求做调整。例如HRTF的插值方法、音频光线跟踪的数目和反射次数、混音的形式等
- 相对于Oculus* Audio SDK只提供鞋盒式的环境音效仿真(shoebox model)而且不支持声音遮挡,Steam* Audio的3D音频模拟更真实而且完整,可以提供更精细的质量控制
- 免费且不绑定VR头显或平台
Steam* Audio从UE4的逻辑线程收集音源及收听者的状态和信息,通过工作线程进行声音的光线跟踪及环境反射模拟,将计算出来的脉冲响应(impulse response)传送到音频渲染线程对音源进行相应的滤波和混音工作,再由OS的音频线程输出到耳机(例如Windows*的XAudio2)。整个处理过程都是由CPU的工作线程进行,在加入3D音频的同时并不会增加渲染线程和逻辑线程负载,对原来游戏的性能并不会造成影响,可以说是非常适合VR的一项体验优化。详细的设置过程可以参考Steam* Audio的说明文檔[21]。
可扩展性
UE4的可扩展性设置是一套通过参数调节控制画面表现的工具,能适配不同计算能力平台[22]。对CPU来说,可扩展性主要体现在下面几项参数设置上:
- 可视距离(View Distance): 距离剔除缩放比例(r.ViewDistanceScale 0 – 1.0f)
- 阴影(Shadows): 阴影质量(sg.ShadowQuality 0 - 3)
- 植被(Foliage): 每次被渲染的植被数量(FoliageQuality 0 - 3)
- 骨骼网格体LOD偏差(r.SkeletalMeshLODBias): 全局控制骨骼网格体的LOD等级偏差
- 粒子LOD偏差(r.ParticleLODBias): 全局控制粒子LOD等级偏差
- 静态网格体LOD距离缩放(r.StaticMeshLODDistanceScale): 全局控制静态网格体的LOD等级偏差
图6 - 8分别显示了腾讯*<<猎影计划>>这款VR游戏对不同CPU的植被、粒子和阴影差异化效果。
图 6.《猎影计划》中的植被差异化效果。
图 7.《猎影计划》中的粒子差异化效果。
图 8.《猎影计划》中的阴影差异化效果。
结论
本文介绍了UE4的多种CPU性能分析工具、优化方法和差异化技巧,基于文章篇幅所限如果想进一步了解各项细节,可以参照参考部分。熟练掌握多种CPU性能分析工具和技巧可以快速找到瓶颈并进行相应的优化,而事实上这对于VR应用非常重要。除此以外,在优化的同时如果能够充份利用闲置的多线程资源,可以让应用实现更好的画面效果和表现,提供更优秀的VR体验。
参考
[1] https://software.intel.com/zh-cn/articles/performance-analysis-and-optimization-for-pc-based-vr-applications-from-the-cpu-s
[2] https://docs.unrealengine.com/latest/INT/Engine/Performance/StatCommands/index.html
[3] https://docs.unrealengine.com/udk/Three/ConsoleCommands.html
[4] http://graphics.stanford.edu/~mdfisher/GPUView.html
[5] http://www.gamasutra.com/blogs/LeszekGodlewski/20160721/272886/The_Vanishing_of_Milliseconds_Optimizing_the_UE4_renderer_for_Ethan_Carter_VR.php
[6] http://timhobsonue4.snappages.com/culling-precomputed-visibility-volumes
[7] https://docs.unrealengine.com/udk/Three/PrecomputedVisibility.html
[8] https://docs.unrealengine.com/latest/INT/Engine/Actors/Merging/
[9] https://docs.unrealengine.com/latest/INT/Engine/HLOD/index.html
[10] https://docs.unrealengine.com/latest/INT/BlueprintAPI/Components/InstancedStaticMesh/index.html
[11] https://developer.oculus.com/blog/hybrid-mono-rendering-in-ue4-and-unity/
[12] https://developer.oculus.com/documentation/unreal/latest/concepts/unreal-hybrid-monoscopic/
[13] https://docs.unrealengine.com/latest/INT/Engine/Blueprints/TechnicalGuide/NativizingBlueprints/
[14] https://wiki.unrealengine.com/Multi-Threading:_How_to_Create_Threads_in_UE4
[15] http://orfeasel.com/implementing-multithreading-in-ue4/
[16] https://docs.unrealengine.com/latest/INT/Engine/Animation/Skeleton/
[17] https://docs.unrealengine.com/latest/INT/Engine/Physics/Cloth/Overview/
[18] http://www.onlinedesignteacher.com/2015/03/how-to-create-destructible-mesh-in-ue4_5.html
[19] https://developer.oculus.com/documentation/audiosdk/latest/concepts/book-audiosdk/
[20] https://valvesoftware.github.io/steam-audio/
[21] https://valvesoftware.github.io/steam-audio/downloads.html
[22] https://docs.unrealengine.com/latest/INT/Engine/Performance/Scalability/ScalabilityReference/
作者介绍
王文斓是英特尔软件与服务事业群的资深软件工程师。他于2015年底开始负责英特尔中国在VR内容方面的技术合作,身处第一线帮助VR内容开发者针对英特尔CPU进行性能优化和差异化工作,优化PC VR内容在英特尔x86平台上的体验,并且在CGDC,GMTC,VRCORE,Tencent GDOC,Unity Unite和Vision AR/VR Summit等多个业内知名开发者大会上代表英特尔向开发者介绍CPU对VR的重要性,分享CPU优化经验以及如何更高效利用CPU加强VR游戏体验。王文斓在英特尔负责过多媒体视频编解码和实感应用的实现,分析和优化工作。他在视频编解码丶图像分析算法丶计算机图学和性能优化上有超过10年丰富的经验,并在业界发表过多篇论文。王文斓毕业于台湾大学电机工程学系和通信工程学研究所。