平台分析器 — 分析健康状态和非健康状态的应用

最近,我的妻子买了一本又厚又贵的书。 作为儿童超声波诊断医生,她购买了许多书,但是这本书让我感到很不解。  书名是《论健康儿童的超声解剖》。  她为什么需要一本只针对健康儿童的书呢?  我向她提出了我的疑问,她的答案非常简单:如果要诊断所有疾病,包括尚未发现的疾病,你必须要了解健康的儿童是什么样的。 

在本文中,我们将像医生一样,对健康的应用和不太健康的应用进行分析和比较。

咚 — 咚 — 咚。

医生: “门开着,请进。”

Warrior Wave* 是一款非常棒的游戏,在游戏中,您的手就像是一条路,让战士通过;接下来我们把这个游戏当作病患来诊断一下。 使用英特尔® 实感™ 技术玩游戏和进行创新是一件极为有趣的事情。 

在玩游戏时,有些性能不太尽如人意。  这是我以前使用基于英特尔® 实感™ 技术时从来没感到过的。  问题可能是由许多事情导致,但是在这种情况下是什么原因呢?  

像优秀的医生配备最新、最棒的分析工具来诊断问题一样,我们也使用了最完美的工具来分析“病患”。

使用英特尔® 图形性能分析器(英特尔® GPA)平台分析器,我们可以接收到应用 CPU 负载、帧时间、每秒帧数 (FPS) 和绘制调用的时间线视图:

我们来看一下。

最吸引我们眼球的是定期出现的常规 FPS 激增。 在大约 200 毫秒内时,所有的进展都是相对平顺的,然后就是大幅上下动荡。

为了作比较,我们来看一下下面的健康 FPS 轨迹。 此轨迹中的游戏流畅,游戏体验较好。  

在帧时间内没有发现任何模式,只有正常的随机偏差。

但是,在我们的研究中,我们看到的是常规激增。 这些激增大约每秒钟出现四次。  我们更进一步了解了这个问题,并将重点放在其中一个激增以及线程中的运行情况:

我们可以看到正在工作的线程 2780 在同步方面花费了大部分的时间。 线程几乎不执行任何操作,只等待英特尔® 实感™ 软件开发套件的下一帧:

同时,我们可以看到该渲染在另一个工作线程中运行。 如果我们向下滚动,就会发现线程 2372。

游戏在“积极”等待英特尔实感软件开发套件的下一帧时,完全可以执行一些有价值的任务。 绘制和英特尔® 实感™ 软件开发套件工作可以在一个(而不是两个)工作线程中完成,以简化线程的通信。

线程过度通信会显著降低执行速度并导致出现诸多问题。

以下是“健康”游戏的示例,其中英特尔® 实感™ 软件开发套件任务和 DirectX* 调用位于同一个线程中。 

实感™ 专家表示:“等待英特尔® 实感™ 软件开发套件的帧毫无意义。 他们并不会更快做好准备。 

但是,我们可以看到主要问题出现在时间线顶端。

平均六分之五的 CPU 帧不会在一个 GPU 帧中。 这也是 GPU 帧速率速度较慢且不均匀的原因,平均低于 16 FPS。

接下来我们了解一下尝试的管线,并理解一下代码是如何执行的。  看一下“引擎 0”中的数据包数量,管线已经溢出,但是执行几乎为空。

处理器每秒钟可以处理 10 至 12 个单独的图像,并分别感知它们。 这也是为何最初的电影以 16 FPS 的速率进行剪辑的原因:该速率是多数人将静态图看作动态图的速率。

我们看一下拥有漂亮外观的游戏的档案: 

注意,GPU 帧按照 CPU 帧的速率运行,几乎没有变化。 对于每个 CPU 帧,都有一个 GPU 在稍作延迟之后开始执行。

我们来了解一下我们的游戏为什么没有此模式。

首先,我们来检查一下 DirectX* 调用。 带有工具提示并突出显示的调用是我们的 “Present” 调用,该调用可向 GPU 发送已经完成的帧。 在上方的截图中,我们可以看到,它能够在 GPU 管线上生成一个 “Present” 包(使用 X 标记)。  在大约 2215 毫秒的标记处,它更靠近执行,跳过 3 个位置,但是在 2231 毫米处时,它没有完成执行直接消失。

如果我们看一下轨迹中的每一个 present 调用,就会发现没有一个调用成功使其执行。

问题: 如果忽略所有 DirectX* Present 调用,游戏如何自动绘制? 好在我们可以使用出色的工具来解决。 我们来看一下。

您是否能看到灰色椭圆图案内有些奇怪? 我们可以看到该数据包不是由于 DirectX* 调用代码而生成,却仍然在快速且无序地执行。 嘿,慢一点!!!

我们来进一步了解一下该数据包。 

现在,我们来看一下执行的数据包。 

哇! 它来自一个“外部”线程。 这代表什么意思? 外部线程是指不属于游戏的线程。

我们自己的数据包被忽略,而一个外部线程绘制了我们的游戏? 什么? 嘿,这个工具疯了!

不,图像非常正确。 出现这种情况的原因是在 Windows* 系统上(自 Windows Vista* 起),有一个名为桌面窗口管理器 (DWM) 的程序,可以在屏幕上进行合成。 它的包便是我们所看到的以高优先级快速运行的数据包。  所以,我们的数据包并没有丢失,它们是由 DWM 截取,创建最后的图片。

DWM 为何会截取全屏游戏的数据包? 想了一下,我发现答案很简单: 我采用的是多显示器台式机配置。 将第二台显示器关闭会使得 Warrior Wave 像其他游戏一样运行:正常的 GPU FPS,没有小故障,没有 DWM 包。

找到病因了! 真令人欣慰!

但是其他的游戏在多显示器配置下仍然能够正常运行,对吗(我脑袋中的另一个声音这么说)?

为了更深入地研究,我们需要另一种工具。 英特尔® GPA 平台分析器可帮助我们查看不同时间 CPU 和 GPU 的运行情况,但是它无法更详细地展示每一帧。

我们需要进一步了解一下 Direct3D* 设备生成代码。 对此,我们可以使用面向 DirectX* 的英特尔® GPA 帧分析器,但是我将会在另一篇文章中介绍该主题。

我们来总结一下学到的内容:

在此次调查中,我们检查到导致 FPS 激增的使用情况较差的线程,以及一个讨厌的 DWM 问题,该问题可通过切换到桌面方案的第二台显示器轻松解决。

结论: 英特尔® GPA 平台分析器是初步调查该问题的必备工具。 熟悉一下该工具,并将其添加到您的工具箱内。

关于作者:

Alexander Raud 是俄罗斯英特尔® 图形性能分析器团队的一员,以前在 VTune Amplifier 工作。 Alex 拥有俄罗斯和欧洲国家双重国籍,会讲俄罗斯语、英语、法语,目前正在学习西班牙语。  Alex 已婚,有两个孩子,是前卫金属职业乐手,并且是 Jesus Embassy Church 国际部的负责人。

有关编译器优化的更完整信息,请参阅优化通知