Quantcast
Channel: 英特尔开发人员专区文章
Viewing all articles
Browse latest Browse all 583

PC虚拟现实应用的性能分析与优化:从CPU角度切入

$
0
0

立即下 (PDF 1.61MB)

如今,虚拟现实 (VR) 术正日益受到欢迎,这主要得益于遵循摩尔定律的技术进步让这一全新体验在技术上成为可能。尽管虚拟现实能给用户带来身临其境般的超凡体验,但相比传统应用,其具有双渲染、低延迟、高分辨率以及高帧严苛要求,因此极大地增加了 CPU GPU 计算工作负载。鉴于此,性能问题对于虚拟现实应用尤为重要,因为拟现实体验如果没有经过优化,会出现低帧或高延迟的问题,让用户使用时现眩晕的情况在本文中,我们将介绍一种适用于所有底层引擎或虚拟现实运行时(VR runtime)的通用方法,分析基于 PC 的虚拟现实应用面临的瓶颈问题。们以腾讯* 的一款 PC 拟现实游戏《盘古》* 为例展示分析流程

拟现实游戏和传统游戏在渲染管线上的区别

在探讨分析详情之前,我们先来解释一下 CPU 在虚拟现实中发挥重要作用的原因及其对虚拟现实性能的影响。 1 所示为传统游戏的渲染管线,其中 CPU GPU 是并行处理的,以实现最高的硬件利用率。但此方案并不适用于虚拟现实,因为虚拟现实需要较低和稳定的渲染延迟,传统游戏的渲染管线无法满足此项要求。

1 为例,帧 N+2 的渲染延迟远高于VR对延迟的最低要求,因为 GPU 须先完成帧 N+1 的工作,再来处理帧 N+2 的工作,因而使得帧 N+2 产生了较高的延迟。此外,由于运行情况不同,帧 N N+1 N+2 的渲染延迟也会有所差异,这对虚拟现实的体验也是不利的,因为一直变动的延迟会让用户产生模拟疾病(simulation sickness)

1传统游戏的渲染管线。

因此,虚拟现实的渲染管线实际上如2 所示,这样能确保每帧可以达到最短的延迟。 2 中,CPU/GPU 进行并行处理,这样虽然降低了效率,但可确保每帧实现较低和稳定的渲染延迟。这种情况下,CPU 会成为虚拟现实的瓶颈,因为 GPU 须等待 CPU 完成预渲染工作(绘制调用准备、动态阴影初始化、遮挡剔除等)。CPU 优化有助于减少 GPU闲置时间,提高性能。

2拟现实游戏的渲染管线。

盘古》* 拟现实游戏的背景

盘古》* 腾讯* 利用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)以下为开发工作开始和本文撰写时使用的引擎和虚拟现实运行时:

  • 初始开发平台: Oculus v0.8 x64 运行时和 Unreal 4.10.2
  • 本文撰写时开发平台: SteamVR* v1463169981 Unreal 4.11.2

在开发阶段使用不同虚拟现实运行时的原因在于,《盘古》*最初是在 Oculus Rift DK2 上开发的,而当时 Oculus Rift CV1 HTC Vive 尚未发布。 HTC Vive 正式发布后,《盘古》* 便迁移至该设备评估显示,采用不同的虚拟现实运行时在性能方面没有显著的差异,因为 Oculus SteamVR 运行时采用了相同的虚拟现实渲染管线(如图 2 所示)。在此情况下,渲染性能主要由游戏引擎决定。这点可在图 5 14 中得到验证,Oculus SteamVR 运行时在帧的GPU 渲染后才插入GPU 务(用于镜头畸变校正),在渲染方面仅消耗了少量时间。

图所示为优化工作前后的游戏截图,请注意绘制调用次数在优化之后减少至原来的1/5,每帧的 GPU 执行时间平均从 15.1ms 缩短至 9.6ms,如 12 13 所示:

Figure 3

3优化前(左)后(右)的游戏截图

测试平台的规格:

  • 英特® 酷睿 i7-6820HK 处理器(4 核,8 线程)@ 2.7GHz
  • NVIDIA GeForce* GTX980 16GB GDDR5
  • 图形驱动程序版本:  364.72
  • 16 GB DDR4 RAM
  • Windows* 10 RTM Build 10586.164

查找性能问题

为了更好地了解《盘古》*的性能瓶,我们先综合分析了该游戏的基本性能指标,见表 1表中数据通过几种不同的工具收集,包括 GPU-ZTypePerf Unreal Frontend 等。这些数据与系统空闲时的数据比较可得出以下几点结论:

  • 帧率低(36.4 fps而且GPU利用率也低(GTX980 49.64%)。如果能提高 GPU 利用率,帧率也会提高。
  • 大量的绘制调用。 DirectX 11 中的渲染为单线程,相对于 DirectX 12DirectX 11渲染线程具有相对较高的绘制调用开销。由于该游戏是在 DirectX 11 上开发的,并且为了达到低延迟和较短的MTP延迟(motion-to-photon latency,从用户运动开始到相应画面显示到屏幕上所花的时间),虚拟现实的渲染管线打破了CPU / GPU的并行处理,因此如果游戏的瓶颈在渲染线程,很容易出现CPU瓶颈导致性能显著降低。这种情况下,较少的绘制调用有助于缓解渲染线程瓶颈
  • 由表中可以看出,CPU 利用率似乎不是问题,因为其平均值只有 13.6%但从下文更一步的分析可以看出,《盘古》实际上存在CPU瓶颈的问题。
 系统空闲《盘古》*运行在Oculus Rift* DK2上(优化前)
GPU核心频率(MHz)1351337.6
GPU内存频率(MHz)1621749.6
GPU已用内存(MB)1841727.71
GPU负载(%)049.64
平均帧率(fps)不适用36.4
绘制调用次数(每帧)04437
处理器(_Total)\处理器时间(%)1.04 (5.73/0.93/0.49/0.29/ 0.7/0.37/0.24/0.2)13.58 (30.20/10.54/26.72/3.76/ 12.72/8.16/12.27/4.29)
处理器信息_Total)\处理器频率(MHZ)8002700

1:优化前游戏的基本性能指标。

下面,我们利用GPUViewWindows 评估和部署工具包(Windows Assessment and Deployment Kit, Windows ADK[1] 中的 Windows 性能分析器(Windows Performance Analyzer, WPA对《盘古》的性能瓶颈进行分析。

深入探查性能问题

GPUView [2] 工具可用于调查图形应用、 CPU 线程、图形驱动程序、Windows 图形内核等相互之间的性能和交互情况。该工具还可以在时间轴上显示程序是否存在CPU GPU瓶颈另外,Windows 性能分析器 [3] 可用于跟踪 Windows 事件(Event Tracing for Windows, ETW),并生成相事件的数据和图表。WPA具有灵活的用户界面(UI),通过简单操作即可查看调用堆栈、CPU 热点、上下文切换热点等,它还可以用来查找性能问题的根本原因。 GPUView Windows 性能分析器都可以用于分析由 Windows 性能记录器(WPR)採集到的事件追踪日志(Event Trace Log, ETL)。Windows 性能记录器可通过用户界面或命令行运行,其内建的配置文件可用来选择要记录的事件。

对于虚拟现实应用,最好先确定其计算是否受限于CPUGPU或二者。我们可以将优化工作的重心集中在对性能影响最大的瓶颈,以便最大限度提升性能。

4 为优化前《盘古》 GPUView 中的时间线视图,包括 GPU 工作队列、CPU 上下文队列和 CPU 线程。根据图表我们可以看出:

  • 帧率大约为 37 fps
  • GPU利用率大约为 50%
  • VR应用的用户体验很差,因为帧率远低于 90 fps,易于让最终用户出现眩晕的感觉。
  • GPU 工作队列所示,只有两个进程向 GPU 提交了任务: Oculus 拟现实运行时和《盘古》。Oculus VR运行时帧渲染的最后阶段进行了后处理,包括畸变校正、色彩校正和时间扭曲等。
  • 从图中可以看出《盘古》同时存在CPUGPU瓶颈:
    • CPU 瓶颈方面,GPU有大约50%时间都处于空闲状态,而且受到了一些 CPU 线程的影响而导致GPU工作没法及时被提交,只有这些线程中的CPU务完成后GPU 务才能被执行。这种情况下如果 CPU 务进行优化,将能够极大地提升 GPU 的利用率,使 GPU 执行更多的任务,从而提高帧率。
    • GPU 瓶颈方面,我们可以看出,即使所有GPU空闲时间都能够被消除单帧的 GPU 执行时间仍然大于 11.1ms(在《盘古》的情况下约 14.7ms),因此,如果不 GPU 进一步优化,此应用的帧率不可能达到 Oculus Rift* CV1 HTC Vive* 等虚拟现实头盔要求的帧率 - 90 fps

4GPUView 盘古》*时间线视图

 改善帧率和 GPU 利用率的初步建议:

  • 物理和 AI 等非紧急的 CPU 务可以延后处理,使图形渲染工作能够尽早被提交,以缩短CPU瓶颈时间。
  • 有效应用多线程技术可增加并行性,减少游戏中的 CPU 颈。
  • 减少会导致 CPU 的任务,如绘制调用、动态阴影预处理、布料模拟、物理和AI等。
  • 提前提交下一帧的CPU 务以提高 GPU 利用率。尽管MTP延迟可能会略有增加,但性能与效率会显著提高。
  • DirectX 11 具有高绘制调用和驱动程序开销。绘制调用过多时渲染线程会造成严重的 CPU 瓶颈。如果可以的话,考虑迁移至 DirectX 12
  • 此外还必须优化 GPU 工作负载(如过度绘制、带宽、纹理填充率等),因为单帧的GPU处理时间大于一个垂直同步周期,所以会发生丢帧。

为了深入探查瓶颈问题,我们使用 Windows 性能分析器来研究从GPUView发现的CPU瓶颈(通过分析同一个ETL文件) Windows 性能分析器也可用于发现CPU热点函数或上下文切换的性能热点;对该主题有兴趣的读者可以参考 [4] 了解更多详情。以下介绍CPU颈分析和优化的主要方法

首先让我们分析一下《盘古》出现性能问题的区间GPU完成一帧的渲染后,当前画面会通过显示桌面内容(Present)函数被提交到显示缓存,两个显示桌面内容(Present)函数之间的时间段为一帧的周期,如图 5 所示(26.78 ms,相当于 37.34 fps)。

5GPUView盘古》*时间线视图(单帧)。注意导致 GPU閒置 CPU 线程。

请注意,在 GPU 工作队列中有不少时间GPU是闲(例如,一帧开头的 7.37 ms),这实际上是由工作负载的 CPU 线程瓶颈所造成,如红框所圈起来的部分。原因在于绘制调用准备、剔除等 CPU 务必须在GPU渲染命令提交之前完成。

如果使用 Windows 性能分析器分析GPUView所示的 CPU 瓶颈,我们就能找出导致GPU无法马上执行工作的对应CPU热点函数。 6-11 所示为与GPUView为同一时间段下,Windows 性能分析器中各CPU线程的利用率和的调用堆栈

6Windows 性能分析器《盘古》*时间线视图,与图 5 为同一时间段

 接下来让我们仔细分析每个 CPU 线程的瓶颈。

Figure 7

7渲染线程 T1864 调用堆栈。

调用堆栈可以看出,渲染线程中最主要的三个瓶颈是

  1. 态网格的基本通道渲染(50%
  2. 动态阴影初始化(17%
  3. 计算视图可视性(17%

以上瓶颈是由于渲染线程中存在太多的绘制调用、状态变换和阴影图渲染所造成。优化渲染线程性能的几点建议如下:

  • Unity* 应用批处理或在 Unreal 应用actor融合以减少静态网格绘制。将相近对象组合在一起,并使用细节层次(LOD)。使用更少的材质,以及将不同的纹理融入较大的纹理集都有助于提升性能。
  • Unity 中使用双宽渲染 (Double Wide Rendering) 或在 Unreal 中使用实例化立体渲染 (Instanced Stereo Rendering),减少立体渲染的绘制调用提交开销。
  • 减少或关闭实时阴影。接收动态阴影的对象将不会进行批处理,从而造成严重的绘制调用问题。
  • 避免使用会导致对象被多次渲染的特效(反射,逐像素光照,透明或多材质对象)。 

Figure 8

8戏线程 T8292 调用堆栈

戏线程最主要的三个瓶颈是

  1. 设置动画评估并行处理的前置工作(36.4%
  2. 绘视口(view port)21.2%
  3. 处理鼠标移动事件(21.2%

以上三大问题可以通过减少视口数量,以及降低CPU并行动画评估的开销来解决。如果只使用了几个动画节点,则实施单线程处理,并且检查CPU 方面的鼠标控制使用情况。

工作线程(T8288T4672T8308):

Figure 9

9工作线程 T8288 调用堆栈。

Figure 10

10工作线程 T4672 调用堆栈。

Figure 11

11工作线程 T8308 调用堆栈。

这些工作线程的瓶颈主要在于物理相关模拟,比如布料模拟、动画评估和粒子系统更新

2 列出了GPU闲时的所有 CPU 热点(时钟周期的百分比)。

线程功能时钟周期百分比
渲染线程静态网格的基本通道渲染13.1%22.1%
动态阴影初始化4.5%
计算视图可视性4.5%
游戏线程设置动画评估并行处理的前置工作7.7%16.7%
重绘视口4.5%
处理鼠标移动事件4.5%
物理布料模拟13.5%22%
动画评估4%
粒子系统
4.5%
驱动程序4.4%

2优化前GPU闲时的 CPU 热点。

优化

实施了包括细节层次、实体化立体渲染、动态阴影消除、延迟CPU务以及优化物理等优化措施后,帧率从 Oculus Rift* DK21920x1080)上的 36.4 fps 提升至 HTC Vive*2160x1200)上的 71.4 fps;同时由于 CPU 颈减少,GPU 的利用率从 54.7% 提升至 74.3%

12 13 别显示优化前后《盘古》* GPU 利用率,如 GPU 工作队列所示。

Figure 12

12优化前《盘古》* GPU 利用率。

Figure 13

13优化后《盘古》* GPU 利用率。

14优化后 GPUView 盘古》*时间线视图。

14 所示为优化后《盘古》*GPUView视图优化后 CPU 颈期从 7.37 ms 降至 2.62 ms,所用的优化措施包括:

  • 提前运行渲染线程(一种通过产生额外的 MTP 迟来减少 CPU 颈的方法)[5]
  • 减少绘制调用次数和开销,包括采用细节层次、实体化立体渲染和移除动态阴影。
  • 迟处理游戏线程和工作线程的任务。

15所示 CPU 颈期的 CPU 渲染线程的调用堆栈,即图14红框标记起来的部分。

15渲染线程 T10404 调用堆栈。

3 列出了优化后 GPU闲时的所有 CPU 热点(时钟周期的百分比)。请注意相对于表 2许多热点和线程已从 CPU 颈中移除。

线程功能时钟周期百分比
渲染线程静态网格的基本通道渲染44.3%52.2%
渲染遮挡7.9%
驱动程序38.5%

3优化后 GPU 闲置时的 CPU 热点。

更多的优化措施,比如actor融合或者使用更少的材质,都可以优化渲染线程中的静态网络渲染,进一步提高帧率。假若能对 CPU 务进行充分的优化,单帧的处理时间能进一步减少 2.62 ms单帧的 CPU 颈期),达到 11.38 ms,相当于平均帧率 87.8 fps

4 所示为优化前后的性能指标。

 系统空闲《盘古》*运行在Oculus Rift* DK2上(优化前)《盘古》*运行在 HTC Vive* 上(优化后) 
GPU核心频率(MHZ)1351337.61316.8
GPU显存频率(MHZ)1621749.61749.6
GPU已用内存(MB)1841727.712253.03
GPU负载(%)049.6478.29
平均帧率(fps)不适用36.471.4
绘制调用次数(每帧)04437845
处理器(_Total)\处理器时间(%)1.04 (5.73/0.93/0.49/0.29/ 0.7/0.37/0.24/0.2)13.58 (30.20/10.54/26.72/3.76/ 12.72/8.16/12.27/4.29)31.37 (46.63/27.72/33.34/18.42/ 39.77/19.04/46.29/19.76)
处理器信息(_Total)\处理器频率(MHZ)80027002700

4: 优化前后游戏的基本性能指标。

结论

本文介绍了我们与腾讯通力合作,分析与优化运行于高端VR头盔上的《盘古》* 拟现实工作负载,从而使该游戏在英特尔®酷睿 i7 处理器上实现 90 fps 帧率。实施我们的部分优化建议后,帧率从Oculus Rift* DK21920x1080)上的 36.4 fps 提升至 HTC Vive*2160x1200)上的 71.4 fps,同时由于 CPU 颈减少,GPU 的平均利用率从 54.7% 提升至 74.3%单帧的 CPU 颈期也从 7.37 ms 减至 2.62 ms其他的优化措施,如角色合并和纹理集都可以进一步优化性能。

利用多种工具分析虚拟现实应用可以帮助我们了解该应用的性能表现和瓶颈所在,该步骤对于优化虚拟现实性能尤其重要,因为单凭性能指标可能无法真正反映瓶颈问题在那。本文中讨论的方法与工具可用于分析使用任何游戏引擎或虚拟现实运行时开发的Windows虚拟现实应用,以及确定工作负载是否受到 CPU GPU 的限制。由于绘制调用准备、物理模拟、光照或阴影等因素的影响,有时 CPU 对虚拟现实应用性能的影响比 GPU 更大。过分析多个存在性能问题的虚拟现实工作负载,我们发现其中许多存在CPU瓶颈这意味着优化 CPU 可以提升它们的 GPU 利用率、性能及用户体验。

参考

[1] https://developer.microsoft.com/en-us/windows/hardware/windows-assessment-deployment-kit

[2] http://graphics.stanford.edu/~mdfisher/GPUView.html

[3] https://msdn.microsoft.com/en-us/library/windows/hardware/hh162981.aspx

[4] https://randomascii.wordpress.com/2015/09/24/etw-central/

[5] http://www.gdcvault.com/play/1021771/Advanced-VR

作者介

Finn Wong 目前担任英特® 软件和解决方案事业部(SSG)、开发人员关系部门(DRD)、高级图形支持团队(AGE 团队)的高级应用工程师。 2012 年加入英特尔公司起,他一直积极支持在公司 PC 产品中使用第三方媒体、图形和感知计算应用。在加入英特尔之前,Finn 有七年视频编码、数字图像处理、计算机视觉、算法和性能优化领域的专业工作经验,发表过多篇学术论文。 Finn 拥有国立台湾大学电气工程学士学位和通信工程硕士学位。


Viewing all articles
Browse latest Browse all 583

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>