英特尔软件工程师帮助实施 Unreal Engine* 4.19 优化

Epic Unreal Engine* 4.19 的发布标志着面向英特尔技术的优化翻开了新篇章,尤其是在面向多核处理器的优化方面。过去,游戏引擎在图形特性和性能方面采用控制台设计点。一般而言,多数游戏未针对处理器进行优化,这使得 PC 性能得不到充分发挥。英特尔的 Unreal Engine 4 工作旨在帮助开发人员使用该引擎释放游戏潜能,充分利用 PC 平台的所有处理器计算能力。

英特尔对 Unreal Engine 版本 4.19 的支持工作取得了以下成效:

  • 增加了匹配用户处理器的工作线程的数量
  • 提高了布料物理系统的吞吐量
  • 集成了对英特尔® VTune™ 放大器的支持

每项成效都可帮助 Unreal Engine 用户充分利用英特尔® 架构,发挥多核系统的强大性能。这些成效还有助于改进布料物理、动态断裂、处理器颗粒等系统,增强英特尔 vTune 放大器和 C++ 编译器等英特尔工具的可操作性。本白皮书将详细讨论主要改进,为开发人员考虑使用 Unreal Engine 开发下一款 PC 游戏提供更多理由。

Unreal Engine 历史

1991 年,Tim Sweeney 在就读于马里兰大学期间创立了 Epic MegaGames(后来删除了其中的“Mega”)。他发行的首个作品是ZZT*一款共享软件益智游戏。他使用面向对象的模型在 Turbo Pascal 中编写了这款游戏,该游戏的一大优点是用户可修改游戏代码。那时,关卡编辑器已经非常普遍,但这一优点仍是重要进步。

在随后几年,Epic 发行了多款热门游戏,如《Epic Pinball》*《Jill of the Jungle》*《爵士兔子》*。1995 年,Sweeney 开始开发第一人称射击游戏,发行了多款大获成功的游戏,如《毁灭战士》*《德军总部》*《雷神之锤》*《毁灭公爵》*。1998 年,Epic 推出了可能是当时视效最佳的射击游戏 《Unreal》*,这款游戏具有更细致的图形显示效果,吸引了行业的广泛关注。很快,其他开发人员纷纷来电,表示希望获得 Unreal Engine 许可,以帮助自己开发游戏。

2010 年,在一篇 IGN 文章中,Sweeney 回忆了当时的情景,表示 Epic 团队对于大家的踊跃咨询振奋不已,他们与合作伙伴的早期合作为他们的引擎业务开了个好头。他解释道,他们继续使用“社区驱动方法,支持被许可人与我们的引擎团队进行开放、直接的沟通”。他们始终致力于创建组合工具,消除技术障碍,从而释放游戏社区的巨大创造力。他们还提供广泛的文档和支持,这正是早期引擎通常所缺乏的。

如今,Unreal Engine 支持着游戏行业多数盈利能性良好的游戏。2017 年 3 月,在接受 VentureBeat 采访时,Sweeney 表示开发人员迄今通过 Unreal 游戏已挣得 100 亿美元的收入。Sweeney 表示:“在收入方面,Unreal Engine 的市场份额是排名紧随其后的竞争对手的两倍,不过 Unity* 拥有更多用户。这主要是因为 Unreal 专注于高端市场。在 Steam* 收入最多的前 100 款游戏中,Unreal 游戏的数量超过任何其他可授权引擎竞争对手的总数。”

英特尔帮助完善 Unreal Engine

目前获得 Unreal Engine 许可的游戏开发人员可充分利用本文描述的优化。我们的工作将帮助他们拓展可用平台的范围,支持从具有集成显卡的笔记本电脑和平板电脑到具有独立显卡的高端台式机,从而扩大其游戏的市场份额。这些优化可确保平台提供高端视效,如动态布料和交互式物理特性,帮助最终用户在多数 PC 系统上获得出色效率。此外,优化的英特尔工具将继续助力英特尔® 架构成为首选平台。

英特尔开发人员关系工程师 Jeff Rous 表示,英特尔与 Epic Games 的团队自 20 世纪 90 年代起一直在开展合作。Rous 参与 Unreal Engine 优化工作已有大约 6 年时间,通过电子邮件和电话会议与 Epic 工程师开展了广泛合作和密切沟通,而且每年会拜访 Epic 北卡罗来纳州总部两三次,与 Epic 团队就合作事宜进行为时一周的深入探讨。Rous 参加了一些游戏的开发工作,如 Epic 的游戏《 Fortnite* Battle Royale》,也参加了 Unreal Engine 代码优化工作。

在开始目前的工作之前,英特尔与 Unreal 紧密合作,帮助推出 Unreal Engine 4。英特尔® 开发人员专区提供了一系列优化教程,包括最先推出的Unreal Engine 4 优化教程第一部分。这些教程介绍了开发人员可在引擎内部和外部使用的工具,面向编辑器的一些最佳实践,以及有助于提高项目帧速率和稳定性的脚本。

英特尔® C++ 编译器增强特性

对于 Unreal Engine 4.12,英特尔在公开引擎版本中加入了对英特尔 C++ 编译器的支持。英特尔 C++ 编译器是基于标准的 C 和 C++ 工具,可提升应用性能。它们可无缝兼容其他主流编译器、开发环境和操作系统,并通过高级优化和单指令多数据 (SIMD) 矢量化、与英特尔® 性能库的集成和利用最新 OpenMP* 5.0 并行编程模型,提升应用性能。

Scalar and vectorized loop versions

图 1:标量和矢量化循环版本,具有英特尔® SIMD 流指令扩展、英特尔® 高级矢量扩展指令集和英特尔® 高级矢量扩展指令集 512。

从 Unreal Engine 4.12 开始,英特尔一直非常重视及时更新代码库,对渗透器工作负载的测试表明帧速率获得了显著提升。

纹理压缩改进

Unreal Engine 4 还支持英特尔的快速纹理压缩器。ISPC 代表英特尔® SPMD(单程序,多数据)程序编译器,支持开发人员通过使用代码库轻松实施多核与全新和未来的指令集。在集成 ISPC 纹理压缩库之前,最新、最先进的纹理压缩格式自适应可伸缩纹理压缩 (ASTC) 通常需要数分钟完成每个纹理的压缩。在 Sun Temple* 演示(Unreal Engine 4 示例场景包的一部分)上,相比以前使用的参考编码器,压缩所有纹理的时间从 68 分钟缩短至 35 秒,而且质量也有了显著提升。这有助于内容开发人员更快速构建项目,节省开发人员每周用于这方面工作的时间。

Unreal Engine 4.19 优化

英特尔的 Unreal Engine 4.19 工作可为开发人员提供多种优势。在引擎层面,优化可改善扩展机制和任务处理。引擎层面的其他工作可确保渲染流程不会造成处理器利用率方面的瓶颈。

此外,游戏开发人员使用的许多中间件系统也会受益于优化。物理属性、人工智能、灯光、遮挡剔除、虚拟现实 (VR) 算法、植被、音频和异步计算都将受益于优化。

Unreal Engine 线程模型概述可帮助您了解 4.19 中任务处理系统变化的优势。

Unreal Engine 4 线程模型

图 2 表示时间(从左至右)。游戏线程在所有其他要素前运行,渲染线程比游戏线程慢一帧。现实其他要素在两帧后运行。

Game, render, audio threading model of Unreal Engine 4

图 2:了解 Unreal Engine 4 的线程模型。

物理功产生于游戏线程上,并行执行。动画也将并行评估。在最近的虚拟现实游戏 《机械重装》* 中,并行评估动画取得了良好效果。

图 3 所示的游戏线程可处理游戏设置、动画、物理属性、网络以及最重要的对象运转 (actor ticking) 的更新。

开发人员可使用 Tick Groups 控制对象运转的顺序。Tick Groups 并不提供并行功能,但确实支持开发人员控制相关行为,更高效地安排并行工作。这有助于确保任何并行工作后续不会造成游戏线程瓶颈。

Game thread and related jobs illustration

图 3:游戏线程和相关任务。

如下面的图 4 所示,渲染线程可生成渲染命令发送至 GPU。基本上,该场景将被贯穿,然后命令缓冲区将生成并发送至 GPU。命令缓冲区生成可并行完成,以缩短生成整个场景的命令所需的时间,更快速将项目发送至 GPU。

breaking draw calls into chunks

图 4:渲染线程模型需要将绘制调用划分为片段。

每帧分为逐一实施的相位。在每个相位内,渲染线程可变宽以为其生成命令表:

  • 深度预通道 (prepass)
  • 基础通道
  • 半透明
  • 速率

将帧划分为片段,然后将其分配至 worker 任务,在并行命令表中填充这些任务的结果。然后对它们实施序列化,并用于生成绘制调用。该引擎不会在调用站点连接工作线程,但会在同步点(相位末端)或速度足够快时这些线程被使用的点连接工作线程。

音频线程

主要音频线程类似于渲染线程,用作较低级混合函数的接口,实施以下任务:

  • 评估声音队列图形
  • 构建波实例
  • 处理衰减等

音频线程与所有面向用户的 API(如蓝图和游戏设置)交互。解码和 Source Worker 任务解码音频信息,并处理空间化和头相关转移函数 (HRTF) 解包等任务。(HRTF 对于虚拟现实游戏玩家非常重要,因为该算法可帮助用户检测声音位置和距离的差异。)

该音频硬件线程是依赖单个平台的线程(如 Microsoft Windows* 上的 XAudio2*),该线程可直接渲染至输出硬件并使用 mix。它并非由 Unreal Engine 创建或管理,但优化工作仍将影响线程使用。

任务包括两种:解码和 Source Worker。

  • 解码:解码一批压缩的源文件。使用双重缓冲解码压缩音频以便播放。
  • Source Worker:实施源处理,包括采用率转换、空间化 (HRTF) 和视效。在 INI 文件中,Source Worker 的数量可以配置。
    • 如果您拥有 4 个 worker 和 32 个源,每个 worker 将混合 8 个源。
    • Source Worker 具有高度可并行特征,因此,您可在处理器性能足够强大时增加数量。

《机械重装》 还是首款支持 Unreal Engine 中的全新音频混合与线程系统的游戏。例如,在《机械重装》 中,头相关转移函数占据了近一半的音频时间。

处理器工作线程扩展

在 Unreal Engine 4.19 之前,任务图形上的可用工作线程数量是有限的,且并未将英特尔® 超线程技术考虑在内。这会导致具有 6 个以上内核的系统的所有内核处于闲置状态。在任务图形(Unreal Engine 内部工作调度程序)上创建正确数量的工作线程,有助于内容创作者比以往更有效地扩展视觉增强系统,如动画、布料、破坏和颗粒等。

在 Unreal Engine 4.19 中,任务图形上的工作线程数量根据用户处理器进行计算,根据优先级该数量目前最多为 22:

if (NumberOfCoresIncludingHyperthreads > NumberOfCores)
    {
      NumberOfThreads = NumberOfCoresIncludingHyperthreads - 2;
    }
    否则
    {
      NumberOfThreads = NumberOfCores - 1;
    }

并行工作的首要目的是支持游戏使用所有可用内核。这是成功扩展的基本条件。借助改进的 4.19,内容创作者现在可高效实施扩展,将发烧级处理器充分用于布料物理属性、环境破坏、基于处理器的颗粒和高级 3D 音频等系统。

Hardware thread utilization

图 5:Unreal Engine 4.19 现在有机会利用所有可用的硬件线程。

在上面的性能指标评测示例(使用合成工作负载进行测试)中,基于英特尔® 酷睿™ i7-6950X 处理器的系统 (3.00 Ghz) 实现了充分利用。

破坏优势

多核系统线程利用率的提高能够促进破坏。破坏系统使用任务图形模拟网格分解为更小部分的动态断裂。典型的破坏工作负载包括几秒的大量模拟及随后的恢复至基准。具有更多内核的更强大处理器可通过更多断裂更长时间保持这些更小的部分,从而大幅增强逼真度。

Rous 认为开发人员可对破坏实施更多工作,将其称为使用适当内容提升逼真度的理想目标。他表示:“我们可以轻松扩展破坏,具体方法包括更频繁地分割网格,并在较长时间后在更强大的处理器上删除断裂片段。由于破坏通过物理引擎在工作线程上实施,因此处理器不会成为渲染瓶颈,直到许多系统同时运行。”

Simulation of dynamic fracturing of meshes

图 6:破坏系统可模拟网格分解为更小部分的动态断裂。

布料系统优化

布料系统用于通过动态 3D 网格动画系统增强角色和游戏环境的逼真度,这种系统可快速响应玩家、风或其他环境因素。游戏中的典型布料应用包括玩家披风或旗帜。

布料系统越逼真,游戏体验的沉浸感越强。一般而言,支持的布料系统越多,游戏场景越逼真。

开发人员长期面临着提升布料系统逼真度的挑战。如果逼真度不足,角色只能穿着紧身服装,服装随风摆动的场景毫无真实感。然而,布料系统建模面临重重困难。

早期的布料系统设计工作

德州农工大学的 Donald House 表示,Jerry Weil 在 1986 年推出了首个重要的布料模拟计算机图形模型。House 和其他专家讲授了剖析“基于计算机图形的布料和服装”的课程,详细介绍了 Weil 的工作。House 表示,Weil 开发了“一种纯几何方法模拟织物挂在约束点的情景”。Weil 的模拟过程包括两个阶段。首先,使用悬链曲线在几何上模拟布料表面,生成由约束点组成的三角形。然后,应用迭代松弛法,插入原始悬链交叉点以确保平面光滑。通过应用一次全面的近似和松弛法,然后依次轻微移动约束点,再次应用松弛阶段,这种静态悬垂模型也可表示动态行为。

大约在同一时间,连续模型出现,其使用物理布料行为建模方法。这些早期模型采用了连续表示法,将布料建模为弹性板。1987 年,Carl R. Feynman 的硕士论文 首次探讨了这一领域的工作,他描述了在栅格图示上叠加连续弹性模型的情况。由于模拟网格大小方面的问题,使用连续技术实施的布料建模方法难以捕捉真实布料的复杂折叠和翘起行为。

颗粒模型广受欢迎

1992 年,颗粒模型开始受到关注。这年,David Breen 和 Donald House 开发了 一种面向布料的非连续交互颗粒模型。House 曾指出,该模型可通过交互颗粒系统布料“清晰再现布料的微机械结构”。他解释道,开发这一模型的原因是,他们发现布料“相当于是由交互机械部件组成的机制,而不仅仅是一种物质,细线之间的微机械交互具有宏观动态属性”。1994 年,Breen/House 模型被证明可用于准确再现特定材料的褶状特征,自此得到了大规模推广。1996 年,Eberhard、Weber 和 Strasser 根据该模型取得了一项重大成就。他们使用 Breen/House 模型提出的基础能源方程的拉格朗日力学重组,开发了可用于力学计算的常微分方程系统。

这一动态网格模拟系统现已成为主流模型。它可即时响应玩家、风或其他环境因素,增强相关特征的逼真度,如玩家披风或旗帜。

为改进布料系统,Unreal Engine 已经过多次升级;例如在版本 4.16 中,APEX Cloth* 被 NVIDIA 的 NvCloth* 解算器取代。这种低级服装解算器负责颗粒模拟,确保服装的逼真度与集成的轻便和可扩展特征,以便今天的开发人员直接访问数据。

更多三角形,更高逼真度

在 Unreal Engine 4.19 中,英特尔工程师与 Unreal Engine 团队紧密合作,进一步优化布料系统,以提高吞吐量。布料模拟的处理与其他物理对象相似,在任务图形的工作线程上实施。这有助于开发人员在多核处理器上扩展内容,并避免瓶颈。通过这些改变,场景中的布料模拟数量增加了近 30%。

每一帧都可模拟布料,即使玩家并未看着特定点;模拟结果将决定布料系统是否出现在玩家视野中。大约相同数量的布料模拟逐帧使用处理器(假设未添加更多系统)。它易于预测,开发人员可调整所使用的数量以适应可用的扩展空间。

Examples of cloth systems

图 7:Content Examples 项目中的布料系统示例。

为便于本文中的图表说明,布料对象在每个网格中使用了 8,192 个模拟三角形,而且在捕捉数据时均位于视口中。所有数据均在英特尔® 酷睿 ™ i7-7820HK 处理器上捕捉。

 processor Usage

图 8:Unreal Engine 4 各版本之间的处理器使用有所不同,具体取决于场景中布料系统的数量。

 frames per second

图 9:Unreal Engine 4 各版本之间的每秒帧数有所不同,具体取决于场景中布料系统的数量。

增强的处理器颗粒

颗粒系统在计算机图形和视频游戏中的使用可追溯到早期阶段。因为运动是真实生活的重要特征,所以这些系统具有关键作用,通过颗粒建模创建爆炸、火球、云系统和其他事件对于实现全面沉浸感至关重要。

处理器颗粒可用的高质量特性包括:

  • 发光
  • 材料参数控制
  • 吸引器模块

协同使用处理器系统和 GPU 系统可增强多核系统上的颗粒。这类系统易于扩展,开发人员可持续添加处理器工作负载,直到扩展空间耗尽。工程师发现,将处理器颗粒搭配 GPU 颗粒可增强光线投射,支持光线从接触的对象上弹起,从而提升逼真度。每个系统都有其固有局限性,因此这种搭配能够产生优于部件简单组合的系统。

processor particles emitting light

图 10:处理器颗粒可根据可用的扩展空间轻松扩展。

英特尔® VTune™ 放大器支持

英特尔 VTune 放大器是一种行业标准工具,可用于确定线程瓶颈、同步点和处理器热点。Unreal Engine 4.19 增加了对英特尔 vTune 放大器 ITT 标记的支持。这种支持将帮助用户生成注释处理器跟踪数据,提供引擎在所有时间的运行情况的深度信息。

ITT API 具有下列特性:

  • 根据您收集的跟踪数据数量控制应用性能开销。
  • 支持简单的跟踪收集,无需重新编译应用。
  • 支持 C/C++ 和 Fortran 环境中的应用。
  • 支持通过仪表化跟踪应用代码。

用户可启动英特尔 vTune 放大器,借助 -VTune 交换机在 UI 中运行 Unreal Engine 工作负载,从而充分利用这一新功能。进入该工作负载后,您只需在控制台上键入 Stat Namedevents,便可开始将 ITT 标记输出以支持跟踪。

Intel VTune Amplifier trace in Unreal Engine 4.19

图 11:Unreal Engine 4.19 中的带注释英特尔 vTune 放大器跟踪示例。

结论

相关改进解决了各个层面的技术挑战,包括引擎、中间件、游戏编辑器和游戏本身。引擎改进并不局限于单款游戏,而是能够造福整个 Unreal 开发人员生态系统。4.19 的进步解决了生态系统面临的下列处理器工作负载挑战:

  • 得益于每个对象的更多断点,增强了破坏的逼真度。
  • 增加了颗粒数量,改善了对象动画效果,如植被、布料和粉尘。
  • 增强背景特征的逼真度。
  • 增加布料系统的数量。
  • 改进颗粒(例如,与角色、NPC 和环境进行物理交互)。

随着更多的最终用户迁移至强大的多核系统,英特尔计划继续实施增加内核数量的路线图。任何受限于线程的系统或存在瓶颈的操作都受到团队的关注。开发人员应 下载最新版 Unreal Engine,经常访问英特尔开发人员专区,及时了解相关信息。

更多资源

Unreal Engine* 4 优化指南

面向布料模拟的处理器优化

设置 Destructive Mesh

CPU 扩展示例

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