目录
1. 避免 GameObject.Instantiate() 过度创建对象
3. 使用 Memory Profiler & Profiler
一、优化包体大小(减少 APK/IPA/EXE 体积)
1. 剔除无用资源
✅ 使用 Build Report
查找多余资源
-
启用
Build Report Inspector
(UnityEditor.BuildReport
) 分析Assets
使用情况。 -
Window -> Analysis -> Build Report
查看哪些资源占用最多。
✅ 清理未引用的 Assets
-
移除未使用的
Shader Variants
(避免Always Included Shaders
过多)。 -
移除未使用的
Fonts
、Materials
、Textures
。
2. 资源压缩(Textures、Audio、Mesh)
(1)优化 Texture
贴图
🔹 选择合适的压缩格式
-
移动端(Android/iOS):使用
ETC2(RGB/A)
代替RGBA32
,减少 75% 体积。 -
PC/Console:使用
BC7(DXT5)
代替ARGB32
,减少 50% 体积。 -
UI 贴图:使用
Sprite Atlas
合并小贴图,减少Draw Call
。
🔹 降低贴图分辨率
-
Unity
Texture Importer
->Max Size
限制贴图尺寸(不要超出屏幕实际显示)。 -
压缩
Mip Maps
(LOD 贴图),仅在3D
场景启用,UI 贴图可关闭。
🔹 移除 Read/Write Enabled
(避免多占一份内存)
-
除非
Mesh
需要在运行时修改(如SkinnedMeshRenderer
),否则关闭Read/Write
。
(2)优化 Audio Clip
音频
🔹 使用 Streaming
模式
-
大型 BGM (>1MB)使用
Streaming
,避免内存占用过大。 -
小型音效 (<500KB)使用
Compressed in Memory
,减少RAM
占用。
🔹 选择合适的压缩格式
-
iOS:AAC (MP4) / ADPCM
-
Android:Vorbis(Ogg) / MP3
-
PC:WAV / Vorbis
🔹 降低 Sample Rate
-
背景音乐不需要高采样率(建议
44.1kHz
)。 -
音效
16-bit
即可,避免32-bit
浪费内存。
(3)优化 Mesh & Model
🔹 减少 Mesh
面数
-
使用 LOD(Level of Detail),远处模型降低
Polygon
数量。 -
使用
自动优化
Mesh Compression
(
Inspector -> Model Import
):
-
Low
(低压缩,适用于精细模型) -
Medium
(中等压缩) -
High
(高压缩,适用于远景或低精度模型)
-
🔹 合并 Mesh
-
Static Batching
:适用于 静态物体(建筑、地形)。 -
Dynamic Batching
:适用于 小型动态物体(武器、道具)。 -
GPU Instancing
:适用于 重复对象(草地、树木)。
3. 代码优化
🔹 使用 IL2CPP
剔除无用代码
-
去除未使用的
MonoBehaviour
脚本。 -
IL2CPP
结合Managed Stripping Level
:
-
Low
(仅移除未引用代码) -
Medium
(推荐) -
High
(可能影响反射)。
-
🔹 精简 Debug.Log()
-
Debug.Log()
会在Release
模式下 占用 CPU 资源,建议 构建时移除。
🔹 减少 Scriptable Objects
冗余数据
-
ScriptableObject
不应存储过大的 Texture、Mesh、AudioClip,建议拆分。
二、优化运行内存占用(RAM 资源管理)
1. 避免 GameObject.Instantiate()
过度创建对象
✅ 对象池(Object Pooling)
-
大量实例化 & 删除对象会导致 GC(垃圾回收)卡顿。
-
使用
Object Pool
复用对象,适用于 子弹、敌人、特效等短生命周期对象。 -
Instantiate()
&Destroy()
避免频繁调用,改为 对象池复用。
GameObject obj = objectPool.GetPooledObject(); obj.SetActive(true);
2. 释放未使用的内存
✅ 使用 Resources.UnloadUnusedAssets()
-
当场景切换时,释放不再使用的
Texture
、Mesh
、Audio
。 -
适用于 大型场景过渡时 释放内存,防止
RAM
爆炸。
✅ 手动调用 GC.Collect()
-
在 场景切换后 调用,清理
Managed Heap
,减少GC
卡顿。
System.GC.Collect(); Resources.UnloadUnusedAssets();
3. 使用 Memory Profiler
& Profiler
✅ Window -> Analysis -> Profiler
查看:
-
CPU & GC Allocation(垃圾回收高峰)。
-
Memory(Texture、Audio、Mesh 内存占用)。
-
Rendering(
Draw Calls
&Batches
过多问题)。
✅ 优化 Memory Usage
-
Texture 占用过高?→ 压缩格式 + 降低分辨率
-
Audio 占用过高?→
Streaming
加载 -
Mesh 内存过大?→ LOD + Mesh Compression
-
GC 频繁?→ 对象池 + 减少
new
操作
总结
✅ 减少包体大小
-
压缩
Texture
(ETC2, DXT5)。 -
压缩
Audio
(Ogg, AAC, ADPCM)。 -
剔除未使用
Assets
(Build Report 分析)。 -
启用
IL2CPP
+Managed Stripping Level
。
✅ 减少运行时内存占用
-
对象池(Object Pooling)减少 GC 开销。
-
合理使用
Resources.UnloadUnusedAssets()
&GC.Collect()
。 -
优化
Memory Profiler
分析结果,减少Texture
&Mesh
占用。