切换到宽版
  • 944阅读
  • 0回复

Unreal Engine 4 优化教程第二部分 [复制链接]

上一主题 下一主题
离线天の川
 

由 Errin M. (Intel), Jeff Rous (Intel), IDZSupport K. 发布于 2017 年 4 月 17 日
这是教程的第 2 部分,旨在帮助开发人员提升 Unreal Engine* 4 (UE4) 的游戏性能。本教程对引擎内部和外部使用的一系列工具以及面向编辑器的最佳实践加以了概述,还提供了有助于提高帧速率和项目稳定性的脚本。
编辑器优化
正向与延迟渲染
细节级别
LOD 生成
自动 LOD 生成
LOD 资料
实例化静态网格
分层实例化静态网格
遮挡
级联阴影贴图
编辑器优化
正向与延迟渲染
延迟渲染是 UE4 使用的标准渲染方式。虽然这种方式似乎是最佳的,但我们需要理解一些它对性能的重要影响,尤其是对于 VR 游戏和低端硬件的影响。在这些情况下使用正向渲染可能会更好。
如欲了解更多关于正向渲染的效果,请参阅 Epic 文档。
如果查看 Epic’s Marketplace 中的反射场景,我们可以看见延迟渲染和正向渲染之间一些明显的区别。

图 13:延迟渲染的反射场景

图 14:正向渲染的反射场景
虽然正向渲染会因为反射、照明和阴影而导致丧失视觉保真,但剩余的场景从视觉上看没有改变,而性能的提高也许弥补了这种折衷。
如果我们在英特尔 GPA 帧分析器工具内,使用延迟渲染查看场景的帧捕获,那么我们会看到该场景正在以 103.6 毫秒 (9 fps) 运行,照明和反射占据了大部分持续时间。

图 15:使用英特尔® 高清显卡 530 的延迟渲染捕获反射场景
通过查看正向渲染捕获,我们发现场景运行时间已经从 103.6 毫秒降低到 44.0 毫秒,或者说优化了 259%,其中大部分时间由基础通道和后处理占据,两者均可以进一步优化。

图 16: 使用英特尔® 高清显卡 530 的正向渲染捕获反射场景
细节级别
UE4 内部静态网格拥有成千甚至上万的三角形,可以将 3D 艺术家想要加入他们作品的全部最小的细节展示出来。但是,当玩家远离这种模型时,即使引擎仍然在渲染全部三角形,他们也看不到任何细节。为了解决这个问题并优化游戏,我们可以使用细节级别 (LOD) 将该细节拉近,同时仍显示远处较弱的模型。
LOD 生成
在标准管道下,LOD 由 3D 建模人员在创建该模型时创建。由于这种方法可以对最终外观实现最大控制,UE4 现在加入了可生成 LOD 的极佳工具。
自动 LOD 生成
前往该模型的细节选项卡,可自动生成静态网格 LOD。在LOD Settings 面板选择需要创建的 LOD 数量。

图 17: 创建自动生成的细节级别。
点击 Apply Changes 向引擎发出信号生成 LOD 并编号,使用 LOD0 作为原始模型。从下例中,我们可以看到第 5 个生成的 LOD 将静态网格三角形的数量从 568 降到了 28,这是 GPU 的一个重大优化。

图 18: 三角形和顶点数,以及针对每个细节级别的屏幕尺寸设置。
将 LOD 网格置入场景后,我们会看网格会随着离开镜头而变化。

图 19: 基于屏幕尺寸的细节级别的视觉演示。
LOD 资料
LOD 的另一个特点是每个 LOD 拥有自己的资料,这样我们可以进一步减少静态网格的成本。

图 20: 资料实例适用于所有细节级别。
例如,法线贴图已在业内成为标准。然而,对于 VR 来说却存在一个问题;法线贴图在拉近时并不理想,因为玩家看到的仅是一个平面。
解决该问题的一种方法就是使用 LOD。将 LOD0 静态网格细致化处理到螺栓和螺钉的建模点上,玩家就会在拉近观看时获得更沉浸的体验。因为已对全部细节建模,所以可以免去这一级别应用法线贴图的成本。当玩家远离网格和转换 LOD 时,便会交换法线贴图,同时也减少模型细节。当玩家离得更远时,网格会变得更小,这时可以再一次去除法线贴图,因为它已经小得看不到了。
实例化静态网格
每次在场景中添加任何事物时,都相当于图形硬件的额外绘制调用。如果此物是某一级别的静态网格,则它会应用于该网格的每个副本。如果在某一级别上反复出现几次相同的静态网格,那么进行优化的一种方法是将该静态网格实例化,以减少绘制调用的数量。
例如,下图是由 200 个八面体网格组成的两个球体;一组呈绿色,另一组呈蓝色。

图 21: 静态球体和实例化的静态网格。
绿色组的网格均是标准静态网格,这表示每个网格拥有自己的绘制调用集合。

图 22: 场景中 200 个静态网格球体的绘制调用(最多 569 个)。
蓝色组的网格均是单实例静态网格,这表示这些网格共用一个绘制调用集合。

图 23: 场景中 200 个实例化静态网格球体的绘制调用(最多 143 个)。
查看两组的 GPU 可视化工具,可看到绿色(静态)球体的基础通道持续时长是 4.30 毫秒,而蓝色(实例化)球体的渲染时间是 3.11 毫秒;在本场景中持续时长优化了大约 27%。
关于实例化静态网格须知的一点是,如果该网格的任何部分被渲染,那么整个集合都会被渲染。如果任何部分离开镜头,那么这会浪费潜在的吞吐量。建议在更小的区域内使用单一实例化网格集;例如,一堆石头或垃圾袋、一堆盒子和拉远的模块化建筑。

图 24: 即使看不到大部分实例化网格球体,但它们仍在渲染。
分层实例化静态网格
如果使用了有 LOD 的静态网格集合,则考虑使用分层实例化静态网格。

图 25: 有细节级别的分层实例化网格球体。
像标准实例化网格一样,分层实例减少了网格进行的绘制调用,但分层实体也使用其网格的 LOD 信息。

图 26: 拉近观察有细节级别的分层实例化网格球体。
遮挡
在 UE4 中,遮挡剔除指不渲染玩家看不到的对象的系统。这样会帮助减少对游戏的性能要求,因为不必绘制每一帧每一级的每个对象。

图 27: 八面体分布。
想要看到有绿色边界框的被遮挡对象,可以在编辑器的控制命令台输入 r.VisualizeOccludedPrimitives 1(输入 0 则关闭)。

图 28: 使用 r.VisualizeOccludedPrimitives 1 查看被遮挡网格的边界
是否绘制网格的控制因素与其边界框有关。鉴于此,玩家可能看不到一些绘制的对象,但镜头却能看到边界框。

图 29: 在网格细节窗口查看边界。
如果一个网格需要在被玩家看到前渲染,例如为了获得更多的流时间或让空闲的动画在被看到前渲染,则可以依次进入网络设置窗口中 Static Mesh Settings > Positive Bounds Extension 和 Negative Bounds Extension 增加边界框的大小。

图 30: 设置网格边界范围。
由于复杂网格和形状的边界框总是延展至网格边缘,所以产生空白会导致网格渲染更加频繁。务必要考虑网格边界框将怎样影响场景性能。
我们可以对 3D 模型设计和导入至 UE4 进行思考实验,考虑怎样制作立体布景(罗马圆形大剧场风格的竞技场)。
想象一下,一位玩家正站在竞技场的中央,环顾巨大罗马竞技场,即将降服他的对手。当玩家旋转镜头时,镜头方向和角度会确定游戏引擎正在渲染哪些内容。由于此区域是我们游戏的立体布景,所以该场景布置得十分细致,但为了节省绘制调用,我们需要使用固体碎片制作。首先,我们要抛弃使用一块固体碎片制作竞技场的想法。在本例中,必须绘制的三角形数量等于整个竞技场,因为我们是以单一对象绘制的场景(无论是否在视野范围内)。如何改善模型将其应用到游戏当中呢?
看情况而定。我们的决定会受到一些因素的影响。首先,如何切割切片;第二,这些切片对边界框的遮挡剔除有何影响。例如,玩家为了提高可视度,将镜头角度调到 90 度。
如果我们使用披萨饼型切片,我们可以切出八份完全一样的切片,围绕基准点旋转形成整个竞技场。这种方法比较简单,但远没有达到遮挡的效果,因为存在很多重叠的边界框。如果玩家站在中间环顾四周,他们的镜头始终横跨三个或四个边界,结果导致经常绘制出半个竞技场。最糟糕的情况是,当玩家退回内墙遥望竞技场的时候,八个切片都会渲染而无法优化。
接下来,我们采用井字画法,分成九个切片。这种方法并不是非常正规,但却有一点优势,就是没有重叠边界框。与切披萨的方法相同,当玩家站在竞技场中间时,他们的镜头始终横跨三个或四个边界。然而,在玩家站在内墙时的最糟糕情况下,此时会渲染九个切片当中的六片,相比披萨切法略有优化。
最后一例,我们采用取苹果核的切法(即一个单独的中心块和八块壁切片)。这种方法是思考实验最常见的方法,它造成的重叠少,是建模的好方法。玩家站在中央时会横跨五个或六个边界,但是与其他两种切法不同,这种切法最差的情况是九个切片当中有五个或者六个会被渲染。

图 31: 展示如何切割大型模型,以及如何影响边界框和重叠部分的思考实验。
级联阴影贴图
动态阴影级联可以让游戏的细节级别很高,但同时它也很昂贵,并且需要强大的游戏电脑来运行才不会丢失帧速率。
幸运的是,从其名称中可以看出,这些阴影是以动态形式一帧一帧地创建的,所以玩家可以在游戏中按偏好优化设置。
使用英特尔® 高清显卡 350 动态阴影级联的成本

动态阴影级联的级别可以通过若干方式进行动态控制:
在 Engine Scalability Settings 下进行阴影质量设置
在 BaseScalability.ini 文件下编辑 r.Shadow.CSM.MaxCascades 的整数值(0 至 4),之后更改 sg.ShadowQuality(在 0 至 3 之间设置低、中、高,以及 Epic)
当手动设置 r.Shadow.CSM.MaxCascades 时,在游戏内的蓝图中添加执行控制命令台
Unreal Engine 4 优化教程 第一部分
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
要让让这里成为动漫爱好者温馨的天堂~~
官方qq讨论群140439020  官方微信公众号galaxixv
关于论坛G币的获得方法,请参考论坛公告的帖子
http://www.galaxix.com/bbs/read.php?tid=3158
快速回复
限200 字节
批量上传需要先选择文件,再选择上传
 
上一个 下一个