Unity Sprite Atlas
Unity版本
- 2019.1.15f1c1
使用图集的好处
- 下载BuildReport工具,查看包体里的内容 提取码:wpqi 导入unity工程,每次打包后会弹出包体里的内容介绍
- 本质:将各种分辨率UI图片合成一个大图
- unity中点击图片可以查看图片分辨率和大小,但是这里显示的不是本地图片本身的大小,而是图片转换成你选的格式后的大小,Android一般选RGBA Compressed DXT5格式。切换不同的格式显示的图片大小会改变。这里显示的大小基本就是打包后图片在包体里的大小,还有大概占1%大小的sprite也包含在这里。所以打包后看到图片大小比unity里显示的大一点点。更明显的操作方法是,将图片打成图集,还可以在report工具里看到原来的图片,只不过大小是预估的1%大小,实际上这不是texture的大小,因为texture已经在图集里了,也就是合成一张图了,而是sprite的大小是其他资源。
- 好处
- 图片占用内存空间小了,但是并不能减少包体大小,反而会增加包体的大小,因为图集总有空的地方。因为OpenGL ES中每张贴图都需要设置成2的n次方才能使用,所以不符合要求的UI图会扩展成符合规则的分辨率的图片,导致图片加载到内存中体积暴涨。
- draw call 减少 什么是draw call
创建Sprite Atlas
- 鼠标右键 create/sprite atlas 创建sprite atlas文件
- Windows/2D/Sprite Packer/Open Project Editor Settings/ Sprite Packer/Aways Enable
- 为图集添加图片,点击pack preview,看到图集
Sprite Atas设置
- Tight Packing 默认勾选,但是打包出来图集图片之间相互有重叠。建议去掉勾选。
- Padding 图集中图片的像素间距,建议选择8.
- include in build
-
意义:打包的时候是否要把图集打进包体里(选中就是打入包体)。如果不打入包体里就需要代码从服务器下载或者包体外加载需要的图集。
-
问题:外部加载的图集资源怎么应用到UI?
-
当gameobject需要的图集不存在的时候,unity有提供回调
using UnityEngine.U2D;
SpriteAtlasManager.atlasRequested += OnAtlasRequest;
这个回调不会频繁回调,缺一个图集只会调用一次。就是说虽然有很多物体会报缺失但是如果是缺失的图片属于同一个图集,那么这个缺失汇总成一个回调。代码如下(这里加载sprite atlas资源采用的是AssetBundle,其他方式也行只要加载到图集资源即可),挂载在场景中即可:using System.Collections; using UnityEngine; using UnityEngine.U2D; using System; public class Test : MonoBehaviour { void OnEnable() { SpriteAtlasManager.atlasRequested += OnAtlasRequest; } /// <summary> /// tag是sprite atlas的名字 action方法将图集中的图片应用到UI上 /// </summary> /// <param name="tag"></param> /// <param name="action"></param> public void OnAtlasRequest(string tag, Action<SpriteAtlas> action) { StartCoroutine(LoadAsset(action, tag)); } private SpriteAtlas sa; private bool loadingsa; private IEnumerator LoadAsset(Action<SpriteAtlas> action, string tag) { yield return new WaitForSeconds(3); if (!loadingsa && sa == null) { loadingsa = true; AssetBundleCreateRequest acr = AssetBundle.LoadFromFileAsync(GetPath(tag)); yield return acr; sa = acr.assetBundle.LoadAsset<SpriteAtlas>(tag); loadingsa = false; } action(sa); } private string GetPath(string tag) { string path = Application.dataPath + "/Texture/Atlas/test.unity3d"; return path; } void OnDisable() { SpriteAtlasManager.atlasRequested -= OnAtlasRequest; } }
-
如果不勾选,unity编辑器运行UI界面都是空白的。解决方法如上。也就是说不勾选的话,unity编辑器也找不到图集资源,需要手动加载。
-
-
需要勾选吗?勾选有什么问题?
- 如果图集资源不想打入包体内,不勾选,需要外部加载图集资源。如果要打入包体内,勾选,不需要外部加载图集资源,但是包体会加入图集资源变大。
- 勾选打入包体内会造成资源冗余吗?经过测试会。造成资源冗余的原因是,当你使用assetbundle打包资源时,如果不同的assetbundle使用了同一个图集,那么图集会打入每个assetbundle,造成资源冗余。查看assetbundle资源内容看教程:查看AssetBundle内容工具analyzer。
-