ARM 在Unity3D 中的美术优化解决方案 2, 几何体

2,几何体 - 简介

在本教程中,我们将简要介绍本项目的学习目标 - 优化移动 3D 应用程序中的几何体。

1.概述

3D 移动应用程序中的大多数对象很可能都是使用几何体表示的。几何体是需要处理的最常见的数据,因此有必要仔细考虑其实现和优化。本项目将重点介绍 3D 模型优化,以在保持美学意图的同时,让游戏更加高效,从而改善在移动设备上的性能和体验。在本项目中,你将:

  • 了解几何体的基本组成部分及其对游戏性能的影响。

  • 了解如何使用细节级别实现模型,以在保持对象可见性的同时提高性能。

  • 考虑有助于在手机的小屏幕上表现 3D 模型精细细节的其他常见技术和最佳实践。

2.什么是几何体?

几何体(即多边形网格)是构成 3D 对象形状的顶点、边和面的集合。该网格可以是汽车、环境对象、角色或 3D 应用程序中显示的任何类型的资源。

下图显示了构成 3D 对象几何体的三个元素:

  • 顶点是构成 3D 对象表面的点。

  • 边使用直线连接两个顶点。

  • 三角形由通过三条边彼此连接的三个顶点组成。三角形的其他术语包括多边形和面。

(注意:在 3ds Max、Maya、Blender 等 3D 软件中,经常会用到一种称为四边形的多边形。在这些 3D 程序中,四边形更容易修改和使用。在屏幕上渲染时,所有这些多边形都显示为三角形。)

3.总结

顶点、边和三角形结合在一起,就形成了 3D 几何体。几何体可以像上面显示的立方体一样简单,也可以像包含数千个面的结构一样复杂。在构建 3D 应用程序时,考虑场景中几何体对性能的影响非常重要。在下一个教程中,我们将深入讨论优化构成多边形网格的顶点、边和三角形的实用方法。

三角形和多边形的使用量

在本教程中,你将了解在 3D 模型中使用三角形时如何以最佳方式优化性能并保持视觉保真度。

1.概述

要优化应用程序的性能,就必须了解在任何给定时间屏幕上显示的三角形数量。

使用最少的三角形以在 3D 模型的预期质量与提供一致性能之间取得适度平衡至关重要。

下图显示了两个 3D 对象的对比。一个对象使用了 584 个三角形,另一个对象使用了 704 个三角形。在 Shaded 模式下,两个对象看起来是一样的。这说明可以移除模型中不影响轮廓的任何边缘。

在 Unity 中,网格索引缓冲区的格式决定了 3D 对象可以使用的最大顶点数:

  • 一个 16 位的索引缓冲区最多支持 65,535 个顶点。

  • 一个 32 位的索引缓冲区最多支持 40 亿个顶点。

使用较少的三角形时,需要 GPU 处理的顶点数也较少。在为移动平台制作内容时,这一点尤为重要,因为处理顶点的计算成本很高。减少要处理的顶点数量可提高整体性能,让你的应用程序能够在更多的设备(而不仅仅是拥有最强大 GPU 的设备)上运行。

2.在不同的硬件/屏幕大小上进行测试

请在尽可能多的目标设备上查看或测试你的应用程序,这一点非常重要。只在计算机屏幕上测试应用程序无法为你提供进行优化所需的信息。

请记住,移动设备的屏幕小于普通计算机的显示屏。因此,在移动设备上可能看不到使用大量三角形的细节。最佳做法是在离摄像机较近的 3D 对象上使用较多的三角形,在处于背景中的 3D 对象上使用较少的三角形。

在下图中,前景中使用了 3D 模型,而将质量较低的 3D 模型烘焙到了 2D 背景中:

虽然没有明确规定屏幕上最多可以显示多少个三角形,但同时显示在屏幕上的 3D 对象越多,每个对象可以使用的三角形就越少。如果要在屏幕上显示的 3D 对象较少,则可以为每个对象使用更多的三角形。

此外,目标设备也很重要。与较旧的移动设备相比,较新的硬件通常能够处理更复杂的几何体。

3.重要区域的细节

在移动平台上,多边形和顶点的计算成本都很高。只有将多边形放置在确实有助于提高应用程序视觉质量的区域才不会造成处理预算的浪费。

大多数移动设备的屏幕尺寸较小,再加上 3D 对象在应用程序中的位置的原因,可能无法看到 3D 对象上的许多小三角形细节。这意味着,你应该专注于构成对象轮廓的较大形状和部分,而不是可能看不见的小细节。

下图用红色突出显示了对象的轮廓,以显示不同形状对它的影响。

在屏幕上不常显示的区域中使用较少的三角形。例如,汽车底盘或衣柜背面。

避免使用高密度三角形网格对小细节进行建模。应该使用纹理和法线贴图来实现精细的细节。

(注意:法线贴图是存储每个像素表面方向的纹理贴图。)

下面的图像显示了相同的网格在使用和不使用法线贴图时的样子:

考虑删除在画面中根本看不到的对象背面或底部。但是,需要谨慎执行该操作,因为这可能会限制场景的重用性。例如,如果删除了桌子网格的底部,就意味着不能再上下颠倒该模型或作为其他用途。

4.避免使用微三角形

微三角形指的是对物体或场景的最终外观没有多大用处的小三角形。

当将具有大量多边形的 3D 对象移离摄像机时,会出现微三角形问题。微三角形通常是指大小在 1-10 个像素之间的三角形。

微三角形非常小、看不见,但处理起来计算成本很高。

下图显示了一个 3D 对象靠近摄像机时使用的三角形数量(右)和其远离摄像机时使用的三角形数量(左)。

在下图中,突出显示区域中的大部分三角形由于太小而无法在移动设备上看到。因此,它们对最终外观没有多大作用:

下图突出显示了远看时柱子的斜面。当近距离观看时,斜面是没有问题的:

可以采取以下几个步骤来缓解该问题:

  • 对于与摄像机的距离会发生改变的对象,可以使用细节级别 (LOD) - 将在下一个教程中介绍。当对象距离较远时,使用正确的 LOD 可以简化该对象。

  • 在背景对象上使用较少的三角形。

  • 避免使用多边形创建更精细的细节。而应结合使用纹理和法线贴图。

  • 避免在具有细长三角形的对象上使用有光泽的材质,这会导致闪烁。

  • 合并所有太小而无法在屏幕上看到或对最终图像没有太大价值的顶点或三角形。

  • 确保三角形的内部区域大于其边缘。从技术上讲,最好让三角形接近等边。

  • 尽量让三角形的面积保持在 10 个像素以上。

  • 尽可能移除对象上的所有细长三角形。

尽量少用微三角形有多方面的原因。

  • GPU 必须处理所有的三角形和顶点,即使是对最终场景没有任何价值的三角形和顶点,这会浪费不必要的 GPU 算力。

  • 当必须将更多数据发送到 GPU 进行处理时,内存带宽会受到负面影响。

  • 所需的处理量会影响移动设备的电池寿命。因此,更少的数据意味着更长的电池寿命。

5.总结

通过尽量减少场景中的三角形数量以将注意力集中在重要的区域,可以全面提高应用程序的性能,使其可在低端移动设备上运行。在下一个教程中,我们将讨论细节级别 (LOD) 及其如何帮助进一步优化几何体。

细节级别

在本教程中,你将了解细节级别 (LOD) 有助于在不同距离处突出显示 3D 模型细节同时优化应用程序性能的不同用例。

1.概述

借助细节级别 (LOD),你可以根据对象到摄像机的距离控制为场景中每个对象渲染的顶点数量。这样做可提高应用程序的性能。

此外,LOD 还能避免上一个教程中讨论的远处对象的微三角形问题。我们建议你为每一个在应用程序运行期间与摄像机的距离会发生改变的 3D 对象提供 LOD。

下图显示了如何使用 LOD 管理降低 3D 模型的复杂性,同时在模型移离摄像机时保留适当的细节级别:

在使用 LOD 时,请牢记以下几点:

  • 当减少三角形数量时,我们需要关注三角形将如何影响对象的轮廓。

  • 在较平坦的区域移除更多的多边形。

  • Mipmap 在功能上相当于纹理的 LOD,应与模型配合使用。我们稍后将在纹理项目中介绍 Mipmap

  • LOD 也可用于降低着色器的复杂性。对于更远处的 3D 对象,可以进行着色器和材质优化。例如,当对象远离摄像机时,可以减少其使用的纹理数量。

2.何时不使用 LOD

在某些情况下,不适合使用 LOD。例如,在摄像机视图和对象都是静态的或对象已使用较少的多边形的应用程序中,应避免使用 LOD。

LOD 必须保存网格数据以便实时使用,因此会带来内存开销和更大的文件大小。

下图显示了一个未使用 LOD 的场景(因为该场景是静态的)。在这种情况下,可以使用其他优化技巧,例如移除对玩家不可见的多边形:

3.为什么使用 LOD

当对象移离摄像机时,其细节会变得不那么明显。在 20 米远的地方,很难看出有 200 个三角形的对象与有 2,000 个三角形的对象有什么区别。你肯定不希望使用超出场景实际需要的三角形数量,因此使用 LOD 是一种优化应用程序而不带来显著影响的好方法。使用 LOD 的其他好处包括:

  • 减少了必须处理的三角形数量,因此可提高性能。

  • LOD 有助于缓解微三角形带来的问题。

观察下图可以发现,即使远处对象具有不同的多边形数,看起来也是一样的:

4.适当的三角形数量

在使用 LOD 时,请牢记以下几点:

  • 将每个 LOD 级别之间的三角形数量减少 50% 通常是值得的。

  • 不要在 LOD 较低的对象上使用密集三角形区域。它们仅在对象靠近时可见。

  • 查看 LOD 在距摄像机不同距离处的样子。较低的 LOD 意味着近距离观看时分辨率较低,但对于离摄像机较远的对象来说是可以接受的。

下图显示了每个级别的多边形数量下降 50% 时对象的外观:

下图显示了靠近观察 LOD 较低的对象时的样子。它看起来不怎么细致,但在离摄像机较远时,它的外观还是可以接受的:

如果不在 LOD 较低的对象上减少足够的多边形数量,会对应用程序的性能产生负面影响。这是因为 GPU 必须处理超出实际需要的顶点数量。

但是,如果在降低较低 LOD 对象的多边形数量时过于激进,对象的细节会实时地突然出现和突然消失。这可能会破坏用户的体验。

5.LOD 级别数

对象应具有的 LOD 数量没有明确规定。这取决于对象的大小和重要性。例如,动作游戏中的角色或赛车游戏中的汽车可以从使用更多的 LOD 级别获益,而不是像树这样较小的背景对象。

如果使用的 LOD 级别太少,就无法带来太大的性能提升。而且,如果级别之间的多边形缩减量跳动幅度过大,则在切换 LOD 时会显得十分突兀。如果使用的 LOD 级别太多,又会影响应用程序的性能。

此外,随着 LOD 的增多,内存使用量也会增加,因为必须在某个地方存储更多的网格,这会导致文件变大。但最大的成本是你的时间,特别是你以手动方式创建每个级别时。

6.创建 LOD 网格

使用 3D 软件手动创建 LOD 网格时,可以移除循环边或减少对象上的顶点数。虽然这可以给你更多的控制权,但可能需要更长的时间才能完成。

自动创建 LOD 网格时,可以使用内置修改程序或单独的 LOD 生成软件。内置修改程序有 3ds Max 中的 ProOptimizer、Maya 中的 Generate LOD Meshes 功能等。

7.总结

使用 LOD 网格是在对象与摄像机的距离发生改变时尽可能减少对象上的多余几何体来优化应用程序的巧妙方法。在下一个教程中,我们将介绍针对移动应用程序优化几何体的更多最佳实践。

更多的几何体最佳实践

本教程介绍在确定按何种顺序优化移动应用程序中的几何体时的更多最佳实践。

1.概述

除了先前教程中给出的建议外,创建模型时还应牢记一些注意事项。以下建议并不特定于任何一种 3D 内容创作工具,它们适用于任何项目。

2.平滑组

使用平滑组或自定义顶点法线定义边缘的硬度和改变模型的外观。当美术设计有意使用少量多边形时,平滑组有助于创建更好的着色。

平滑组会影响模型的 UV 岛(基本上是模型的块)以及进行烘焙时法线贴图的质量,因此要格外小心。

如果是对 3D 模型进行了平滑处理,则必须将其从 3D 软件中导出并导入到 Unity 中。

下图显示了将平滑应用于对象时的样子:

3.网格拓扑

在使用网格拓扑时,请牢记以下提示:

  • 创建 3D 资源时,请保持拓扑合理、整洁。

  • 整洁的拓扑对于变形或进行了动画处理的角色和对象至关重要。

  • 不要痴迷于实现完美的拓扑。应用纹理和材质后,玩家或终端用户是看不到 3D 模型线框的。

下图显示了使用简单几何体和拓扑的岩石峭壁网格的线框。应用材质后,峭壁看起来好多了。

4.形状夸大

形状夸大是指将对象的某些部分做得比正常的大,以帮助提高可见性。这种方法是否适合你的游戏,取决于所制作游戏的风格。

移动设备的屏幕很小,有时可能难以捕获某些极小的形状。夸大形状有助于克服这一问题。例如,将角色的手做得大一些,以便在小屏幕上更容易看到它们。

下图显示了一个夸大了手部的角色。手、剑、身体比例都以不同方式进行了强调。这样做是为了提高可见性,同时保持较低的多边形数量:

5.合并网格

为了减少渲染所需的绘制调用次数,可以使用 Mesh.CombineMeshes() 方法将多个网格合并成一个。如果所有网格共用相同的材质,则将 mergeSubMeshes 参数设置为 true,以便从合并组中的每个网格生成一个子网格。将多个网格合并为一个较大的网格有助于:

  • 创建更有效的遮挡物。

  • 将基于瓦片的资源转变为一个大型、无缝的实体资源。

要应用该技术,请执行以下操作:

  1. 在 Hierarchy 中创建一个空游戏对象,并让它成为要合并的网格的父对象。

  1. 将一个实现 Mesh.CombineMeshes() 的脚本附加到该父游戏对象上。

根据场景的构成,实现该方法对于优化性能可能很有用。通常,大网格比小网格在视野中停留的时间要长,因此请通过实验获得正确的尺寸。

6.模型设置
  • 不要导入不进行动画处理的 FBX 网格模型上的动画数据:在导入不包含任何动画数据的 FBX 网格时,请在 Import Settings 的 Rig 选项卡中,将 Animation Type 设置为 None。当将网格放入 Hierarchy 时,该设置将确保 Unity 不会生成未使用的动画器(Animator)组件。

  • 避免读/写网格:如果在运行时修改了模型,Unity 会在内存中保留网格数据的副本,以便在保留原始数据的情况下进行修改。如果未在运行时修改模型,请在 Import Settings 的 Model 选项卡中禁用 Read/Write Enabled 选项,以避免创建副本。

  • 静态/动态批处理:静态批处理是一种常见的优化技术,可减少绘制调用的次数。对于由大量在渲染期间不会移动、旋转或缩放的顶点组成的对象来说,它是理想的选择。动态批处理适用于顶点数较少的对象,并且参与批处理的对象在渲染期间不得移动、旋转或缩放。要启用静态批处理,请在 Inspector 中选中 Static。动态批处理适用于顶点数较少的移动对象。

7.总结

优化网格拓扑、合并网格、夸大形状和配置模型设置都是可用于提高应用程序性能的技术。在下一个教程中,我们将通过一个 Unity 示例项目介绍 LOD 技术。

演示:细节级别(LOD)

细节级别 (LOD) 是一种有用的工具,可在优化性能的同时保持 3D 模型所需的美感。在本演示中,你将能够试验在该项目中学到的想法,分析和比较 LOD 与非 LOD 实现的性能。

1.使用 LOD 减少顶点数量

在上一个教程中,你了解了在 3D 模型上实现细节级别 (LOD) 的好处。在 3D 场景中使用 LOD 可减少移动设备 CPU 需要处理的顶点数量,同时保持视觉保真度。

在本示例场景中,你将分析和测量使用 LOD 与非 LOD 模型的性能差异。

2.开始之前

请在此处下载包含示例演示的课程项目。弹出提示时,单击 Geometry Demo,或在 Project 视图中打开示例场景 (Assets > 1 Models > Scene > Scene 1)。下载并打开场景后,可以在编辑器中进入运行模式,也可以将场景构建到移动设备上以在性能分析器(Unity Profiler)中进行性能分析。

3.要观察的内容

示例场景包含整齐排列的塔楼阵列。一部 Cinemachine 摄像机在塔楼间移动,聚焦越来越远的塔楼。场景中有两个可供试验的开关:

  • 通过 Change LOD multiplier 滑动条,你可以设置场景中模型的 LOD 偏差。滑动条越高,给定模型的 LOD 切换距离的乘数越大。

  • Switch Mode 按钮可将场景中的所有模型在非 LOD 与 LOD 实现之间进行切换。

使用 LOD 可减少游戏处理的顶点数量,同时保持视觉保真度。因此,在 LOD 与非 LOD 模型之间切换时,请留意 Stats 窗口中当前处理的顶点数,以及 Profiler 视图中 Rendering 部分的 Vertices 图。

在对示例场景进行性能分析时,可能不会看到 CPU 使用率发生明显变化。我们鼓励你将项目构建到移动设备上,并使用 Unity 性能分析器对其进行性能分析。当从 LOD 切换到非 LOD 模型时,会对 CPU 使用率产生什么样的影响?

4.总结

在使用和创建 3D 模型时,请始终牢记优化。借助 LOD 等内置功能以及在本项目中学到的提示和技巧,现在你有了一系列的优化工具。在下一个项目中,我们将深入研究纹理(可以使用它为模型增加细节)。

猜你喜欢

转载自blog.csdn.net/Kaitiren/article/details/129682910