自从三大头显厂商Oculus,HTC和SONY在2016年发布了虚拟现实(VR)头显产品后,由于能够带来卓越的沉浸式体验,VR越来越受到市场的关注和重视,而VR也被认为会取代智能手机成为下一代的计算平台。然而,尽管虚拟现实能给用户带来身临其境般的沉浸式体验,但相比传统应用,其具有双目渲染、低延迟、高分辨率以及高帧率等严苛要求,因此极大地增加了 CPU 和 GPU 的计算负载。鉴于此,性能问题对于虚拟现实应用尤为重要,因为VR体验如果没有经过优化,容易出现掉帧等问题,让用户使用时发生眩晕的情况。在本文中,我们将介绍一种适用于所有游戏引擎及虚拟现实运行时(VR runtime)的通用分析方法,分析基于 PC 的VR游戏面临的性能问题。我们以腾讯的一款PC VR游戏《猎影计划》为例展示如何利用这套方法进行分析。在此之前我们先来了解一下VR游戏对性能要求较传统游戏高的四大原因。
VR游戏和传统游戏在硬件性能需求上的区别
相较于传统游戏,VR游戏由于存在高帧率、双目渲染及容易产生眩晕等特性,导致对于硬件计算能力的需求显著上升。下面从4个方面比较一下VR游戏和传统游戏的区别:
像素填充率
以一个1080p 60fps游戏为例,像素填充率为124M pixels/sec。如果是支持高端VR头盔(Oculus Rift,HTC Vive)的游戏,像素填充率为233M pixels/sec(分辨率2160x1200,帧率90fps)。但是中间需要一个较大的渲染目标,避免图像经过反形变校正后产生用户可见并且没被渲染到的区域,导致视角(FOV)降低。根据SteamVR的建议,需要放大的比率为1.4倍,所以实际的像素填充率为457M pixels/sec(分辨率3024x1680,帧率90fps),我们可以通过stencil mesh把最终不会被用户看到的区域剔除掉以减少需要渲染的像素,经过优化后的像素填充率为378M pixels/sec,但仍然是传统1080p 60fps游戏的3倍像素填充率。
双目渲染
从游戏渲染管线的角度来看,传统游戏中每一帧的渲染流程大致如下,其中蓝色的部分是CPU的工作,绿色的部分是GPU的工作。但由于视差的关系,VR游戏需要对左右眼看到的画面分别渲染不同的图像,所以下面的渲染管线也要对左右眼各做一次,从而增加了计算需求(在VR中两眼的视差较小,可以利用GBuffer或提交渲染指令后用view matrix变换等方法降低实际计算量)。
用户体验
对于传统游戏来说,平均帧率达标往往就代表了一个流畅的游戏体验。然而对于VR游戏来说,即使平均帧率达标,但只要出现了连续掉帧,那怕只有非常少数的情况下才发生,都会破坏了整个游戏体验。这是由于连续掉帧会使用户产生眩晕,一旦产生眩晕的感觉,即使后续的画面不掉帧,用户已经感觉到不适,游戏体验已经打了折扣。所以在游戏设计的时候,需要确保场景在最差的情况下也能达标(高端头显下为90fps),否则会影响游戏体验。
另外,由于在VR场景中用户可以跟可移动区域内的对象作近距离观察和交互,所以必须开启抗锯齿以保证画面的清晰度。
延迟
在传统游戏里从控制输入到画面输出的延迟往往达到~100ms的等级[1],FPS类别的游戏对延迟要求较高,但一般也在~40ms的等级。而VR里MTP延迟(motion-to-photon latency,从用户运动开始到相应画面显示到屏幕上所花的时间)低于20ms是基本要求,研究发现对于部分比较敏感的用户,延迟需要达到15ms甚至7ms以下[2]。
低延迟的要求除了使VR游戏必须运行在高帧率外,同时也降低了硬件的运行效率,导致同样的工作量需要更强的硬件来驱动,原因正是低延迟要求使VR游戏的渲染管线必须和传统游戏不一样,而其中CPU对VR性能的影响扮演了重要的角色。
VR游戏和传统游戏在渲染管线上的区别
我们先来看看VR渲染管线和传统渲染管线的区别。图1所示为传统游戏的渲染管线,其中CPU和GPU是并行处理的,以实现最高的硬件利用效率。但此方案并不适用于VR,因为VR需要较低和稳定的渲染延迟,传统游戏的渲染管线无法满足此项要求。
以图1为例,第N+2帧的渲染延迟会远高于VR对延迟的最低要求,因为GPU必须先完成第N+1帧的工作,再来处理第N+2帧的工作,因而使得第N+2帧产生了较高的延迟。此外,由于运行情况不同,我们可以发现第N帧、第N+1帧和第N+2帧的渲染延迟也会有所差异,这对VR的体验也是不利的,因为一直变动的延迟会让用户产生晕动症(simulation sickness)。
图 1:传统游戏的渲染管线。
因此,VR的渲染管线实际上如图2所示,这样能确保每帧可以达到最低的延迟。在图2中,CPU和GPU的并行计算被打破了,这样虽然降低了效率,但可确保每帧实现较低和稳定的渲染延迟。在这种情况下,CPU很容易成为VR的性能瓶颈,因为GPU必须等待CPU完成预渲染(绘制调用准备、动态阴影初始化、遮挡剔除等)才能开始工作。所以CPU优化有助于减少GPU的闲置时间,提高性能。
图 2:虚拟现实游戏的渲染管线。
《猎影计划》*VR游戏背景
《猎影计划》是腾讯旗下利用Unreal Engine* 4开发的一款基于PC的DirectX* 11 FPS虚拟现实游戏,支持Oculus Rift*和HTC Vive*。为了使《猎影计划》在英特尔?酷睿? i7处理器上实现最佳的游戏体验,我们与腾讯紧密合作,努力提升该游戏的性能与用户体验。测试结果显示,在本文所述的开发阶段,经优化后帧率得到了显着提升,从早期测试时跑在Oculus Rift* DK2(分辨率1920x1080)上的每秒36.4帧(fps)提升至本次测试时跑在HTC Vive*(分辨率2160x1200)上的每秒71.4帧(fps)。以下为各阶段使用的引擎和VR运行时版本:
初始开发环境:Oculus v0.8 x64运行时和Unreal 4.10.2
本次测试的开发环境:SteamVR* v1463169981和Unreal 4.11.2
之所以在开发阶段会使用到不同的VR运行时的原因在于,《猎影计划》*最初是基于 Oculus Rift DK2开发的,稍后才迁移至HTC Vive。而测试显示采用不同的VR运行时在性能方面没有显着的差异,因为SteamVR和Oculus运行时采用了相同的VR渲染管线(如图 2 所示)。在此情况下,渲染性能主要由游戏引擎决定。这点可在图5和图14中得到验证,SteamVR和Oculus运行时在每帧的GPU渲染结束后才插入GPU 任务(用于镜头畸变校正),而且仅消耗了少量GPU时间(~1ms)。
下图所示为优化工作前后的游戏截图,优化之后绘制调用次数减少至原来的1/5,每帧的 GPU执行时间平均从15.1ms缩短至9.6ms,如图12和13所示:
图 3:优化前(左)后(右)的游戏截图
测试平台的规格:
英特尔? 酷睿? i7-6820HK 处理器(4 核,8 线程)@ 2.7GHz
NVIDIA GeForce* GTX980 16GB GDDR5
图形驱动程序版本:364.72
16GB DDR4 RAM
Windows* 10 RTM Build 10586.164
初步分析性能问题
为了更好地了解《猎影计划》*的性能瓶颈,我们先综合分析了该游戏的基本性能指标,详情见表1。表中数据通过几种不同的工具收集,包括 GPU-Z、TypePerf和Unreal Frontend等。将这些数据与系统空闲时的数据比较可得出以下几点结论:
游戏运行时的帧率低(36.4fps)而且GPU利用率也低(GTX980上为49.64%)。如果能够提高GPU利用率,帧率也会提高。
大量的绘制调用。DirectX 11中的渲染为单线程渲染,虽然微软*提出deferred rendering context[3]可以用另一线程对渲染指令进行缓存以实现多线程渲染,但结果差强人意[4]。所以相对于DirectX 12,DirectX 11渲染线程具有相对较高的绘制调用开销。由于该游戏是在DirectX 11上开发的,并且为了达到低延迟,VR的渲染管线打破了CPU和GPU的并行计算,因此如果游戏的渲染线程工作较重,很容易会出现CPU瓶颈导致帧率显着降低。在这种情况下,较少的绘制调用有助于缓解渲染线程瓶颈。
由表中可以看出…查看全文
了解更多相关内容,请关注CSDN英特尔开发专区!