XluaMVC和PureMVC的解析 (二):资源管理

XluaMVC自带的资源管理模块,AssetLoader,我个人认为写的不太好,里面异步和同步没有区分开,很容易出错误,所以资源管理模块这儿,我准备自己写;unity推荐的一个AssetBundleManager功能过于复杂,而且也不好订制自己的功能,所以,可以学习其中的思想,但最好还是别用

  • -

Unity在打包AB时,对于AB有3种压缩模式


  • BuildAssetBundleOptions
    • None:
      • lzma压缩格式, 使用AB前,需要解压,不能直接使用;好处是生成的AB占用空间是最小的,代价是轻微的增加了解压时的时间消耗;我们不必关心如何解压,当你加载这个AB时,会自动解压,并且会把这个AB以LZR的压缩格式,再次压缩到硬盘上,这种压缩格式是可以直接使用的;此时,在这个AB中的所有资源都被解压出来,建议打包场景时,可以用这个压缩格式打包到一个AB中,可以大大降低数据大小;
      • 推荐:可以压缩成这种格式,放到服务器,减少数据传输量,下载到本地后,会被自动以LZ4的格式,缓存到本地硬盘上
    • UncompressedAssetBundle:
      • Uncompressed的格式,占用空间大,好处是加载到内存中时比较快,提取资源时也比较快
    • ChunkBasedCompression
      • chunk-compressed的压缩格式,也就是LZ4,这种压缩格式,它比LZMA占用空间大.但它是分块压缩的,意思是当一个AB中有多个资源时,提取其中一个时,不会让整个AB都解压,而只解压对应的资源的那个数据块,其它的数据还是压缩状态;那种没有任何关系的资源,打包到其中一个AB中时,用这种格式压缩,提取其中一个时不会造成其它的资源数据一起解压;
      • 这个压缩格式,兼顾了空间和速度
  • 加载AB到内存中的方式

以上讲的是打包AB时的压缩格式,另外一个参数BuildTarget对应不同的目标平台,注意,对应不同的平台,会打包成不同的AB包,不同平台的AB包是无法在各平台间共用的,EditorUserBuildSettings.activeBuildTarget这个工具,可以让我们不用硬编码,会自动判断你想要的平台

关于AB间的依赖关系

假如,你有一个坦克预制件TankA,坦克预制件TankB,TankA和TankB都引用了一个相同的材质M1,M1身上有一个Texture,我称为T1;如果我打包AB时,没有单独把M1和T1打包到一个AB中,而是直接把TankA和TankB打包到了两个AB1和AB2中,你们一定担心,会不会造成,从AB中提取TankA时,丢失材质呢?
这个是不会的,因为当你打包TankA时,Unity会自动把这个预件所引用的资源,一起拿过来,打包到一个AB中,所以不会出现丢失问题 *
问题来了,你打包TankA时,它自动打包了M1和T1到AB1中.你打包TankB时,它又进行了相同的事情,也就是说,M1和T1现在在两个AB中,有两份,也就是说万一还有别人引用它,这种方式会造成M1和T1出现多份;


  • 针对上面出现的问题如何解决?
    • 只要在打包时,单独为M1和T1进行打包,那么此时打包TankA和TankB时,就不会把M1和T1进行重复打包了!
    • 所以打包时,尽量不要选中整个预制件进行打包,而是把各资源单独打包.对于一些公共的资源,可以把它们放到一个目录下,然后一次性打包到一个AB中;
    • -

  • 从AB中提取资源时,如何解决依赖问题呢?

    比如说,从TankAB对应的AB包中,提取TankAB的预制件,然后实例化,肯定会出现资源丢失的情况!

  • 针对这种情况,unity是这样解决的

    • 比如提取GameObject tankA=bundle.load(name)
    • 此时,只要内存中,M1和T1对应的AB包在内存中,不需要从AB中提取M1和T1,上面的TankA的资源就可以自动从M1和T1中引用正确的资源来使用!非常方便

    If AssetBundle.Unload(true) is called, then M will be removed from the scene, destroyed and unloaded. However, if AssetBundle.Unload(false) is called, then AB’s header information will be unloaded but M will remain in the scene and will still be functional. Calling AssetBundle.Unload(false) breaks the link between M and AB. If AB is loaded again later, then fresh copies of the Objects contained in AB will be loaded into memory.

-
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值