UE4项目优化01-性能诊断评估01

ue4项目测量评估性能:

在本章中,您将学习虚幻工程中:

  • 在游戏开发中使用毫秒的重要性
  • 将毫秒转换为每秒帧
  • 性能评估的基本工具
  • 显示每个子系统的统计信息,例如遮挡剔除或粒子
  • 记录性能指标并使用分析器读取它们

每秒帧数是最终度量标准吗?

在硬件审查中,通过基于相同游戏运行基准测试来比较竞争产品。结果以每秒帧数表示。图形卡A的性能应优于B,因为它在同一时间段内会产生两倍的帧。游戏C比D要求更高,因为相同的硬件每秒只能计算40帧,而另一个游戏中只有60帧。

每秒帧数似乎是最流行的性能指标。那么,为什么游戏开发人员以毫秒为单位进行度量呢?

这是有关NVidia HairWorks 1的文章的引文:

正如您可能期望从据说可以渲染成千上万个棋盘格状头发的技术中看到的那样,无论您运行的是Nvidia还是AMD显卡,游戏的性能都非常可观。在我们的测试案例中,启用HairWorks后,GTX 970的性能下降了24%,从平均51.9fps下降到39.4fps。但是,AMD遭受的打击更大,其平均帧率下降了约47%-其49.6fps指标降至26.3fps。

我们可以从这些数字得出的结论是,在Witcher 3中启用HairWorks模拟的头发可以使游戏每秒丢失多达23帧,具体取决于卡片。但是,让我们假设我们拥有另一个功能,并且具有相同的计算成本,例如景深。我们同时启用头发和自由度。我们可以在不使用毫秒的情况下根据此信息计算最终fps吗?

让我们尝试从原始帧速率中减去这些费用。

49.6 fps- 23 fps(HW)-23 fps(DoF)= 3.6 fps?

现在,如果有这么高要求的第三个功能,例如HBAO,该怎么办?我们最终应该得到的是:

49.6 fps- 23 fps(HW)-23 fps(DoF)-23 fps(HBAO)= -19.4 fps?

这种明显的负帧速率悖论是由于我们没有在这里比较成本,即使这是我们的意图。使用这些功能的实际成本是一段时间,而不是许多帧。我们的计算是错误的。

以毫秒为单位计算功能成本

让我们尝试毫秒。在没有附加功能的情况下运行游戏,平均每秒可完成约50帧。如何获得以毫秒为单位的每帧成本?

一秒有1000毫秒(ms)。如果游戏能够在1000毫秒内完成50帧,则表示平均一帧花费1000/50 = 20毫秒进行渲染。

启用HairWorks后,游戏每秒产生26帧。这表明我们单帧的时间成本上升到1000/26 = 38.5 ms。

现在,我们正在处理实际时间段,这些时间段可以相互添加。该功能使制作帧所需的时间增加了18.5毫秒。启用三个功能后,我们最终得到:

20毫秒+ 18.5毫秒(硬件)+ 18.5毫秒(DoF)+ 18.5毫秒(HBAO)= 75.5毫秒

启用两个以上功能将导致每帧75.5毫秒。这意味着游戏以大约13 fps的速度运行。

常见的fps速率(以毫秒为单位)

记住这三个帧持续时间值(30、60和90 fps)非常有用:

时间(以毫秒为单位)= 1000 ms /每秒帧

  • 30 FPS = 1000/30 = 33.33毫秒
  • 60 FPS = 1000/60 = 16.67毫秒
  • 90 FPS = 1000/90 = 11.11毫秒

这些代表了各种游戏类别的常见预期刷新率:“电影”冒险(30 fps),快节奏动作游戏(60 fps)和VR产品(90 fps或更高,以减少晕动症)。每个帧速率都会转换为渲染帧所需的最长时间。如果软件超过时间限制,则它会低于所需的刷新率(甚至可能会丢失垂直同步窗口)。

框架故障

上面的值向我们表明,每个游戏每帧都有一定的时间限制。绝对不能超过它。否则,播放器将经历fps下降。

达到30 fps的速度会使引擎留出超过33毫秒的时间来完成所有游戏代码,音频代码和图形渲染。图形方面的工作在CPU和GPU之间进行。CPU充当“经理”的角色,准备数据并向GPU发送命令。后者进行大部分计算。确切的管道在“ GPU和渲染管道”中进行了详细说明。它们(主要)同时工作,允许CPU返回游戏代码,而GPU开始处理网格物体和着色器。这意味着图形卡可以使用此33 ms时间窗口中的大部分时间。

以下屏幕截图显示了虚幻的GPU Visualizer中内置的工具的输出。它将GPU在单个帧上完成的工作分解为特定部分,例如阴影或透明度。测量了几个场景,每个场景针对不同的刷新率进行了优化:30、60和90 fps。

30 fps时的丰富度

30 fps场景可以允许同时使用许多昂贵的功能。它具有很高的透明度,较重的照明(多个具有大半径的动态光源)。在彩条的右侧,您还可以使用3毫秒查看发布过程。

gpuvis_32ms
图: GPU Visualizer显示了33毫秒的帧。

细心但60 fps时还可以

现在请看这张图。该场景必须以60 fps的速度渲染。

gpuvis_16ms
图: GPU Visualizer显示了16毫秒的帧。

现在,引擎必须适应一半的时间-16.67 ms。后期处理时间没有改变(因为它的成本受像素限制)。因此,这里我们仍然要花费3毫秒的​​时间-但现在这是我们可以节省的时间大得多的时间。

您可以轻松地假设,通过完全禁用后期处理,每帧最终将花费12 ms。但这还不足以达到11毫秒的目标-对于Oculus或Vive这样的VR套件,推荐的90 fps。

90 fps的严厉紧缩

gpuvis_11ms
图: GPU Visualizer显示了11毫秒的帧。

该场景可以使用VR套件运行。如您所见,即使后期处理的成本是静态的,但现在为11毫秒,它的意义要大得多(与其他遍历相比)。必须去除所有半透明的材料和颗粒效果。这些削减允许进行完整的后期处理,并且仍然保持相当数量的灯光。

每个渲染过程都有一定的成本,具体取决于场景的内容。我们需要平衡内容和设置,以达到所需的帧速率。正如本章所见,以毫秒为单位进行测量使我们可以轻松进行数学运算。渲染框架所花费的时间只是其各个要素的总和。

诊断的控制台命令

既然我们知道毫秒有多有用,那么我们就可以继续进行实际测量。在游戏或编辑器中有许多命令可以输入。它们可以显示帧时间,对象和纹理统计信息,内存使用情况,甚至可以将数据记录到文件中以供以后检查。

禁用“平滑帧率”

在开始之前,为了准确地测量所有这些,我们必须阻止虚幻引擎将帧速率捕捉到稳定的值,例如30、45、60 fps。

转到项目设置→常规设置→ 帧速率 →并禁用平滑帧速率。“ 平滑帧速率”选项尝试避免帧速率出现瞬时尖峰。这对最终用户的体验很有帮助,因此您可以在最终游戏中再次启用它。但是现在让我们禁用它以获得精确的测量。

输入命令

通过[~]在视口窗口或独立开发版本中按(波浪号)输入基本控制台命令。

该键[~]位于[1]键盘上键的左侧。使用它,然后键入命令,例如:stat fps或stat unitgraph。字母大小写无关紧要。然后按Enter。

要切换命令(例如,隐藏显示的信息),只需再次使用该命令即可。

统计FPS和统计单位

Stat fps向我们显示了fps的最终数量以及渲染最后一帧所花费的时间。这是总时间。但是我们仍然不知道成本是由CPU还是GPU引起的。如前所述,一个必须等​​待另一个。如果CPU需要更多时间来完成游戏,绘图(管理GPU)或物理方面的工作,则在图形卡上进行快速渲染将无济于事。

通过使用stat unit命令,我们可以获得更多具体信息。最后一帧的时间显示为4个数字。

stat_fps stat_unit

  • 帧数与FPS(最终成本)相同。
  • 游戏是CPU在游戏代码上的工作。
  • Draw是CPU为图形卡准备数据时的工作。
  • GPU是在图形卡上渲染帧所花费的原始时间。

在当前帧结束并显示之前,无法开始下一帧的工作。如果其中一个组件比其他组件花费更多的时间,导致Frame超出所需的限制,则它成为瓶颈2。

统计单位图

Stat unitgraph打印相同的信息,但也开始显示图形。在场景中移动或飞行时,此功能很有用,因为它可以更轻松地找到最重的地方或情况。帧速率的下降将清晰可见。

Stat GPU

Stat GPU将渲染帧的时间分成特定的遍。就像是GPU Visualizer(使用调用的图形工具 Ctrl Shift ,)的简化文本版本。关于通行证的章节介绍了每个通行证的含义以及优化技巧。

stat_gpu
图:的输出stat gpu,显示渲染过程的成本。

警告:如果您从stat gpu较旧的NVidia卡上看到一个空窗口,则必须使用一种解决方法。

打开C:Program FilesEpic Gamesyour-versionEngineConfigConsoleVariables.ini。然后转到文件末尾并添加以下两行:

r.NVIDIATimestampWorkaround=0
r.gpustatsenabled=1

Epic Games可能会在较旧的显卡上禁用它,这可能是有原因的。可能会导致稳定性问题。如果要使用解决方法,请记住,后果自负。

统计初始化视图

它有助于衡量阻塞和截锥体剔除的成本和效果。它们都是游戏引擎用来提高性能的技术。它们动态隐藏从相机位置仍然看不见的网格。蒂姆·霍布森(Tim Hobson)在一篇文章中详细讨论了此统计输出的内容以及淘汰本身。

  • 视图可见性,遮挡剔除。执行剔除的成本。
  • 处理的原语。剔除之前考虑的所有对象。
  • 视锥剔除的原语。超出相机视锥范围的对象。
  • 被遮挡的原语。其他较大的物体从相机的视线中隐藏了这些物体。

统计RHI

RHI in stat RHI表示渲染硬件接口3。此命令显示几个唯一的统计信息:

  • 渲染目标内存。显示渲染目标的总权重,例如GBuffer(用于存储有关照明和材质的最终信息)或阴影贴图。缓冲区的大小取决于游戏的渲染分辨率,而阴影则由阴影质量设置控制。在具有各种视频RAM的系统上定期检查此值非常有用,然后相应地调整项目的质量预设。
  • 绘制的三角形。这是三角形的最终数量。在截锥体和遮挡剔除之后。与您的网格物体的多边形数相比,它似乎太大了。这是因为实数包括阴影(“复制”网格以绘制阴影图)和细分。在编辑器中,它也会受到选择的影响。
  • DrawPrimitive调用。绘图调用可能是DirectX 11和OpenGL程序4中的严重瓶颈。它们是由CPU为GPU发布的命令,不幸的是,它们必须由驱动程序5进行翻译。中的此行stat RHI显示了当前帧中发出的绘图调用的数量(仅不包括Slate UI)。这是总价值,因此,除了几何图形(通常是最大的数字)之外,它还包括贴花,阴影,半透明的照明量,后处理等。

其他统计命令

这些stat命令也可能非常有用:

  • stat Foliage。与所有实例化静态网格物体(不仅是树叶)相关的统计信息。显示实例数和三角形总数。
  • stat Landscape。用于渲染所有景观角色的三角形和绘制调用的数量。
  • stat Particles。粒子精灵的数量,以及其他信息。
  • stat LightRendering。照明成本,影响半透明照明栅格的照明数量,阴影投射和无阴影照明。
  • stat ShadowRendering。阴影投射的成本。阴影贴图使用的总内存。

记录性能指标

我们可以将所有指标记录到日志中。我们稍后可以在图形上进行分析。Stat startfile是开始记录数据的命令6。左上角会弹出一条有关日志持续时间的消息。要完成录制,请输入stat stopfile。现在退出游戏,转到窗口→开发人员工具→会话前端,然后从中加载最新文件your projectSavedProfilingUnrealStats。

session_frontend_profiler
图:“会话前端”窗口中的“探查器”选项卡。与GPU分析无关的面板被最小化。

这是同时显示GPU和CPU的配置文件。如果我们对图形分析而不是游戏性感兴趣,则应在侧栏中的“ GPU”类别中查找项目。双击它们会将它们的值绘制为图形上的新线。水平线显示常见fps值的目标。

Author: incg_UE4

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注