本机堆(Native Heap)
这里是unity管理的资源内存(区别于c#的托管堆),包括装载GameObject, Transform, Mesh, Texture, Material, Shader和Script等。这些内存是unity来管理的,看下unity默认如何组织的资源加载和卸载的。但是否和托管堆是独立的这个有待验证。
加载,当scene加载完成时所有用到的asset都会被加载,包括Hierarchy中的所有的gameobject涉及的资源和脚本中用到的资源。
卸载,除了DontDestroyOnLoad的资源,在切换scene时都会被卸载。注意singleton(设计模式)通常用到DontDestroyOnLoad。
对于内存优化,我们感兴趣的就是看看什么行为可以影响unity自己的资源加载和卸载策略。
尽量减少Hierarchy中的引用,改成手动的Resource.Load()这样加载的资源可以用Resource.UnloadAsset(obj)和Resources.UnloadUnusedAssets()来释放。还有AssetBundle的Load和Unload方法。
这些load和unload还有Instantiate都是干啥的,见下图:
看了上图,可以理解加载的2个阶段:第一阶段是使用Resources.Load或者AssetBundle.Load加载各种资源,第二阶段是使用GameObject.Instantiate克隆出一个新的GameObject。
3种实例化prefab的方式