目录
✅ 使用 Addressables 或 AssetBundle
✅ 使用 Profiler / Frame Debugger
一. 移动端特有的优化策略
1. 资源加载优化(防止卡顿 & 降低内存峰值)
✅ 使用 Addressables
或 AssetBundle
-
移动端 RAM 资源有限(Android 通常 3GB - 8GB,iOS 稍高),一次性加载大量资源容易崩溃。
-
避免 直接加载大文件,改用 异步加载。
-
按需加载资源,减少
RAM
峰值,可以做到:
-
启动时只加载 UI 资源,其他资源按需加载。
-
大资源(贴图、音效、模型)存
AssetBundle
,按需下载 & 释放。
-
2. 纹理贴图(Texture)优化
🔹 避免 RGBA32
,改用 ETC2(Android)
/ ASTC(iOS)
压缩
-
ETC2
(OpenGL ES 3.0 以上) -
ASTC
(iOS & Vulkan 支持,压缩比更高)
🔹 Texture Import Settings
调整
-
UI 贴图:
-
关闭
Mip Maps
,减少VRAM
占用。
-
-
3D 贴图:
-
开启
Mip Maps
,减少远距离锯齿
,但最大 Mip Level
不要超过目标设备屏幕分辨率。
-
-
法线贴图(Normal Map):
-
选
Normal Map
处理,避免不必要的 Alpha 通道。
-
🔹 使用 Sprite Atlas
合并 UI 贴图
-
UI 贴图过多 会导致
Draw Call
爆炸。 -
Sprite Atlas
(Unity 2020+
原生支持)可将多个 UI 贴图合并,减少Draw Calls
。
3. CPU & 内存优化
✅ 减少 GC.Alloc
(垃圾回收)
🔹 避免 string
拼接(StringBuilder
替代)
-
string += "xxx"
会创建新对象,增加 GC 负担。 -
推荐:
StringBuilder sb = new StringBuilder(); sb.Append("Hello"); sb.Append("World"); string result = sb.ToString(); // 避免 GC 分配
🔹 减少 foreach
(改用 for
)
-
foreach
在List<T>
上可能触发GC.Alloc
(因Enumerator
结构体会装箱)。 -
推荐:
for (int i = 0; i < list.Count; i++) { Debug.Log(list[i]); }
🔹 池化 GameObject
& UI
-
对象池(Object Pool)管理子弹、特效、敌人等,避免反复
Instantiate/Destroy
。 -
UIPool
复用 UI 组件(按钮、弹窗等),减少GC
压力。
4. 渲染优化(减少 CPU
& GPU
负担)
见我其他博客,有详细描述,点击跳转
5. 运行时性能优化
✅ 移动端 Frame Rate
控制
🔹 设置 Application.targetFrameRate
-
限制到
30FPS
(省电 + 平稳)Application.targetFrameRate = 30;
-
高端机可设
60FPS
,但需测试是否发热严重。 -
不建议 120FPS(大部分手机屏幕不支持 & 高耗电)。
🔹 VSync 选项
-
PC 端可开启
VSync
,但移动端建议手动targetFrameRate
,避免过度 GPU 渲染导致发热。
二. 移动端性能问题分析
✅ 使用 Profiler
/ Frame Debugger
-
Window -> Analysis -> Profiler
:分析CPU/GPU
性能瓶颈。 -
Window -> Analysis -> Frame Debugger
:分析Draw Call
是否过高。 -
Memory Profiler
(Unity 插件):检测RAM
占用情况。
常见移动端性能问题
问题 | 解决方案 |
---|---|
Draw Call 过多 | 使用合批(Static Batching、Dynamic Batching、GPU Instancing) |
UI 过多导致卡顿 | 使用 Sprite Atlas (合并 UI 贴图)、Canvas 分层渲染 |
GC 频繁,造成卡顿 | 对象池(Object Pool)、优化 string 拼接、避免 foreach |
内存溢出 | 资源按需加载、定期 UnloadUnusedAssets() |
游戏发热严重 | 限制 FPS (30~60 ),优化 Shader & 贴图 |
你现在开发的移动端游戏,出现了以下问题,如何优化?
问题 1:UI 卡顿(打开背包界面时,明显掉帧)
问题 2:CPU 负载高(游戏中帧率不稳定,经常出现小卡顿)
问题 3:内存溢出(OOM 崩溃)(长时间游戏后,App 崩溃)
希望大家可以思考思考这几个问题,在项目中遇到了我们该如何去排查与解决。