AssetBundle加载和销毁机制
AssetBundle内存管理
Unity3D在手机及其他平台下占用内存太大,这里写下关于Unity3D对于AssetBundle内存的管理与优化。
AssetBundle加载和销毁图
优化之前,先要清楚AssetBundle的加载和销毁原理。
ab包源文件,分为存放服务器端和客户端两种情况,存放在服务器端需要用WWW来远程加载。一般来讲,我们会吧ab包源文件放在客户端,使用AssetBundle.LoadFromFile或AssetBundle.LoadFromFileAsync加载,每次新登录比对ab包源文件和服务器上文件版本的差别,更新下载最新的ab包到本地,实现资源的热更新。
Unity系统在加载新场景时,所有的内存对象都会被自动销毁,包括你用AssetBundle.LoadAsset加载的对象和Instaniate克隆的。
但是不包括AssetBundle文件自身的内存镜像,那个必须要用Unload来释放,用.net的术语,这种数据缓存是非托管的。
AssetBundle加载分为三个部分
- 从文件中加载到内存镜像中,一般使用AssetBundle.LoadFromFile或AssetBundle.LoadFromFileAsync;
- 从内存镜像读取,加载到内存中,使用AssetBundle.LoadAsset来完成;
- 从内存中克隆一份到游戏场景中,使用UnityEngine.Object.Instantiate来完成。
AssetBundle相关对象销毁的几个方法
- 使用Instantiate克隆出来的具体对象,使用Destory来销毁;
- AssetBundle.Unload(false)释放AssetBundle文件内存镜像;
- AssetBundle.Unload(true)释放AssetBundle文件内存镜像同时销毁所有已经LoadAsset的Assets内存对象;
- Reources.UnloadAsset(Object)显式的释放已加载的Asset对象,只能卸载磁盘文件加载的Asset对象;
- Resources.UnloadUnusedAssets用于释放所有没有引用的Asset对象。
AssetBundle 和 Resource 的区别与联系
Unity3D 里有两种动态加载机制:一个是Resources.Load,另外一个通过AssetBundle,其实两者区别不大。 Resources.Load就是从一个缺省打进程序包里的AssetBundle里加载资源,而一般AssetBundle文件需要你自己创建,运行时动态加载,可以指定路径和来源的。
AssetBundle作为Unity官方推崇的资源更新方案,与传统的Resource差异如下:
- Resource放在Resources目录下,resources.assets文件,单个文件有2GB限制,首次必须全部下载;
- AssetBundle创建需要通过Editor脚本创建,支持动态下载,是Unity Web Caching License唯一可以缓存的内容;
- AssetBundle的适用平台与跨平台性。
AssetBundle适用于多种平台,包括网页应用、移动应用、桌面应用等,可以动态更新,但不同平台所使用的AssetBundle并不相同,在创建离线AssetBundle的时候需要通过参数来指定目标平台。
AssetBundle是Unity pro提供的一种用来存储资源的文件格式,它可以存储任意一种Unity引擎能够识别的资源,如Scene、Mesh、Material、Texture、Audio、noxss等等,同时,AssetBundle也可以包含开发者自定义的二进制文件,只需要将自定义文件的扩展名改为.bytes,Unity就可以把它识别为TextAsset,进而就可以被打包到AssetBundle中。Unity引擎所能识别的资源我们称为Asset,AssetBundle就是Asset的一个集合。
AssetBundle的特点:压缩(缺省)、动态载入、本地缓存;