托管内存与非托管内存
- 反是我们自己用代码写出的来资源,都可以理解为在托管内存中存放,比如,你定义的Dog类,
- 非托管内存里,都是外部资源,如IO流, 网络流,音乐片断,电影片断,图片等, 这些都不是.net环境中可以管理的资源,必须由我们显示的释放
- 如何释放
- 对于文件流,我们调用流的Dispose()方法
- 请注意,在C#中,Idispose接口,定义了我们释放资源的方法
- C#规定,如果你的类掌管着外部资源,那么就实现这个接口,让调用者可以显式的去释放资源
- 这个接口要注意和析构函数的区别
- Stream类,实现了这个接口,还有unity的WWW类
- -
加载资源的三种方式
- 静态加载
- Resources加载
- 这个目录,只能通过Resources.load来访问其中的资源,并且不能热更新
- 这里面的资源,有用没用,全部会发布的项目中,所有谨慎使用这个目录,防止资源过大
- AssetBundle
- 从本地或者从外部加载资源
- 移动开发,建议使用这个方法打包所有资源,发布项目时,项目中只包含必须的资源就可以
预制件
- 一种特殊的GameObject类型,是一种资源
可以引用其它资源,如Texture,Material,可以挂载脚本组件
- Resources.UnloadUnusedAssets()
会将所有没有引用的资源从内存中卸载AssetBundel的卸载
- bundle.unload(bool)
- 每个AB都会和从自己身上提取出的资源建立起联系,意味着,当你再次这个AB中提取曾经提取过的资源时,它会自动把内存中和自己有联系的那个资源直接给 你,不会再复制一份;
- 如果你将AB通过unload(false)卸载掉了,那么这个AB将和内存中它的资源推动联系,意味着,你再加载AB时,从AB中继续提取这个资源时,会产生复制
注意,内存中,同一个AB,只能有一份,如果你再次加载AB,而这个AB之前加载过,那么会报错