Unity 3D assetbundle AB包 资源管理的实现

2024-08-08  乐帮网

unity3d

首先汇总出Unity AB包资源的基础知识,以下内容来自网络汇总:
Unity中资源从大类可分为AssetBundle 和 Resources,其中Resources是静态的,管理难度较小把重点放到AssetBundle上。
以下是 AssetBundle 有关内容

1、assetbundle文件内存镜像占用的内存,在加载assetbundle文件完成后,会在内存中形成assetbundle文件的内存镜像,同一个assetbundle文件不能有两个内存镜像,所以同一个assetbundle文件在没有Unload之前不能再次加载。

2、从assetbundle文件中加载出来的资源所占的内存(AssetBundle.Load多次Load只会有一份资源内存占用)。(指GameObject,Texture,Sprite,Shader,Material)如果从assetbundle里加载的资源是引用类型的,就不需要实例化就可以直接使用,并且如果有多个地方使用同一个引用资源时,引用资源不需要实例化,比如:Texture,Sprite,Shader,Material就是引用类型的。如果assetbundle里加载的资源不是引用句类型,不能直接使用,需要实例化后使用,如:GameObject,需要Instantiate实例化后使用。如果需要多个GameObject,需要多次实例化。

3、Instantiate实例化的资源所占用的内存。(一般是指GameObject)

AssetBundle.UnLoad(false);卸载1的内存占用。
AssetBundle.UnLoad(true);卸载1,2的内存占用(所有此AssetBundle已经加载的资源)。
如果想要只卸载某个已经加载的资源,用Resources.UnLoadAsset(obj)(只能用这个卸载引用资源);Resources.UnloadUnusedAsset()卸载没有被引用的所有的资源。
Destroy主要用来销毁3的内存占用,即销毁克隆对象,也可用于销毁静态物体,不会自动释放该对象的所有引用。Destroy不能用来销毁从文件加载的资源(会删除相应的资源文件,报错Destroying assets is not permitted to avoid data loss.)
加载新场景时会自动销毁2,3的内存占用,但是1的内存占用不会销毁,1只能通过AssetBundle.Unload去释放。

参数是true的时候是完全卸载资源,包括了AB包(AssetBundle,一下都简称AB包,每次都打太麻烦了)和实例化的资源。就算是正在引用的资源也会被卸载,如果使用不当,会造成纹理丢失之类的情况。应该确保资源确实没有哪里引用了,才调用AssetBundle.Unload(true);

其中Unity中AssetBundle资源我汇总如下:
模型、(GameObject)材质、‌纹理、‌预制体、‌*脚本(以dll形式的热更新)、‌声音、‌数据文档、‌动画切片、控制器、‌着色器、‌场景


综上所述,我们可以封闭一个专门针对AssetBundle加载管理的类,使用计数方式来自动清理资源。其中清理采用定时扫描实现。
以下是主要参考的文章:

https://blog.csdn.net/qq_38399916/article/details/135643315
https://blog.csdn.net/qq_36804363/article/details/121084431
https://blog.csdn.net/LLLLL__/article/details/88790546
https://www.cnblogs.com/dewxin/p/17646342.html
https://www.cnblogs.com/Transmuter/articles/10837737.html
https://www.jianshu.com/p/80f432eda30d

以下是主要参考的资源管理库:
* https://www.baddogzz.github.io/2020/02/07/Unload-Resources/
* https://www.github.com/liufujingwen/ResourceFramework
* https://www.github.com/TonyTang1990/AssetBundleLoadManager
* https://www.github.com/gmhevinci/MotionFramework
* https://www.github.com/xasset/xasset
* https://www.github.com/tuyoogame/YooAsset

目前我的封装已经完成,后面会分享一些经验。

公众号二维码

关注我的微信公众号
在公众号里留言交流
投稿邮箱:1052839972@qq.com

庭院深深深几许?杨柳堆烟,帘幕无重数。
玉勒雕鞍游冶处,楼高不见章台路。
雨横风狂三月暮。门掩黄昏,无计留春住。
泪眼问花花不语,乱红飞过秋千去。

欧阳修

付款二维码

如果感觉对您有帮助
欢迎向作者提供捐赠
这将是创作的最大动力