最近给项目改造AssetBundle系统,又从新摸起了AssetBundle这块儿。。
由于如今使用4.x版本的状况已经愈来愈少,而在5里面unity3d已经原生支持了依赖分析增量构建等重量级功能,因此我就再也不浪费篇幅去讲系统设计相关的话题。
我花了一些时间作了一些小实验,能够明确一些unity3d在AssetBundle上的处理细节。但愿看到这篇文章的人可以从中获取一些养分。网络
问:当使用WWW加载AssetBundle时,WWW.Dispose()和AssetBundle.Unload(false)两个释放操做分别会如何影响内存?
答:单独调用WWW.Dispose会释放掉一部份内存(并不知道是什么内存,猜想是和网络相关的部分);单独调用AssetBundle.Unload不会带来任何内存变化;同时调用这两个接口能够彻底释放内存。spa
实验过程:
打包9个AssetBundle,每一个Bundle中有一张2048x2048的RGBA32格式纹理(16MB)。
使用Profiler和任务管理器观察内存变化。设计
问:重复从同一个AssetBundle中加载资源,会带来怎样的内存变化?
答:只会在CPU端占用一分内存,但在GPU部分,每次加载都会额外占用一分内存。3d
实验过程:
打包一张2048x2048的RGBA32格式纹理(16MB)为AssetBundle。
反复进行"加载,取得ResourceObject,卸载Bundle"的操做,使用Profiler观察内存变化。
其中,来自Unity的16MB增加是什么呢?从Profiler Detailed里能够看到具体项目。
一个叫作GfxClientDevice的项目从8.0MB提高到了24.0MB。
至于这个GfxClientDevice项目究竟是什么呢? 我往后再调查补充。。。。blog
问:若是我打包Bundle和运行并不在一个AssetBundle中,能够正确的加载资源吗?
答:能够。接口
问:若是我把Shader随着Bundle一块儿打包出来,而运行的工程并无这个Shader,那么Shader能够正常运做吗?
答:能够。图片
问:若是两个Bundle都包含一样的资源(未处理共享依赖),加载Bundle的时候unity3d如何处理引用?
答:会各自加载本身包里的资源。内存
问:在两次不相干的打包过程当中,依赖是否能够有效的保持。
答:若是使用Deterministic参数,则能够保持。反之则不能,须要从新打包全部相关Bundle。资源
实验过程: 有资源A,B,C,其中资源B和资源C都依赖于A。每一个资源打一个Bundle。it
不开启Deterministic。先带依赖打包A和B,不包含C。而后从新带依赖打包A和C,不包含B。在运行时B会丢失对A的引用。
开启Deterministic。同上流程,在运行时B依然能够保持对A的引用。