如何测试、分析HTC Vive、Oculus Rift的VR游戏性能
文章相关引用及参考:venturebeat
我们将探索VR游戏与传统游戏在性能要求方面的不同点
(映维网 2018年05月16日)在处理能力和用户体验方面,虚拟现实系统主要分为三种类型:高质,主流和入门。高质VR表示高端VR,并且包括市场上搭载高配置的产品,高性能PC或游戏主机。支持高质VR的主要VR外设是HTC Vive,Oculus Rift和索尼PSVR。
主流VR的硬件性能可能不及高质VR,但仍然使用PC处理器进行VR运算。入门级VR则包含Gear VR和谷歌Cardboard等移动VR设备,以及把手机芯片作为计算设备的VR眼镜和一体机。
本文描述了通过HTC Vive和Oculus Rift测试与分析VR游戏的方法。与传统PC游戏相比,VR游戏在设计,输入模式和性能要求方面有所不同。本文不涉及游戏玩法和输入。相反,我们将探索VR游戏与传统游戏在性能要求方面的不同点。
每秒处理的像素大小是衡量VR体验的重要指标。目前HTC Vive和Oculus Rift CV1的屏幕分辨率是2160×1200,因此在进行实际渲染时,我们需要更多采样来抵消由镜头畸变引起的分辨率损失。对于HTC Vive和Oculus Rift CV1,这一损失高达140%。VR处理的像素大小达到了惊人的4.57亿每秒。
性能测试与分析是VR游戏的重要组成部分。这些任务有助于实现所需的要求,并且确保充分利用所有的CPU和GPU处理能力。在测试之前,Oculus需要关闭异步空间扭曲(ASW),SteamVR则要关闭异步二次投影,这样VR运行时补偿干预将不会影响背后的性能分析。
如要禁用ASW,请在Oculus SDK中依次打开Program Files\Oculus\Support\oculus-diagnostics\OculusDebugTool.exe,然后运行OculusDebugTool.exe。
图1:异步空间扭曲配置
如要在SteamVR中禁用二次投影功能,请使用Settings/Performance(设置/性能)。
图2:SteamVR配置
1. 工具
软件工具在测试与分析VR游戏中扮演着重要角色。所涉及的主要工具包括Fraps,游戏加加,Unreal的控制台命令,Windows Assessment and Deployment Kit(ADK),SteamVR帧定时,以及英特尔的图形性能分析器。
1.1 Fraps FPS(帧每秒)计数器
Fraps FPS(帧/秒)计数器是一种传统的测试与帧时工具,开发者可以利用它来测试一段时间内的最大帧速率,最小帧速率和平均帧速率。最终结果可以轻松导入至Excel,并且生成相应的图表。如下图所示,我们可以看到帧速率在整个过程中的变化是否平滑。另外,Fraps可支持你方便地截取屏幕截图,然后用于各种报告目的。
图3:(顶部)随时间变化的帧速率;(底部)最大帧速率,最小帧速率和平均帧速率。
图3的底部说明了Fraps随时间推移而产生的最大帧速率,最小帧速率和平均帧速率。
如数据显示,这款VR游戏中的帧率在大部分时间都很低,仅为45FPS,不符合HTC的要求。对于这种性能表现,玩家会遭遇不适,甚至是晕动症(为了防止用户产生不适或晕动症,体验要求达到90 FPS的稳定帧速率)。这时,我们可以使用Windows ADK中的GPUVIEW来确定问题是来自于GPU,还是说CPU。
1.2 游戏加加
虽然Fraps是免费共享软件,但它已经有很长时间没有更新。游戏加加是一款类似的基准工具。在运行该实用程序时,工具窗口会自动显示在游戏窗口的顶部,其信息包括FPS,CPU温度,图形占用率,CPU,显卡和内存使用情况等等。Fraps的另一个缺点是它不能用于测试DirectX 12游戏,但你可以使用另一个工具PresentMon来采集FPS数据。
图4:游戏加加的实时数据显示界面
顶部的工具窗口提供对正在运行的游戏及其性能的实时监控。但Fraps和游戏加加都是为传统游戏设计,只能在显示器上显示数据。
1.3 Unreal引擎工具
佩戴VR头显的玩家无法看到显示器上的信息,如果想看到实时性能数据,我们有两种选择:
1.如果游戏基于Unreal引擎,请使用stat fps控制台命令。
2.使用SteamVR帧定时方法,这可以帮助你在头显和显示器上看到实时性能数据。SteamVR帧时间设置请访问Valve官网(点击前往)
图5显示了SteamVR帧定时数据。
图5:头显显示器中的丢失帧。
如图5所示,当游戏场景帧出现丢帧时,头显将显示一个“Missed Frames(丢帧)”框。红条密度越高,出现丢帧的频率越高。
图6:PC上运行的CPU和GPU。
图6显示了更详细的数据。在数据读出方面,蓝色表示GPU渲染时间,而茶色则代表了GPU空闲时间。
如图6所示,某些帧的GPU渲染时间超过了11.11毫秒,这将错过Vsync(垂直同步)的时间并导致丢帧。这些帧无法达到90 FPS。借助这个SteamVR帧定时工具,我们可以知道更多关于GPU Bound(限制)的信息,但它无法确定CPU渲染线程是否没有及时传递渲染命令,从而导致GPU冒泡(bubble)或者GPU渲染时间过长。
1.4 Unity Engine的控制台命令工具
如果游戏是通过UE4引擎开发,而且属于开发版本(非发行版本),我们就可以使用Unity的控制台命令工具来浏览游戏的实时性能数据。
你可以按下“〜键(键盘左上角)”来显示命令行窗口。以下是一些常用的控制台命令:
Stat FPS:显示每帧的FPS和帧时间。这个命令很容易在VR中使用,因为帧速率显示在VR头显上,测试人员可以方便地观察游戏的实时性能。
Stat Unit:显示游戏中每帧的总时间,游戏逻辑线程消耗的时间,游戏渲染线程时间消耗,以及GPU时间消耗。一般来说,如果一个帧的时间消耗接近于逻辑线程的时间消耗,瓶颈限制位于逻辑线程;但如果一个帧的时间消耗接近渲染线程时间,则瓶颈限制在于渲染线程。如果两个时间都接近GPU时间,瓶颈限制就与显卡有关。
图7:Stat Unit命令的截图。
Stat SceneRendering:显示游戏渲染线程中的各种参数值(参见图8)。
图8:Stat SceneRendering命令的截图。
Stat Game:游戏逻辑线程上运行的参数值实时视图,如人工智能和内存分配等等(参见图9)。
图9:Stat Game命令的截图。
Stat GPU:实时显示每帧中的GPU主渲染内容的时间参数(参见图10)。
图10:Stat GPU命令截图
Stat InitViews:显示剔除需要的时间和效率数据(参见图11)。
图11:Stat InitViews命令的截图。
Stat LightRendering:显示照明和着色所需的渲染时间(参见图12)。
图12:Stat LightRendering命令的截图。
其他命令(如Stat A和Stat)可以从Unreal官方网页中引用:
-
https://docs.unrealengine.com/udk/Three/ConsoleCommands.html
-
https://docs.unrealengine.com/latest/INT/Engine/Performance/StatCommands/
1.5 GPUVIEW工具
我们可以使用Windows ADK中的GPUVIEW和Windows性能分析器(WPA)来执行进一步的分析。
在上述命令中,Stat Unit初步说明了帧是GPU Bound还是CPU Bound。有时结果不够准确,例如当CPU的一个线程造成一个GPU帧中间冒泡(bubble)。如果发生这种情况,在Stat Unit命令中看到的GPU渲染时间实际上属于实时渲染时间和冒泡时间的扩展。在这种情况下,我们需要GPUVIEW和WPA进行分析。
如图13所示,每个帧中间都有一个2毫秒的冒泡,因此GPU不能正常工作。最初的帧渲染时间小于11毫秒,但随着冒泡的渲染时间超过90 FPS所需的11.1毫秒,这导致下一帧丢失Vsync时间。结果则是出现了帧丢失。
图13:GPUVIEW界面:每帧中间出现了一个2毫秒的冒泡
这时,我们可以使用WPA打开相同的Merged.etl文件,并通过时间线找到冒泡的时间窗口,从而确定CPU的哪个线程更繁重,以及此时该线程正在运行的内容(参见图14) 。
图14:Windows性能分析器界面
如果GPUVIEW中GPU帧的渲染时间超过11.11毫秒,则可以确定为GPU Bound,然后我们可以使用英特尔GPA来分析管道中的哪部分出现了过载情况。
1.6 英特尔GPA
英特尔GPA是一款功能强大的免费图形性能分析工具(点击前往)。英特尔GPA包含以下独立工具:
- 系统分析器:实时显示游戏性能指标。
- 图形帧分析器:帧分析器。
- 平台分析器:查找CPU和GPU工作负载。
- 图形跟踪分析器:捕获其他分析器分析的详细事件跟踪。
英特尔GPA图形帧分析器可以与GPUVIEW结合使用。我们可以查看游戏中的绘制调用,渲染目标,纹理贴图和特定帧的着色器等等。通过简化着色器,你可以设计一个实验来测试渲染中的哪个部分会影响性能,从而帮助确定需要优化的关键部分(参见图15)。
图15:图形帧分析器的界面。
2. 案例分析
我们用一个例子来说明如何测试和分析VR游戏。
在测试之前,你可以使用dxdiag命令查看系统配置:
首先,我们先运行一段时间Fraps测试,并且绘制帧率变化。如图16所示,在测试的前半部分中有部分场景可以达到90 FPS,但在后半部分里,帧速率在45左右波动,不符合要求标准。所以我们需要进一步分析。
图17:FPS变化
利用Stat FPS命令查找较低帧速率的场景。如果你认为游戏变化太快而无法获取数据,则可以使用控制台命令PAUSE暂停游戏,然后再轻松地打开所需的工具。结合Stat Unit命令的参数,CPU渲染线程和GPU都可能出现瓶颈(参见图17)。
图18:stat unit命令的截图。
我们需要使用GPUVIEW和WPA进行同步分析。
图19:GPU渲染时间
我们从GPUVIEW中看到的第一件事情是,一帧的渲染时间为13.69毫秒,高于11.11毫秒,所以性能不太可能达到90FPS(参见图19)。
接下来,我们看到CPU上只有音频线程运行了大约10毫秒时间(见图20)。其他线程基本上为空间,这意味着音频线程没有充分利用CPU资源,这样我们就有机会将CPU用于特殊效果,例如更多的AI,物理,材质或粒子效果。
图20:CPU空间时间
WPA同样如此,其中游戏和渲染线程基本上为空闲。
图21:Windows性能分析器上显示的CPU运行线程
借助英特尔GPA,你可以看到绘制调用少于1000个,而这是一个合理的数字。
图22:所有的绘制调用
选择所有的Target进行实验,其中我们可以粗略看到帧花费的时间。
2×2 Textures实验在真实场景中使用了简单纹理。实验表明,简单纹理没有显著的性能改进,因此可以忽略纹理优化。
1×1 Scissor Rectangle实验则在渲染管道中移除了像素处理阶段。从这个实验中可以看到,性能表现已经有了显著的提升。
Simple Pixel Shader实验取代了简化像素着色器中的原始着色器,并且我们可以看到性能出现了大幅提升。
从上面的实验我们可以看到,GPU渲染管道中的像素处理任务相当繁重。另一个查看一帧中哪个操作占据最多时间的方法是,在UE4的命令行输入中使用ToggleDrawEvents。
图24:英特尔GPA分析器显示了每个绘制调用的执行函数
以下是几个关于耗时模块的表格。这些信息可以帮助你专注于高时间比率的模块,并且进行选择性的优化。
3. 总结
如果硬件尚未完全能够实现沉浸式VR体验所需的高性能,我们可以通过优化来体验高质量的游戏。在游戏优化期间寻找瓶颈需要利用本文所描述的各种工具和方法。通过各种实验和参数调整来确定游戏的CPU或GPU性能瓶颈,本文同时提供了一定的见解,可以帮助改善游戏体验。