引言
简单概念回顾
-
GC Alloc:托管堆上新分配对象(
new、某些API返回临时对象、字符串拼接、装箱等)。Unity Profiler中会显示每帧分配量(KB)。 -
垃圾回收(GC):当分配累积到一定量,CLR/Mono/IL2CPP会停止世界并清理不可达对象,造成卡顿。
-
目标:尽量把每帧的GC Alloc降到最低(理想:每帧0KB或 极低),把大多数分配移到初始化/加载阶段或后台(非渲染关键路径)。
如何分析问题
-
Unity Profiler
-
打开Profiler → CPU Usage → 看
GC Alloc列(每帧分配)。 -
点击具体帧 → Timeline → 找出“Which function allocated”。
-
-
Deep Profiling
-
Deep Profiling会自己产生大量分配与开销,平时不要开,只有必要时短时间开启。
-
-
Memory Profiler
-
用于快照、查看堆上对象分布与大小。
-
-
Runtime Allocation Callstacks
-
Profiler的“Record Allocations”或某些插件可以展示分配调用栈,帮助定位代码行。
-
-
目标指标
-
将每帧GC Alloc控制在0–1KB;移动设备上尽量0KB。
-
常见会产生GC Alloc的场景
-
每帧
new(例如在Update()中频繁new对象、临时Vector3数组等)。 -
字符串拼接(
"x:" + x会生成临时字符串)。 -
使用
string.Format、ToString()每帧。 -
使用LINQ(
Where().Select()会分配枚举器、闭包等)。 -
foreach在某些IEnumerable上会产生分配(特别是非泛型集合、yield返回的枚举器、某些 Unity API)。 -
装箱(把value-type当作object或传给需要object的API)。
-
频繁
<Instantiate()/Destroy()(GameObject分配/释放代价高)。


6862

被折叠的 条评论
为什么被折叠?



