Unity垃圾回收器占用过多CPU,安卓游戏卡顿问题求解
减少临时对象的频繁创建
别在游戏循环、Update这类高频调用的方法里反复创建新对象,比如每次都new List<>()、生成临时字符串、创建匿名委托。把常用的集合、对象提前初始化好,复用就行,别每次都造新的。用对象池复用实例
像子弹、特效、敌人这类频繁销毁又创建的对象,搞个对象池。提前创建一批实例存起来,要用的时候从池里拿,用完放回去,不让GC反复回收这些短命对象。优先用值类型替代引用类型
适合的场景下用struct代替class,比如自定义的小型数据结构、坐标点这类。值类型存在栈上,不会触发GC。但要注意别让值类型装箱(比如把struct转成object),这会产生垃圾。优化字符串操作
循环里绝对别用+拼接字符串,改用StringBuilder批量拼;固定格式的日志、提示文本,提前存成静态字符串,别每次都生成新的。合理用集合与数组
初始化集合时指定初始容量,比如List<int> list = new List<int>(100),避免集合扩容时生成新数组垃圾;优先用泛型集合或数组,别用ArrayList这类非泛型的,减少装箱拆箱。调整GC相关设置
要是用Unity这类引擎,开增量GC模式,让GC分帧执行,别一次性占满CPU;针对Android平台,开启Optimize Frame Pacing这类选项,平衡GC触发时机和游戏帧率。批量处理对象生命周期
别零散销毁对象,把要销毁的统一攒起来,在加载场景、玩家操作停顿的时候批量销毁,减少GC触发的次数。用Profiler精准定位垃圾来源
打开Profiler的Memory模块,看具体是哪段代码在产垃圾,比如某个Update里不停造临时对象,就针对性改。你提供的Profiler截图也能帮你确认GC触发的时机和CPU占比,聚焦高频垃圾点。
内容的提问来源于stack exchange,提问作者Mattia Raffaele

