赞
踩
文章目录
在Unity中,通常渲染一个纹理会调用一次DrawCall。一个2D项目,可能包含大量的纹理,如果绘制每个纹理都调用一次DrawCall,这会占用过多的资源,从而影响整个应用程序的性能。为了降低性能消耗,我们可以使用精灵图集(Sprite Atlas)技术,它能够将多个纹理(texture)合并成一个大纹理,当访问图集中的多个纹理时,也只需要调用一次DrawCall 。
Unity2020之后的版本,弃用了旧版的SpritePacker,图片设置中的Packing Tag变灰,无法修改。需要使用新版的Sprite Atlas进行图集打包。
选择Window->Package Manager,选中Unity Registry,然后找到2D Sprite,将其导入到项目中。
选择Edit -> Project Settings -> Editor,将SpritePacker的Mode切换为你所需要的模式。我这里选择了Sprite Atlas V1 - Always Enabled。
在Project视图点击鼠标右键,Create->2D->Sprite Atlas。
将要打包的图片或文件夹,放置到图集文件的Objects for Packing中。然后单击PackPreview按钮,可以看到图集预览。
- using UnityEngine;
- using UnityEngine.U2D;
- using UnityEngine.UI;
-
- public class UIPanel : MonoBehaviour
- {
- public SpriteAtlas atlas;
- public Image img;
- private void Start()
- {
- img.sprite = atlas.GetSprite("Rank");
- }
- }
禁用图集相关功能。
仅当发布(Build)的时候构建图集,在Editor和Play模式中引用原始纹理而非图集中的纹理。
在运行时(Build和Play模式)引用图集中的纹理,在Editor模式中引用原始纹理。
Unity2020.3版本这个功能还处于实验中,默认在运行时引用图集中的纹理。
Sprite Atlas V1 不支持缓存服务器(Cache Server),Unity只能将打包的图集数据存储在Library/AtlasCache
文件夹中,并且也不能有依赖项,不支持命名对象导入器(named objects importer),而Sprite Atlas V2提供了对上述功能的支持。具体可以参考Unity Manual:Sprite Atlas version 2 (Experimental)
设置精灵图集的类型,默认为Master(主图集),也可以设置为Variant(变体图集)。
是否在运行时使用到图集中的Sprite时自动将图集加载到内存中。
Unity在打包的项目中会包含图集,并且在运行时自动加载它们,取消勾选图集的Include in Build选项可以禁用此行为。
如果禁用Include in Build,Unity仍会将图集打包到项目Assets文件夹中的** .spriteatlas * 文件中,只是运行的时候不会加载到内存中。因此,当精灵引用已禁用的图集中的纹理,由于引用纹理不可用或未加载(not available or loaded),该纹理将无法被找到,引用它的图片将显示为空白。此时要加载精灵图集,必须使用脚本通过后期绑定(Late Binding)执行此操作。代码如下:
- using UnityEngine;
- using UnityEngine.U2D; //引用SpriteAtlas的命名空间!
- public class SpriteAtlasTest : MonoBehaviour
- {
- //如果勾选了Include Build属性,在启动游戏时自动进行以下操作
- //SpriteAtlasManager是在运行期间管理SpriteAtlas的一个类,它包含atlasRequested和atlasRegisterer两个事件
- //atlasRequested事件:当一个Sprite打包进了图集,但是在运行期间无法找到该图集的位置时触发。
- //atlasRegistered事件:SpriteAtlas加载完成后调用
-
- private void OnEnable()
- {
- SpriteAtlasManager.atlasRegistered += AtlasRegistered;
- SpriteAtlasManager.atlasRequested += AtlasRequest;
- }
-
- private void OnDisable()
- {
- SpriteAtlasManager.atlasRegistered -= AtlasRegistered;
- SpriteAtlasManager.atlasRequested -= AtlasRequest;
- }
-
- private void AtlasRegistered(SpriteAtlas spriteAtlas)
- {
- Debug.LogFormat("Registered {0}.", spriteAtlas.name);
- Sprite sprite = spriteAtlas.GetSprite("AnimPic_0");
- Debug.Log("从图集中获取到的Sprite:" + sprite.name);
- }
-
- private void AtlasRequest(string tag, Action<SpriteAtlas> callback)
- {
- var sa = Resources.Load<SpriteAtlas>(tag);
- callback(sa);
- }
- }
运行打包的时候旋转精灵Sprite,这样可以最大限度的提供图集中Sprite的密度。
此选项默认为勾选状态,如果是画布中的UI元素则推荐关闭该选项,因为在图集中旋转了的Sprite在场景中也会旋转。
根据Sprite的轮廓而非Sprite外部矩形的轮廓来打包。这样可以提高图集中Sprite的密度。
勾选后使用精度更高的裁剪图集图片(Mesh裁剪),否则是矩阵裁剪(图片是一块矩形图)。
如果不需要高精度裁剪则取消勾选,如果发现裁剪出的图片显示不正确,则勾选。
定义图集中Sprite之间的像素间距,防止Sprite之间出现重叠,默认值为4。
设置主图集内容的副本作为自己的内容。
设置变体图集的缩放因子,介入0.1~1之间。
是否运行通过脚本函数访问纹理数据,例如Texture2D.SetPixels函数。如果启用,Unity会创建纹理副本,这将导致所需内存翻倍,并且只适用于未压缩纹理或DXT纹理。
是否生成MipMap。
是否将纹理存储在伽马(Gamma)空间中。
设置图集中纹理的滤波模式。
添加Sprite,将列表中的所有Sprite打包到图集中。可放入Texture2D、Sprite、文件夹。放入文件夹时会将文件夹下的所有Texture2D、Sprite放入图集。
点击后会在预览界面显示出图集的具体数值,如图集的内部表现、空间大小、尺寸、使用的压缩格式。
注意:在Sprite Atlas V2中,如果对图集有修改,要点击该按钮保存更改。
变体图集的主要目的是创建与主图集不同分辨率的图集。主图集中Sprite的分辨力*Scale(缩放因子)得到的结果就是变体图集中Sprite的分辨率,它自身不包含Objects for Packing属性,因此变体图集中的内容都是主图集的副本。
当项目中既有主图集,又有该主图集的变体图集时,可以使用这两个图集中任意一个的Sprite。如果要自动从变体图集而不是主图集中加载Sprite,那就仅为变体图集启用Include in Build选项,并关闭主图集的这个选项。
当图集中有一个Sprite处于活跃状态时,Unity会加载该Sprite所属图集中的所有纹理。如果一个图集中有许多纹理,而场景中只有一个纹理被引用,那么整个图集都会被加载,会造成较大的内存消耗。
解决该问题的方法:(可能会造成DrawCall增加)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。