上篇: /u013716859/article/details/125588600
6. 项目配置
有一些项目设置会影响您的移动性能。
降低或禁用加速度计频率
Unity 每秒数次汇集您手机的加速度计。 如果它没有在您的应用程序中使用,请禁用它,或降低其频率以获得更好的性能。
禁用不必要的播放器或质量设置
在 Player 设置中,为不受支持的平台禁用 Auto Graphics API 以防止生成过多的着色器变体。 如果您的应用程序不支持旧 CPU 的目标体系结构,请禁用它们。
在质量设置中,禁用不需要的质量级别。
禁用不必要的物理
如果您的游戏没有使用物理,请取消选中 Auto Simulation 和 Auto Sync Transforms。 这些只会减慢您的应用程序而没有明显的好处。
选择正确的帧速率
移动项目必须平衡帧速率与电池寿命和热节流。 与其以 60 fps 的速度推动设备的极限,不如考虑以 30 fps 的速度运行作为折衷方案。 Unity 在移动设备上默认为 30 fps。
您还可以在运行时使用 Application.targetFrameRate 动态调整帧速率。 例如,对于慢速或相对静态的场景,您甚至可以将 fps 降至 30 以下,并为游戏保留更高的 fps 设置。
避免大层次结构
拆分你的层次结构! 如果您的游戏对象不需要嵌套在层次结构中,请简化父级。 较小的层次结构受益于多线程刷新场景中的变换。 复杂的层次结构会导致不必要的转换计算和垃圾收集的更多成本。
请参阅优化层次结构和这个 Unite 演讲,了解转换的最佳实践。
Transform一次,而不是两次
此外,在移动变换时,使用 Transform.SetPositionAndRotation 一次更新位置和旋转。 这避免了两次修改变换的开销。
如果你需要在运行时实例化一个游戏对象,一个简单的优化是在实例化期间进行父级和重新定位:
GameObject.Instantiate(prefab, parent);GameObject.Instantiate(prefab, parent, position, rotation);
有关 Object.Instantiate 的更多详细信息,请参阅脚本 API。
假设启用了垂直同步
移动平台不会渲染半帧。 即使您在编辑器中禁用垂直同步(项目设置 > 质量),也会在硬件级别启用垂直同步。 如果 GPU 不能足够快地刷新,当前帧将被保留,从而有效地降低您的 fps。
7. 资产
资产管道可以极大地影响您的应用程序的性能。 经验丰富的技术艺术家可以帮助您的团队定义和实施资产格式、规范和导入设置。
不要依赖默认设置。 使用特定于平台的覆盖选项卡来优化纹理和网格几何体等资产。 不正确的设置可能会产生更大的构建大小、更长的构建时间和较差的内存使用率。 考虑使用预设功能来帮助自定义特定项目的基线设置,以确保最佳设置。
有关更多详细信息,请参阅艺术资产最佳实践指南,或查看 Unity Learn 上有关移动应用程序的 3D 艺术优化的本课程。
正确导入纹理
您的大部分内存可能会用于纹理,因此此处的导入设置至关重要。 一般来说,请遵循以下准则:
降低最大尺寸:使用产生视觉上可接受的结果的最小设置。 这是非破坏性的,可以快速减少纹理内存。使用二的幂 (POT):Unity 需要移动纹理压缩格式(PVRCT 或 ETC)的 POT 纹理尺寸。为贴图制作图集:将多个纹理放置到一个纹理中可以减少绘制调用并加快渲染速度。 使用第三方 Texture Packer 的 Unity Sprite Atlas 来为您的纹理贴图。关闭 Read/Write Enabled 选项:启用后,此选项会在 CPU 和 GPU 可寻址内存中创建一个副本,使纹理的内存占用量增加一倍。 在大多数情况下,请保持禁用此功能。 如果您在运行时生成纹理,请通过 Texture2D.Apply 强制执行此操作,将 makeNoLongerReadable 设置为 true。禁用不必要的 Mip 贴图:在屏幕上保持一致大小的纹理不需要 Mip 贴图,例如 2D 精灵和 UI 图形(为与相机距离不同的 3D 模型启用 Mip 贴图)。
压缩纹理
考虑使用相同模型和纹理的这两个示例。 左侧的设置消耗的内存几乎是右侧的八倍,但在视觉质量方面并没有太大的好处。
对 iOS 和 Android 使用自适应可扩展纹理压缩 (ATSC)。 开发中的绝大多数游戏都针对支持 ATSC 压缩的最低规格设备。
唯一的例外是:
针对 A7 或更低设备(例如 iPhone 5、5S 等)的 iOS 游戏 – 使用 PVRTC针对 年之前的设备的 Android 游戏 - 使用 ETC2(爱立信纹理压缩)如果 PVRTC 和 ETC 等压缩格式的质量不够高,并且您的目标平台不完全支持 ASTC,请尝试使用 16 位纹理而不是 32 位纹理。
有关按平台推荐的纹理压缩格式的更多信息,请参阅手册。
调整网格导入设置
就像纹理一样,如果不仔细导入,网格可能会消耗过多的内存。 要最小化网格的内存消耗:
压缩网格:Aggressive压缩可以减少磁盘空间(但是,运行时的内存不受影响)。 请注意,网格量化可能会导致不准确,因此请尝试压缩级别以查看适用于您的模型的方法。禁用读/写:启用此选项会在内存中复制网格,将网格的一个副本保留在系统内存中,另一个保留在 GPU 内存中。 在大多数情况下,您应该禁用它(在 Unity .2 及更早版本中,默认情况下会选中此选项)。禁用绑定和 BlendShapes:如果您的网格不需要骨架或 blendshape 动画,请尽可能禁用这些选项。如果可能,禁用法线和切线:如果您确定网格的材质不需要法线或切线,请取消选中这些选项以节省额外费用。
检查您的多边形数量
更高分辨率的模型意味着更多的内存使用和可能更长的 GPU 时间。 您的背景几何图形是否需要 50 万个多边形? 考虑减少您选择的 DCC 包中的模型。 从相机的角度删除看不见的多边形。 使用纹理和法线贴图来获得精细细节,而不是使用高密度网格。
使用 AssetPostprocessor 自动化您的导入设置
AssetPostprocessor 允许您在导入资产时运行脚本。 这允许您在导入模型、纹理、音频等之前和/或之后自定义设置。
使用可寻址资产系统
Addressable Asset System 提供了一种简化的方式来管理您的内容,通过“地址”或别名加载 AssetBundle。 这个统一的系统从本地路径或远程内容交付网络 (CDN) 异步加载。
如果您将非代码资产(模型、纹理、预制件、音频甚至整个场景)拆分为 AssetBundle,您可以将它们分离为可下载内容 (DLC)。
然后,使用 Addressables 为您的移动应用程序创建一个较小的初始构建。 Cloud Content Delivery 让您可以在玩家进行游戏时托管和交付您的游戏内容。
单击此处查看可寻址资产系统如何减轻资产管理的痛苦。
8. 图形和 GPU 优化
每一帧,Unity 都会确定必须渲染哪些对象,然后创建绘图调用。 绘制调用是对图形 API 的调用以绘制对象(例如三角形),而批处理是要一起执行的一组绘制调用。
随着您的项目变得越来越复杂,您将需要一个优化 GPU 工作负载的管道。 通用渲染管线 (URP) 目前使用单通道前向渲染器为您的移动平台带来高质量的图形(延迟渲染将在未来的版本中提供)。 来自主机和 PC 的相同基于物理的照明和材料也可以扩展到您的手机或平板电脑。
以下指南可以帮助您加快图形速度。
批量绘制调用
将要绘制在一起的对象批量化可最大限度地减少批量绘制每个对象所需的状态更改。 这通过降低渲染对象的 CPU 成本来提高性能。 Unity 可以使用多种技术将多个对象组合成更少的批次:
动态批处理:对于小型网格,Unity 可以在 CPU 上对顶点进行分组和变换,然后一次性将它们全部绘制出来。 注意:仅当您有足够的低多边形网格(少于 900 个顶点属性且不超过 300 个顶点)时才使用此选项。 动态批处理器不会批处理比这更大的网格,因此启用它会浪费 CPU 时间,每帧都在寻找要批处理的小网格。静态批处理:对于非移动几何体,Unity 可以减少任何共享相同材质的网格的绘制调用。 它比动态批处理更有效,但它使用更多内存。GPU instancing:如果您有大量相同的对象,则此技术使用图形硬件更有效地对它们进行批处理。SRP 批处理:在 Universal Render Pipeline Asset 中的 Advanced 下启用 SRP Batcher。 这可以显着加快 CPU 渲染时间,具体取决于场景。
使用帧调试器
帧调试器显示了每个帧是如何从单独的绘制调用构造的。 这是对着色器属性进行故障排除的宝贵工具,可以帮助您分析游戏的渲染方式。
帧调试器的新手? 在此处查看此介绍。
避免过多的动态灯光
与传统的前向渲染器相比,URP 减少了绘制调用的数量。 避免向您的移动应用程序添加过多的动态灯光。 考虑一些替代方案,例如用于动态网格的自定义着色器效果和光照探针,以及用于静态网格的烘焙光照。
关于 URP 和 Built-in Render Pipeline 实时灯光的具体限制,请参见此功能对照表。
禁用阴影
可以根据 MeshRenderer 和光照禁用阴影投射。 尽可能禁用阴影以减少绘制调用。
您还可以使用应用于角色下方的简单网格或四边形的模糊纹理来创建假阴影。 或者,使用自定义着色器创建斑点阴影。
将您的光照烘焙到光照贴图中
使用全局照明 (GI) 为您的静态几何图形添加戏剧性的照明。 使用 Contribute GI 标记对象,以便您可以以光照贴图的形式存储高质量的光照。
烘焙的阴影和光照可以在运行时渲染而不会影响性能。 Progressive CPU 和 GPU Lightmapper 可以加速全局光照的烘焙。
请按照手册指南和这篇关于优化光照的文章来帮助您开始使用 Unity 中的光照贴图。
使用灯光层
对于具有多个灯光的复杂场景,使用图层分离对象,然后将每个灯光的影响限制在特定的剔除蒙版上。
使用 Light Probe 移动物体
Light Probes 存储有关场景中空白空间的烘焙照明信息,并提供高质量的照明(直接和间接)。 他们使用球谐函数,与动态光相比,它的计算速度非常快。
使用细节级别 (LOD)
随着对象向远处移动,细节级别可以将它们切换为使用更简单的网格和更简单的材质和着色器来帮助 GPU 性能。
有关更多详细信息,请参阅 Unity Learn 上的使用 LOD 课程。
使用 Occlusion Culling 移除隐藏的对象
隐藏在其他对象后面的对象仍然可能会渲染和消耗资源。 使用遮挡剔除来丢弃它们。
虽然相机视图之外的截锥体剔除是自动的,但遮挡剔除是一个烘焙过程。 只需将您的对象标记为静态遮挡物或遮挡物,然后通过“窗口”>“渲染”>“遮挡剔除”对话框进行烘焙。 尽管并非适用于所有场景,但在许多情况下,剔除可以提高性能。
查看使用遮挡剔除教程了解更多信息。
避免移动原生分辨率
手机和平板电脑变得越来越先进,更新的设备具有非常高的分辨率。
使用 Screen.SetResolution(width, height, false) 降低输出分辨率并恢复一些性能。 分析多个分辨率以在质量和速度之间找到最佳平衡。
限制使用相机
每个摄像机都会产生一些开销,无论它是否在做有意义的工作。 仅使用渲染所需的相机组件。 在低端移动平台上,每个摄像头最多可以使用 1 毫秒的 CPU 时间。
保持着色器简单
Universal Render Pipeline 包括几个轻量级的 Lit 和 Unlit 着色器,它们已经针对移动平台进行了优化。 尽量保持着色器变化尽可能小,因为这会对运行时内存使用产生巨大影响。 如果默认 URP 着色器不能满足您的需求,您可以使用 Shader Graph 自定义材质的外观。 在此处了解如何使用 Shader Graph 直观地构建着色器。
最小化过度绘制和 alpha 混合
避免绘制不必要的透明或半透明图像。 移动平台受到由此产生的过度绘制和 alpha 混合的极大影响。 不要重叠几乎不可见的图像或效果。 您可以使用 RenderDoc 图形调试器检查过度绘制。
限制后处理效果
全屏后处理效果(如glows)会显着降低性能。 在标题的艺术指导中谨慎使用它们。
小心 Renderer.material
在脚本中访问 Renderer.material 会复制材质并返回对新副本的引用。 这会破坏已包含该材料的任何现有批次。 如果您希望访问批处理对象的材质,请改用 Renderer.sharedMaterial。
优化 SkinnedMeshRenderers
渲染蒙皮网格是昂贵的。 确保使用 SkinnedMeshRenderer 的每个对象都需要它。 如果游戏对象在某些时候只需要动画,请使用 BakeMesh 函数将蒙皮网格冻结在静态姿势中,并在运行时切换到更简单的 MeshRenderer。
最小化反射探头
反射探针可以创建逼真的反射,但这在批量方面可能非常昂贵。 使用低分辨率立方体贴图、剔除蒙版和纹理压缩来提高运行时性能。