游戏开发unity资源管理系列:SpriteAtlas的Include in Build的作用探究(下)
游戏开发unity资源管理系列:SpriteAtlas的Include in Build的作用探究(上)中探究了SpriteAtlas的include in build对打包资源的影响,是否勾选对资源加载的影响。
这一篇主要讲解不勾选include in带来的好处。
先上结论:
不勾选include in build时,我们可以在手动管理大纹理(图集生成的)的内存。
分析:
首先勾选include in build,我们在编辑器或者运行时,加载assetbundlecontent(参考开头提到的文章),可以看到图片是正常显示的。那么为什么会正常显示呢?
第一个测试,我们仍然加入late binding那一套api,看是否会被调用。我们会发现勾选include in build,在加载assetbundlecontent时,RequestAtlas是没有被调用的,界面上的图片正常显示。而我们并没有加载atlastest所在的assetbundle啊。结论:unity自动帮我们加载图集资源了。
第二个测试,图集资源能否卸载。我们在加载assetbundlecontent中的prefab前,查看profiler,发现Texture2D中没有图集生成的大图。
加载assetbundlecontent中的prefab后,图集资源自动被加载到内存中了, 图片正确显示。
然后卸载ab包,sprite引用丢失了,图集所在的大图却没有被卸载。
(需要手动控制GameObject的Active才能变白)
这里不禁再次思考,那么这部分的图集资源真的卸载不掉了么,答案是可以卸载的。经过测试,在卸载assetbundlecontent时(使用AssetBundle.Unload(true),不能使用AssetBundle.Unload(false)),再调用Resources.UnloadUnusedAssets(),就可以卸载掉这个不再用到的图集资源。
之后测试不勾选include in build,将所有ab资源删除重新打,关闭编辑器并重新打开工程,然后再打开unity profiler工具进行分析
然后看到内存中只有2个texture
加载assetbundlecontent
看到图片都能被正确加载,再看profiler
大图被加到了内存中。
之后调用AssetBundle.,Unload(true) api,将图集所在的ab包卸载,看到图片变白了,image引用的sprite为Missing状态
(需要手动控制GameObject的Active才能变白)
查看profiler,大图也从内存中释放了
总结:
不勾选include in build,可以由开发者手动管理图集资源,但感觉处理的比较繁琐一些。
勾选include in build,由unity自动加载图集资源,开发者无法直接卸载图集资源,需要调用Resource.UnloadUnusedAssets()来手动去掉图集的引用。然后加载过程中,可能会存在unity自动加载的图集,自己在加载图集assetbundle时产生的另一份assetbundle资源,造成内存中图集资源重复。
拓展:
每次测profiler时,记得在改完图集的include in build和打完ab包后,关闭工程,然后重新打开工程进行进行profiler测试。原因是在editor状态下,unity实际就是一个工程,进行的所有操作都有进行缓存,所以在打ab包时,会产生很多中间资源,unity都加载到了内存中,这时查看profiler,实际是非常不准确的。