游戏开发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中的图集资源时产生的另一份spriteatlas资源,造成内存中同一个图集有两份内存占用。

拓展:

    每次测profiler时,记得在改完图集的include in build和打完ab包后,关闭工程,然后重新打开工程进行进行profiler测试。原因是在editor状态下,unity实际就是一个工程,进行的所有操作都有进行缓存,所以在打ab包时,会产生很多中间资源,unity都加载到了内存中,这时查看profiler,实际是非常不准确的。

猜你喜欢

转载自blog.csdn.net/qq1090504117/article/details/106250428
今日推荐