您想找什么?
Hero background image
面向技术艺术家的移动优化技巧 - 第一部分

您将从此页面获得什么: 针对使用 Unity 的移动游戏开发者的艺术资产优化技巧。这是第一个两篇关于移动游戏美术优化的文章。

您可以在这本全面的电子书有关移动应用程序的 3D 艺术优化的Unity Learn课程中找到许多其他移动优化技巧

机器人角色的 3D 渲染
关注轮廓

在移动平台上,多边形和顶点的计算成本都很昂贵。将多边形放置在真正有助于应用程序视觉质量的区域,这样就不会浪费处理预算。

由于大多数移动设备的屏幕尺寸较小,并且 3D 对象在应用程序中的位置,3D 对象上的许多小三角形细节可能不可见。这意味着您应该关注构成物体轮廓的较大形状和部分,而不是可能看不见的小细节。使用纹理和法线贴图来获得精细的细节。

LOD 示例
使用细节级别 (LOD)

当物体移到远处时, 细节级别 (LOD) 可以调整或切换它们以使用更简单的网格、更简单的材质和着色器来提高 GPU 性能。

更多 LOD 准备技巧

  • 移除较平坦区域上的更多多边形,并且不要在 LOD 较低的对象上使用三角形的密集区域。
  • LOD 也可以应用于着色器复杂性。可以针对较远的 3D 对象优化着色器和材质。例如,当物体远离相机时,您可以减少其使用的纹理数量。
  • 通常值得将每个 LOD 级别之间的三角形数量减少 50%。
  • 检查 LOD 在距离相机不同距离处的样子。
  • 清晰的拓扑对于变形或动画的角色和物体至关重要。
  • 不要过分追求完美的拓扑结构。一旦应用了纹理和材质,玩家或最终用户将看不到 3D 模型的线框。

何时不使用 LOD

LOD 并不适用于所有情况。例如,避免在摄像机视图和对象都是静态的应用程序中使用它,或者在对象已经使用低多边形数量的应用程序中使用它。LOD 会带来内存开销和更大的文件大小,因为必须保存网格数据以便实时使用。

Unity 中的遮挡
组合网格并隐藏对象

您可以将多个网格合并为一个,以减少渲染所需的绘制调用次数。要应用此技术,请在层次结构中创建一个空的游戏对象 (GameObject),并使其成为要组合的网格的父级,然后将实现方法 Mesh.CombineMeshes() 的 脚本附加到父游戏对象 (GameObject) 上。

使用遮挡剔除

隐藏在其他物体后面的物体仍有可能渲染并耗费资源。使用遮挡剔除来丢弃它们。

虽然摄像机视图之外的视锥剔除是自动的,但遮挡剔除是一个烘焙过程。只需将您的对象标记为 静态遮挡物静态被遮挡物,然后通过 窗口 > 渲染 > 遮挡剔除 对话框进行烘焙。虽然并非每个场景都需要剔除,但在许多情况下剔除可以提高性能。请参阅 使用遮挡剔除 教程以了解更多信息。

将模型导入 Unity
导入模型

在导入模型时,请记住以下一些小贴士。

  • 动画类型:导入不包含任何动画数据的 FBX 网格时,请在导入设置的 Rig 选项卡中将动画类型设置为无。当您将网格放入层次结构时,此设置将确保 Unity 不会生成未使用的 Animator 组件。
  • 禁用装备和 BlendShapes:如果您的网格不需要骨骼或混合形状动画,请尽可能禁用这些选项。
  • 禁用法线和切线:如果您绝对确定网格材质不需要法线或切线,请取消选中这些选项以获得额外的节省。
  • 导入设置如果您的模型在运行时未被修改,请从导入设置的模型选项卡中禁用读/写启用选项,以防止在内存中创建副本。
  • 静态/动态批处理:静态批处理是一种常见的优化技术,可以减少绘制调用的次数。它非常适合由大量顶点组成的对象,这些对象在渲染过程中不会移动、旋转或缩放。在包含目标模型的网格渲染器的检查器 (Inspector) 中检查静态 (Static)。
纹理压缩比较
纹理大小和颜色空间

纹理的大小可以不同。减小需要较少细节的纹理的尺寸将有助于减少带宽。例如,可以将漫反射纹理设置为 1024 x 1024,并将相关的粗糙度/金属图设置为 512 x 512。尽力有选择地减小纹理尺寸,并始终检查之后是否有任何视觉效果下降。

大多数纹理软件使用 sRGB 颜色空间来处理和导出纹理。

我们建议您在 sRGB 颜色空间中使用漫反射纹理。未被处理为颜色的纹理不得位于 sRGB 颜色空间中。这些纹理的示例包括金属、粗糙度和法线贴图,因为贴图用作数据而不是颜色。在这些地图中使用 sRGB 将导致材质上出现错误的视觉效果。

注意:确保检查器窗口中的 sRGB(颜色纹理)设置在粗糙度、镜面反射、法线贴图或类似项目旁边没有勾选。

屋顶瓦片上的纹理细节
将细节融入纹理

可以烘焙环境光遮蔽和小镜面高光等元素,然后将其添加到漫反射纹理中。这种方法意味着您不必过多依赖计算成本昂贵的着色器和 Unity 功能来获得镜面高光和环境光遮蔽。

有色灰度纹理演示
有色灰度纹理

只要有可能,就使用允许在着色器中进行颜色着色的灰度纹理。这样可以节省纹理内存,但需要创建自定义着色器来执行着色。使用此技术时要谨慎,因为并非所有物体使用此方法看起来都很好。将其应用于具有统一颜色的物体会更容易。

纹理过滤双线性和三线性比较
纹理过滤

纹理过滤通常可以提高场景中的纹理质量,但也会降低性能,因为获得更好的纹理质量通常需要更多的处理。纹理过滤有时可占到 GPU 能耗的一半。选择更简单、更合适的纹理过滤器可以帮助减少应用程序的能量需求。

  • 最近/点过滤:这是最简单、计算强度最低的纹理过滤形式,但近距离观察时,这种过滤会使纹理显得块状。
  • 双线性过滤:双线性过滤对纹理中相邻纹素进行采样并取平均值以获得彩色像素。与最近滤波不同,双线性滤波会产生较少的块状像素,因为像素具有平滑的梯度。双线性过滤的副作用是近距离观察时纹理会显得模糊。
Unity 编辑器上的 Sprite Atlas
纹理大小和颜色空间

您的大部分内存可能会用于纹理,因此此处的导入设置至关重要。一般来说,导入资产时请尝试遵循这些准则。

  • 降低最大尺寸:使用产生视觉上可接受结果的最低设置。这是非破坏性的并且可以快速减少您的纹理内存。
  • 使用 2 的幂 (POT):Unity 要求移动纹理压缩格式 (PVRCT 或 ETC) 的 POT 纹理尺寸。
  • 为您的纹理贴图:将多个纹理放入单个纹理中可以减少绘制调用并加快渲染速度。使用 Unity Sprite Atlas 或第三方 TexturePacker来对您的纹理进行图集制作。
  • 关闭“读/写启用”选项:启用后,此选项会在 CPU 和 GPU 可寻址内存中创建副本,使纹理的内存占用量加倍。大多数情况下,保持此功能禁用。如果你在运行时生成纹理,请通过以下方式强制执行 纹理2D。申请,将 makeNoLongerReadable 设置为 true
  • 禁用不必要的 mipmap:对于在屏幕上保持一致大小的纹理(例如 2D 精灵和 UI 图形),不需要 Mipmap。对于与相机距离不同的 3D 模型,请保持 mipmap 处于启用状态。
  • 使用双线性过滤:这将有助于在性能和视觉质量之间取得平衡。
  • 选择性地使用三线性过滤:它比双线性滤波需要更多的内存带宽。
  • 使用双线性和 2x 各向异性过滤:选择这些而不是三线性和 1x 各向异性,以改善外观和性能。
  • 保持较低的各向异性水平:仅对关键游戏资产使用高于 2 的级别。
压缩纹理比较
压缩纹理

对 iOS 和 Android 使用自适应可扩展纹理压缩 (ATSC)。正在开发中的绝大多数游戏都倾向于针对支持 ATSC 压缩的最低规格设备。唯一的例外是:

  • 针对 A7 或更低版本的设备的 iOS 游戏(例如 iPhone 5、5S 等):使用PVRTC
  • 针对 2016 年之前设备的 Android 游戏:使用爱立信纹理压缩 (ETC2)
纹理通道
使用纹理通道将多个纹理打包成一个

纹理通道打包有助于节省纹理内存,因为您可以将三个贴图放入一个纹理中。这意味着更少的纹理采样器。这种方法通常用于将粗糙度、光滑度和/或金属度打包到一个纹理中。它还可以应用于任何纹理蒙版。例如,您还可以存储 alpha 掩码。具有透明度的图像可能需要更大的内存占用,因为它们需要 32 位格式,但通过使用空闲通道来存储 alpha 蒙版,您可以将漫反射纹理保持在 16 位,从而有效地将文件大小减半。

使用绿色通道存储最重要的蒙版。绿色通道通常具有更多的位数,因为我们的眼睛对绿色更敏感,对蓝色不太敏感。

Probuilder 中的手动 UV 纹理
UV 展开

UV 贴图将 2D 纹理投射到 3D 模型的表面上。UV 展开是创建 UV 贴图的过程。

  • 最佳做法是保持 UV 岛(展开纹理的各个单元)尽可能笔直,以便更容易地打包 UV 岛并减少浪费的空间。直线 UV 也有助于防止纹理的阶梯效应。
  • 在移动平台上,纹理空间有限。因此,纹理尺寸通常比控制台或 PC 上的要小。良好的 UV 包装可确保您从纹理中获得最高的分辨率。
  • 考虑通过保持 UV 笔直来使 UV 稍微扭曲,以获得更高质量的纹理。
  • 在某些情况下,您需要夸大并突出边缘和阴影以提高形状的可读性。由于移动平台通常使用较小的纹理,因此可能很难捕捉到小空间内所需的所有细节。
  • 对于移动应用程序,使用较少的纹理并将任何额外的细节烘焙到一个纹理中。这很重要,因为最好将一些细节烘焙到漫反射纹理本身上,以确保这些细节在小型移动屏幕上可见。
您喜欢本文吗?
是的!
还行。