65.9K
CodeProject 正在变化。 阅读更多。
Home

如何使用 Unity* 规划优化

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2014年1月17日

CPOL

19分钟阅读

viewsIcon

21008

本文档为 Unity 新老用户在构建关卡/游戏时提供性能考量,并介绍新的构建方法。

摘要

Unity 提供了许多工具和设置来帮助游戏流畅运行。在此项目中,我们选择了一些我们认为可能存在问题的工具和设置,并分析了它们对 Intel® 图形处理器游戏性能的影响。

我们设身处地从一个学习使用 Unity 的游戏开发者的角度出发。我们希望遇到性能瓶颈,然后确定如何通过 Unity 内置的性能机制来解决问题。Unity 的优势之一是能够快速创建内容,但在考虑性能时,尤其是在移动和平板设备上,开发者需要放慢脚步,规划如何利用内置的性能机制。本文档为 Unity 新老用户在构建关卡/游戏时提供性能考量,并介绍新的构建方法。

介绍 

在 Unity 中创建游戏相对简单。Unity 提供了一个商店,您可以在其中购买网格、预编写的脚本、游戏演示甚至完整游戏。就我的测试而言,我关心的是修改现有游戏,找出可以或不可以实现性能提升的领域。我深入研究了 Unity Tech Demo,名为 Boot Camp,可在资源商店免费下载,看看我能遇到什么麻烦。

我使用了 Unity 3.0 来创建游戏设置并运行所有场景。测试是在配备 Intel® HD Graphics 4000 的第三代 Intel® Core™ 处理器计算机上进行的。测试结果不适用于移动设备。

质量经理

Unity 为游戏提供了额外的渲染设置,位于:Edit->Project Settings->Quality 菜单(图 1)。这些是可自定义的渲染设置,可根据个人需求进行修改。Unity 提供了有用的在线文档,解释了质量设置是什么以及如何通过 Unity 的脚本 API 修改这些设置。

图 1. 通过 Edit->Project Settings->Tag inspector 可用的标签和层

关于我寻找 Unity 优化任务,我决定尝试一些质量设置,看看能找到什么增益或损失,尽管我没有测试所有可用的选项。

纹理质量

质量设置检查器有一个下拉菜单,您可以在其中选择纹理的渲染分辨率。您可以选择 1/8、¼、½ 或全分辨率。为了查看不同纹理分辨率之间的性能增益/损失,我捕获了示例场景的帧率,测试了 Unity 的所有默认质量设置(最快、快速、良好等),并在每次捕获时仅调整纹理质量。图 2 和图 3 显示了 1/8 纹理分辨率和全分辨率场景的对比。

图 2. Unity* Boot Camp 场景以 1/8 分辨率运行

图 3. Unity* Boot Camp 场景以全分辨率运行

更改纹理分辨率后,我们使用 Intel® Graphics Performance Analyzers (Intel® GPA) 捕获了每秒帧数 (FPS)。查看“Fantastic”设置(表 1),可以看到通过改变纹理尺寸,性能没有太大变化。

表 1. 说明切换 Unity* 提供的纹理质量时 FPS 的变化

虽然 Intel® 图形处理器 PC 的性能不受纹理尺寸变化的影响,但还有其他因素需要考虑,例如设备上的总内存量及其应用程序的使用情况。

阴影距离


阴影距离是一个设置,用于更改用于游戏对象阴影的摄像机的剔除距离。摄像机在阴影距离值范围内的游戏对象的阴影将被发送以进行渲染,而不在阴影距离值范围内的对象则不会绘制其阴影。

根据使用的设置,阴影由于其所需的处理量可能会对性能产生负面影响。为了测试阴影距离的影响

  • 设置一个示例场景
  • 将场景设置为 Unity 默认质量设置
  • 逐步调整阴影距离并使用 Intel GPA 捕获 FPS
  • 选择不同的 Unity 默认质量设置并重复阴影距离捕获

此测试未使用“最快”和“快速”质量级别,因为它们默认关闭阴影。

图 4. 这是在 Edit->Project Settings->Quality 的 Inspector 菜单下找到的设置

图 5. Unity* Tech Demo Boot Camp

表 2. 更改 Unity* Tech Demo Boot Camp 的阴影距离时的 FPS 结果

阴影对性能有显著影响。数据显示,在简单模式下,从距离 0 到 50,FPS 下降了近一半。重要的是要考虑游戏对象是否能被实际看到,并确保您没有不必要地绘制阴影。阴影距离和其他阴影设置可以通过 Unity 脚本在游戏过程中进行控制,并可适应多种情况。尽管我们只测试了阴影距离的影响,但我们预计在更改质量设置中“阴影”下的其他设置时,也会出现类似的性能差异。

图层

Unity 中的所有游戏对象在创建时都会被分配到一个层。它们最初被分配到默认层,如图 6 所示,但您可以创建自己的唯一层。有两种方法可以做到这一点。您可以简单地点击“Layer”旁边的框并选择“Add New Layer”。您也可以转到 Edit->Project Settings->Tags。

图 6. 在游戏对象 Inspector 中找到的层菜单

图 7. 通过 inspector 菜单访问的 Tag Manager

在 inspector 窗口(图 7)中,您可以创建一个新层并指定要将其分配给哪个层编号。这两种方法都会将您带到同一个 Tag Manager 窗口。创建层后,可以通过在该游戏对象的 inspector 窗口的“Layer”旁边的选项框中选择所需的层来将其分配给游戏对象。这样,您可以将对象分组到公共层中以便将来使用和操作。请记住层是什么以及如何创建和修改它们,以便我稍后在本文中讨论一些其他层特性。

层剔除距离

在 Unity 中,您的摄像机不会渲染超出摄像机裁剪平面的游戏对象。通过 Unity 脚本,可以设置特定层具有更短的裁剪平面。

图 8. 取自 Unity* 在线文档的示例脚本,演示如何修改层的剔除距离

要设置游戏对象以使其具有较短的剔除距离,需要做一些工作。首先,将对象放在一个层上。然后,编写一个脚本来修改单个层的剔除距离并将其附加到摄像机。图 8 中的示例脚本显示了如何创建一个大小为 32 的浮点数组,以对应于 Edit->Project Settings->Tags 下可创建的 32 个可能层。修改数组中某个索引的值并将其分配给 camera.layerCullDistances 将更改相应层的剔除距离。如果您不为索引分配数字,则相应层将使用摄像机的远裁剪平面。

为了测试 layerCullDistances 带来的性能提升,我设置了三个场景,分别填充了小型、中型和大型对象。场景布置了许多相同的游戏对象,将它们分组并逐个远离摄像机。我使用 Intel GPA 在每次增量增加层剔除距离时捕获 FPS,每次增加一组对象到捕获中,即第一个捕获包含一组对象,而第六个捕获包含六组对象。

图 9、10 和 11 展示了用于测试不同类型对象的场景。

靴子:多边形 – 278 顶点 – 218

图 9. 测试场景,填充了低多边形和低顶点数的靴子对象

霸王龙:多边形 – 4398 顶点 – 4400

图 10. 测试场景,填充了中等面数和顶点数的恐龙对象

飞机:多边形 - 112,074 顶点 - 65,946

图 11. 测试场景,填充了高多边形和高顶点数的飞机对象

表 3、4 和 5 显示了所测试场景的 FPS 变化。

表 3. 从靴子场景(图 9)收集的数据

表 4. 从恐龙场景(图 10)收集的数据

表 5. 从飞机场景(图 11)收集的数据

表 6. 所有测试场景的“Fantastic”模式数据

这些数据表明,使用 Unity 中的 layerCullDistances 功能可以实现性能提升。

表 6 说明屏幕上对象的数量如何影响性能,尤其是在复杂对象方面。作为一名游戏开发者,如果使用得当,layerCullDistances 功能对于性能非常有利。例如,具有复杂网格且距离摄像机较远的小对象可以设置为仅当摄像机足够近以便区分这些对象时才绘制。在规划和设计关卡时,开发者需要考虑网格复杂性和摄像机远处对象的可视性等因素。通过提前规划,您可以从使用 layerCullDistances 中获得更大的好处。

相机

我研究了 Unity 的摄像机,重点关注其设置和功能。我尝试了一些 GUI 下的选项,并检查了其他功能和附加组件。

图 12. 选择摄像机时出现的 Inspector 菜单

当创建一个新场景时,默认情况下只有一个标记为 *Main Camera* 的摄像机游戏对象。要创建或添加另一个摄像机,请首先创建一个空的GameObject,方法是转到:GameObject->Create Empty。然后选择新创建的空对象并添加摄像机组件:Components->Rendering->Camera。

Unity 的摄像机在其 GUI 中具有丰富的功​​能,如图 12 所示。我选择探索的功能是:渲染路径和 HDR。

渲染路径

渲染路径告诉 Unity 如何处理游戏中的光照和阴影渲染。Unity 提供三种渲染类型,从成本最高到最低依次为:Deferred(仅限 Pro)、Forward 和 Vertex Lit 渲染。每种渲染器处理光照和阴影的方式略有不同,它们需要不同量的 CPU 和 GPU 处理能力。了解您要开发的平台和硬件很重要,这样您就可以选择一个渲染器并相应地构建您的场景或游戏。如果您选择的渲染器不受图形硬件支持,Unity 将自动将渲染路径降低到较低保真度。

图 13. Player Settings Inspector 窗口

渲染路径可以通过两种方式设置。第一种是在 Edit->Project Settings->Player(图 13)下。您会在“Others Settings”选项卡下找到“Rendering Path”下拉框。第二种是从 Camera Inspector GUI(图 14)设置。选择“Use Player Settings”以外的任何内容都将覆盖您在玩家设置中设置的渲染路径,但仅限于该摄像机。因此,可以拥有多个摄像机使用不同的渲染缓冲区来绘制光照和阴影。

图 14. 在 Camera GUI 下选择 Rendering Path 时的下拉框

开发者应该知道 Unity 包含这些不同的光照渲染路径以及它们如何处理渲染。本文档结尾处的参考部分提供了指向 Unity 在线文档的链接。确保您了解目标受众以及他们期望他们的游戏在哪个平台上运行。这些知识将帮助您选择适合平台的渲染路径。例如,一个使用大量光源和图像效果、采用延迟渲染的游戏,在低端显卡计算机上可能会难以运行。如果目标受众是休闲玩家,他们可能没有处理能力强大的显卡,这也会成为一个问题。开发者需要了解他们期望游戏在其上运行的目标平台,并相应地选择光照和渲染路径。

HDR(高动态范围) 

在正常渲染中,每个像素的红色、蓝色和绿色值由 0 到 1 之间的十进制数字表示。通过限制 R、G 和 B 颜色的值范围,光照将显得不真实。为了获得更自然的照明效果,Unity 有一个名为 HDR 的选项,激活后,允许表示像素 R、G 和 B 的数值超过正常范围。HDR 创建了一个支持超出 0 到 1 范围的值的图像缓冲区,并执行后期处理图像效果,如辉光和镜头光晕。完成后期处理效果后,新创建的图像缓冲区中的 R、G 和 B 值将通过 Unity Image Effect Tonemapping 重置为 0 到 1 范围内的值。如果包含 HDR 时未执行色调映射,像素可能会超出正常可接受的范围,并导致场景中的某些颜色与其他颜色相比显得错误。

使用 HDR 时,请注意一些性能问题。如果使用 Forward 渲染场景,HDR 仅在存在图像效果时才有效。否则,开启 HDR 将不起作用。使用 Deferred 渲染支持 HDR,无论是否有图像效果。

如果场景正在使用 Deferred 渲染并且图像效果已附加到摄像机,则应激活 HDR。图 15 比较了带有图像效果和延迟渲染的场景,HDR 开启和 HDR 关闭时的绘制调用数。在包含图像效果时,HDR 关闭的绘制调用数比包含图像效果且 HDR 开启的绘制调用数要多。在图 15 中,绘制调用的数量由单个蓝色条表示,每个蓝色条的高度揭示了每次绘制调用花费的 GPU 时间。

图 15. Intel® Graphics Performance Analyzers 的捕获,HDR OFF 显示超过 2000 个绘制调用,而 HDR ON 的捕获略多于 900 个绘制调用。

请阅读 Unity 的 HDR 文档,了解它如何影响游戏性能。您还应该知道何时使用 HDR 合理,以确保您获得其全部优势。

图像效果

Unity Pro 附带一系列图像效果,可增强场景的外观。即使在创建项目后,也可以通过转到 Assets->Import Package->Image Effects 来添加图像效果资源。导入后,有两种方法可以将效果添加到摄像机。单击您的摄像机游戏对象,然后在摄像机 GUI 中,选择 Add Component,然后选择 Image Effects。您也可以通过转到 Component->Image Effect 从菜单系统中单击您的摄像机对象。

SSAO – 屏幕空间环境光遮蔽

屏幕空间环境光遮蔽 (SSAO) 是 Unity Pro 的 Image Effect 包中包含的一项图像效果。图 16 显示了关闭 SSAO 和开启 SSAO 的场景的区别。图像看起来相似,但性能明显不同。没有 SSAO 的场景以 32 FPS 运行,而带有 SSAO 的场景以 24 FPS 运行,下降了 25%。

图 16. 同一关卡对比,SSAO 关闭(上)vs. SSAO 开启(下)

添加图像效果时要小心,因为它们可能会对性能产生负面影响。本文档中我们仅测试了 SSAO 图像效果,但预计其他图像效果也会出现类似的结果。

遮挡剔除

遮挡剔除不仅禁用摄像机裁剪平面外的对象渲染,还禁用被其他对象隐藏的对象渲染。这对性能非常有益,因为它减少了计算机需要处理的信息量,但设置遮挡剔除并不直接。

    遮挡物 (Occluder) – 被标记为遮挡物的对象充当屏障,阻止被标记为被遮挡物 (Occludee) 的对象被渲染。

    被遮挡物 (Occludee) – 将游戏对象标记为被遮挡物将指示 Unity 在被遮挡物遮挡时不要渲染游戏对象。

例如,房子里的所有对象都可以标记为被遮挡物,而房子本身可以标记为遮挡物。如果玩家站在房子外面,所有被标记为被遮挡物的房子里面的对象都不会被渲染。这节省了 CPU 和 GPU 处理时间。

Unity 对遮挡剔除及其设置进行了文档记录。您可以在参考部分找到设置信息的链接。

为了展示使用遮挡剔除带来的性能提升,我设置了一个场景,其中有一堵墙,墙后面隐藏着高度复杂的网格对象。我使用了遮挡剔除和未使用遮挡剔除的场景进行了 FPS 捕获。图 17 显示了具有不同帧率的场景。

图 17. 左侧图像没有遮挡剔除,场景需要额外时间来渲染墙后的所有对象,导致 FPS 为 31。右侧图像利用了遮挡剔除,因此隐藏在墙后的对象不会被渲染,导致 FPS 为 126。

遮挡剔除需要开发人员进行大量手动设置。他们还需要在游戏设计中考虑遮挡剔除,以使游戏配置更容易,并带来更大的性能提升。

细节级别 (LOD)

细节级别 (LOD) 允许将多个网格附加到游戏对象,并能够根据摄像机距离在对象使用的网格之间进行切换。这对于距离摄像机非常远且复杂的游戏对象非常有利。LOD 可以自动简化网格以进行补偿。有关如何使用和设置 LOD 的信息,请参阅 Unity 的在线文档。链接在参考部分。

为了测试 LOD 带来的性能提升,我构建了一个包含一群房屋的场景,并为它们附加了 3 种不同的网格。站在同一个位置,我捕获了房屋附加最复杂网格时的 FPS。然后我修改了 LOD 距离,使下一个较低的网格出现,并进行了另一次 FPS 捕获。我对三种网格级别进行了此操作,并将我的发现记录下来,如表 5 所示。

图 18、19 和 20 展示了三种不同复杂度的网格以及每个网格的多边形和顶点数。

最佳质量 – LOD 0

Building A
  • 顶点 – 7065
  • 多边形 – 4999
Building B
  • 顶点 - 5530
  • 多边形 – 3694

图 18. LOD 级别 0。这是设置的最高 LOD 级别,带有
更复杂的建筑网格
中等质量 – LOD 1

Building A
  • 顶点 – 6797
  • 多边形 – 4503
Building B
  • 多边形 - 5476
  • 顶点 – 3690

图 19. LOD 级别 1。LOD 规模的下一步;此级别设置为
中等复杂度的网格
低质量 – LOD 2

Building A
  • 顶点 – 474
  • 多边形 – 308
Building B
  • 多边形 - 450
  • 顶点 – 320

图 20. LOD 级别 2。此 LOD 级别是最后使用的级别,包含
复杂度最低的建筑网格


当我切换不同的 LOD 模型时,我捕获了 FPS 进行比较(表 7)。

表 7. LOD FPS 对比,在较低模型网格之间切换

表 7 显示了设置和使用 LOD 带来的性能提升。FPS 捕获显示使用较低质量网格时性能有显著提升。然而,这可能需要 3D 美工付出大量额外工作,他们必须制作多个模型。游戏设计师需要决定花费额外的时间制作更多模型是否值得性能提升。

批处理

大量的绘制调用会增加 CPU 开销并降低性能。屏幕上的对象越多,需要进行的绘制调用就越多。Unity 有一个名为 Batching 的功能,可以将游戏对象合并为一个绘制调用。Static Batching 影响静态对象,Dynamic Batching 用于移动的对象。如果满足所有要求(参见 Batching 文档),Dynamic Batching 会自动发生,而 Static Batching 需要手动创建。

对于 Dynamic 和 Static Batching,对象进行合并绘制有一些要求,所有这些要求都在 Unity 的 Batching 文档中涵盖,该文档列在参考部分。

为了测试 Static Batching 的性能提升,我设置了一个包含复杂飞机游戏对象的场景(图 21),并捕获了有和没有 Batching 的飞机的 FPS(表 8)。


图 21. Static Batching 测试场景,填充了非常复杂的飞机网格

表 8. 显示了测试场景(图 21)打开和关闭静态批处理时 FPS 和绘制调用的差异

Unity 的批处理机制有两种形式:Dynamic 和 Static。要充分发挥批处理的优势,请计划将尽可能多的对象合并到单个绘制调用中。请参考 Unity 的批处理文档,并了解什么对象符合动态或静态批处理的条件。

结论 

虽然 Unity 相对容易上手和开发,但也很容易陷入性能困境。Unity 提供了许多工具和设置来帮助游戏流畅运行,但并非所有这些工具都像其他工具那样直观且易于设置。同样,Unity 也有一些设置,当开启或不当使用时,可能会对游戏性能产生负面影响。使用 Unity 进行开发的一个重要部分是在开始之前制定计划,因为一些性能功能需要手动设置,并且如果在项目创建时未计划好,实现起来会更加困难。

参考文献

质量设置文档
https://docs.unity3d.org.cn/Documentation/Components/class-QualitySettings.html

质量设置脚本 API
https://docs.unity3d.org.cn/Documentation/ScriptReference/QualitySettings.html

技术演示 Bootcamp
http://u3d.as/content/unity-technologies/bootcamp/28W

细节级别文档
https://docs.unity3d.org.cn/Documentation/Manual/LevelOfDetail.html

遮挡剔除文档
https://docs.unity3d.org.cn/Documentation/Manual/OcclusionCulling.html

批处理文档
https://docs.unity3d.org.cn/Documentation/Manual/DrawCallBatching.html

渲染路径文档
https://docs.unity3d.org.cn/Documentation/Manual/RenderingPaths.html

Intel GPA
http://software.intel.com/en-us/vcsource/tools/intel-gpa

其他相关内容和资源

Unity 多点触控源(终于)
http://software.intel.com/en-us/blogs/2013/05/01/the-unity-multi-touch-source-finally

使用 Unity3D 和 Touchscript 实现多点触控手势
http://software.intel.com/en-us/articles/implementing-multiple-touch-gestures-using-unity-3d-with-touchscript

Unity3D 中的多线程感知计算应用
http://software.intel.com/en-us/blogs/2013/07/26/multithreading-perceptual-computing-applications-in-unity3d

Unity3D Touch GUI 小部件
http://software.intel.com/en-us/articles/unity-3d-touch-gui-widgets

关于作者

John Wesolowski,实习生

我在 Intel 工作的团队的重点是使 Intel® 芯片组支持即将推出的技术,重点是电子游戏。我们的任务是测试最新和即将推出的电子游戏,以找出 Intel® 架构或电子游戏中的潜在错误或改进领域。

工作之余,我一直最喜欢的活动是在线玩 Halo* 2 和我的朋友们,但由于微软关闭了所有原始 Xbox* 游戏的 Xbox LIVE* 服务,我和我的朋友们只要有可能就会玩 LAN Halo 2。我也喜欢玩扑克和放风筝。我目前就读于加州州立大学蒙特利湾分校,攻读计算机科学与信息技术学位。

Intel 和 Intel 标志是 Intel Corporation 在美国和/或其他国家/地区的商标。

版权所有 © 2013 英特尔公司。保留所有权利。

*其他名称和品牌可能被声明为他人的财产。

© . All rights reserved.