前言
在使用atlas Sprite的过程中,会忍不住产生一个疑问,atlas是做什么用的,这个include in Build的含义是什么呢,以及它是否应该被勾选。网上查阅到了很多资源,有的说这个选项大胆勾选,有的说这个选项勾选完后图集打包后的纹理在游戏启动后,会一直常驻内存,需要自己做好Later Binding。
说法之间互相冲突,各种道理都有,越看越迷糊,遂忍不住自己做下实验,查验atlas Sprite include in Build的作用,以及勾选与否对于内存产生的影响。
在实验之前,先说下实验环境:
- 使用Unity版本:2022.3.53
- 使用sprite mode:Sprite Atlas V2 -Enabled
测试1
第一个测试,atlas打包Sprite文件夹中的散图,但只对atlas文件进行ab打包,Sprite文件夹中的散图不打包。打包后,通过AssetStudio进行ab包逆向,可以查看到所有散图都被打进一个图集中去了,并不会有冗余情况。
测试2
第二个测试,同时将atlas和散图资源一起打成ab包,可以发现效果是一样的,unity是有做优化的,所有散图都被打进一个图集中去了,并不会有冗余情况。
测试3
在测试1的基础,我们增加个UI预制体,里面增加对该图集中两个散图的引用(就是直接使用散图,不用理会图集),并将该UI预制体同atlas一起打成ab包,标记atlas的Inculde in Build为false。查看Addressables Report,发现图元索引被打进ui的ab包中,但没有把图集索引打进ab包中。
此时动态加载ui预制体,是没办法帮你主动先加载图集的。会出现白图的情况。
测试4
在测试3的基础上,我们将atlas改成Include in Build,可以看到Image.prefab直接引用图集的ab包,同时打出的ab包竟然相较于不勾选Include in Build会更小。可能跟压缩算法有关系,但这里不做探究。
此时动态加载ui预制体,不会产生白图情况,drawcall数量也是正常的。
测试5
在来看看内存占用情况,根据官方文档,勾选Include in Build后,会在游戏一开始,就将图集加入内存当中,我们来验证下实际情况,首先编写代码,在游戏启动后,2s后加载ui预制体,再2s后删除ui预制体。
using System.Collections;
using UnityEngine;
using UnityEngine.AddressableAssets;public class LoadGO : MonoBehaviour
{public string path;public Transform parent;IEnumerator Start(){yield return new WaitForSeconds(2);GameObject go = null;var handle = Addressables.LoadAssetAsync<GameObject>(path);handle.Completed += (handle) =>{go = GameObject.Instantiate(handle.Result);go.transform.SetParent(parent);go.transform.localScale = Vector3.one;go.transform.localPosition = Vector3.zero;};yield return new WaitForSeconds(2);GameObject.Destroy(go);Addressables.Release(handle);}
}
运行起来,可以看到,在第326帧时,Texture占用情况是378.1M
在第327帧是378.4M
在第425帧是378.1M
可以说明,翻译应该是有误的,勾选Include in Build后,并不会游戏启动后就加载到内存当中,也不会一直常驻,引用图集的资源被释放后,图集也就被释放了。
总结
至此,所有测试完毕,做个总结吧。
- 将散图同时跟atlas文件一起打包,或是单独打包atlas文件,对于unity而言结果是一样的,unity不会单独打散图资源。
- 勾选Include in Build,引用该图集的ab包,会添加对图集ab包的引用关系;不勾选,则不会添加对图集ab包的引用关系,需要自己做好later binding,否则会产生白图的情况。
- Unity在打包时,对于勾选了Include in Build的情况是有做优化,在勾选的情况下,打出的ab包的比不勾选的更小。
- 勾选Include in Build后不会在游戏启动就将图集资源加载进内存当中,而是按需加载,当所有引用该图集的资源被释放后,该图集也就被释放。
所以说,放心大胆的使用Include in Build,对于性能是没有害处的。