前言
好的,我们来详细梳理一下在 Unity 中针对 Android 平台进行性能优化时,需要关注和调整的核心设置。这些设置覆盖了从渲染、脚本、内存到构建管线的方方面面。
对惹,这里有一 个游戏开发交流小组 ,希望大家可以点击进来一起交流一下开发经验呀!
一、核心质量设置 (Quality Settings)
这是性能调优的第一站,直接控制渲染保真度和开销。
路径:Edit > Project Settings... > Quality
- 等级 (Levels) :
-
为不同档位的 Android 设备(低、中、高)设置多个质量等级。
-
在
Build Settings
中可以为 Android 平台默认指定一个等级,也可以通过代码在运行时根据设备性能动态切换。 -
渲染 (Rendering) :
-
抗锯齿 (Anti Aliasing) :这是性能杀手 。在移动平台上优先选择
2x Multi Sampling
或4x Multi Sampling
。如果性能吃紧,完全关闭并使用后处理中的快速近似抗锯齿 (FXAA) 代替(如果使用了 URP/HDRP)。 -
像素光源数量 (Pixel Light Count) :极力降低。像素光计算开销极大。建议设置为 0 或 1。主要依靠烘焙光照贴图和环境光遮蔽 (Ambient Occlusion) 来提供光照细节。
-
纹理质量 (Texture Quality) :对于低端设备,可以设为
Half Resolution
,能显著减少纹理带宽和内存占用。 -
软粒子 (Soft Particles) 和 实时反射探针 (Realtime Reflection Probes) :除非绝对必要,否则关闭。它们会带来很大的计算开销。
-
阴影 (Shadows) :
-
- 阴影距离 (Shadow Distance) :降低,降低,再降低。这是最有效的阴影优化。只让靠近相机的物体投射阴影。
- 阴影分辨率 (Shadow Resolution) :从
Low
(1024) 或Medium
(2048) 开始。 - 阴影级联 (Shadow Cascades) :设为
No Cascades
或Two Cascades
。级联越多,绘制次数越多。
-
后处理 (Post Processing) :
-
屏幕空间环境光遮蔽 (SSAO)、屏幕空间反射 (SSR)、景深 (Depth of Field)、运动模糊 (Motion Blur) 等效果开销巨大。在移动平台上谨慎使用,或者使用移动端优化过的、更轻量的版本(如 URP 中的渲染器特性)。
二、玩家设置 (Player Settings)
这是针对 Android 平台的具体配置。
路径:Edit > Project Settings... > Player > Settings for Android
- 图标 (Icon) & 分辨率与呈现 (Resolution and Presentation) :
-
默认屏幕方向 (Default Orientation) :根据游戏类型设定,避免运行时进行耗时的屏幕旋转。
-
允许横竖屏 (Allowed Orientations for Auto Rotation) :如果不需要,请取消勾选,同上。
-
渲染模式 (Render Mode) :如果使用 Vulkan,选择
Vulkan
;否则使用OpenGLES3
(或 GLES2 以获取最大兼容性,但会失去一些现代图形功能)。 -
在启动时隐藏状态栏 (Hide Status Bar) & 沉浸模式 (Use immersive Mode) :建议启用,提供更好的全屏体验。
-
其他设置 (Other Settings) :
-
渲染 (Rendering) :
-
-
颜色空间 (Color Space) :使用
Linear
(线性空间) 。它比Gamma
提供更真实的光照效果,且在现代 GPU(支持 GLES3+)上性能开销很小。注意:需要所有纹理资源都支持 sRGB。 -
自动图形 API (Auto Graphics API) :建议取消勾选,手动配置 API 顺序。例如,如果你想优先使用 Vulkan,就把它放在列表顶部;如果想优先使用 OpenGL ES 3,就把它放上面。顺序决定了 Unity 尝试使用 API 的顺序。
-
- Vulkan :能为多核 CPU 提供更好的并行渲染,减少 CPU 瓶颈,但在某些老旧的 Mali GPU 上可能存在驱动问题或性能下降。需要测试。
- OpenGL ES 3:兼容性最好,稳定性高。
- OpenGL ES 2:功能有限,不支持许多现代着色器特性,但可以在非常古老的设备上运行。
-
多线程渲染 (Multithreaded Rendering) :强烈建议启用 。它可以将渲染线程与主线程分离,充分利用多核CPU,显著提升性能。注意:如果项目代码不是线程安全的,可能会引发问题,但绝大多数现代项目都应启用它。
-
图形作业 (Graphics Jobs) :在 Experimental 下,对于 Vulkan,可以尝试启用,可能进一步提升渲染线程效率。需要测试稳定性。
-
-
识别 (Identification) :
-
- 最低API级别 (Min API Level) :设置得越高,可以使用的现代 Android 系统特性越多,但会排除旧设备。根据你的目标用户群决定。
- 目标API级别 (Target API Level) :应该设置为你测试时使用的 Android 版本,以避免不必要的兼容性行为。
-
配置 (Configuration) :
-
- 脚本后端 (Scripting Backend) :使用
IL2CPP
。它比 Mono 生成的代码执行效率更高,并且提供更好的安全性(防反编译)和64位支持。 - API 兼容性级别 (Api Compatibility Level) :如果不需要使用 .NET 的庞大类库,使用
.NET Standard 2.0
或更小的.NET Framework
子集,这有助于减少构建大小和运行时内存占用。 - 堆分配优化 (Heap Allocation Optimization) :
Stable
模式可以减少 GC 分配,但可能略微增加堆大小。Performance
模式更积极,但需要充分测试稳定性。
- 脚本后端 (Scripting Backend) :使用
-
发布设置 (Publishing Settings) :
-
调试/开发构建 (Debug/Development Build) :发布时务必取消勾选!开发构建包含大量的调试符号和代码,会严重拖慢运行速度。
-
压缩方式 (Compression Method) :选择
LZ4HC
以获得更快的加载速度和不错的压缩率。LZ4
加载最快,但压缩率稍低。
三、项目特定设置与最佳实践
- 纹理优化 (Texture Import Settings) :
-
最大尺寸 (Max Size) :绝不使用超过所需分辨率的纹理。UI 元素用 1024x1024 或更小,游戏内模型贴图根据物体大小和与相机的距离使用 512x512 或 256x256。
-
压缩格式 (Compression) :使用
ASTC
格式(如果目标设备支持)。它是目前移动平台最好的纹理压缩格式。根据质量需求选择块大小(e.g.,ASTC 4x4 block
用于低质量,ASTC 12x12 block
用于高质量)。对于不支持 ASTC 的旧设备,可以回退到ETC2
(需要 GLES3)或ETC
(GLES2)。 -
生成 Mip Maps (Generate Mip Maps) :为3D场景中的纹理启用,避免远处像素闪烁并提高缓存效率。UI 精灵纹理则应关闭。
-
非2的幂次方 (Non Power of Two) :设为
To Nearest
以确保纹理被缩放到最近的2的幂次方,这是GPU高效处理所必需的。 -
模型优化 (Model Import Settings) :
-
优化网格 (Optimize Mesh) :启用,让 Unity 重新排序网格的三角形顶点以提高 GPU 缓存命中率。
-
读/写启用 (Read/Write Enabled) :发布构建时关闭。除非你需要通过脚本动态修改网格,否则开启它会会在内存中保留一份不必要的网格数据副本。
-
减少多边形数量:使用 LOD (Level of Detail) 系统,为远处的模型使用低模。
-
音频优化 (Audio Import Settings) :
-
将长背景音乐设置为
Streaming
,避免一次性加载到内存。 -
将短音效(如枪声、点击声)的
Load Type
设为Decompress On Load
或Compressed In Memory
,并根据情况设置合适的压缩格式(Vorbis
)和质量。 -
代码优化 (Scripting) :
-
避免在 Update() 中分配内存 :这是造成GC(垃圾回收)卡顿的罪魁祸首。避免使用
string.Format
,foreach
(在某些旧IL2CPP版本中),频繁实例化new
对象。使用对象池来重用对象。 -
使用性能敏感的物理调用 :例如,使用
RaycastNonAlloc
代替RaycastAll
,避免在每一帧进行大量的物理检测。 -
使用 Profiler :这是最重要的工具。在 Unity Profiler (Deep Profiling) 和 Android Profiler (如 Snapdragon Profiler) 中分析CPU、GPU、内存的使用情况,精确找到性能瓶颈。
总结清单(发布前检查)
- 质量设置:降低抗锯齿、阴影距离、像素光数量。
- 颜色空间:使用 Linear。
- 图形API :手动排序,优先 Vulkan 或 GLES3,并启用多线程渲染。
- 脚本后端:使用 IL2CPP。
- 开发构建:发布时务必关闭。
- 纹理:使用 ASTC/ETC2 压缩,尺寸合理,关闭不必要的 Read/Write。
- 模型:启用 Optimize Mesh,关闭 Read/Write。
- 代码:分析并消除 GC 分配。
- 最终测试 :在目标真机设备(尤其是最低配置的设备)上进行全面性能分析 (Profiling)。
遵循这些设置和最佳实践,将能为你的 Unity Android 应用打下坚实的性能基础。记住,优化是一个迭代过程,需要不断地测量、分析、修改和再测试。
更多教学视