Unity开发中的内存管理与实用技巧
1. 预制体池化与场景加载
当生成超过五个任何预制体的实例时,需要在内存中实例化一个新的实例,这会产生一些内存分配。但如果只生成和销毁已存在的实例,观察Profiler中的内存区域,会发现不会有新的内存分配。
不过,预制体池化系统存在一个微妙的问题。PrefabPoolingSystem类是静态类,其生命周期会超过场景的生命周期。当加载新场景时,池化系统的字典会尝试维护对上一个场景中池化实例的引用,但Unity会强制销毁这些对象,即使我们仍持有引用(除非设置了DontDestroyOnLoad()),这样字典中会充满空引用,给下一个场景带来严重问题。
为解决这个问题,应在PrefabPoolingSystem中创建一个重置池化系统的方法,在加载新场景前调用,以便为下一个场景中的早期Prespawn()调用做好准备:
public static void Reset() { _prefabToPoolMap.Clear (); _goToPoolMap.Clear (); }若在场景过渡期间调用垃圾回收,就无需显式清空这些字典所引用的PrefabPools,因为这些是PrefabPool对象的唯一引用,下次垃圾回收时会被释放。若不在场景间调用垃圾回收,PrefabPool和