Unity-通过AB包使用SpriteAtlas图集(基于unity2018)

项目遇到了一个性能问题,需要优化UI。其中就涉及UI的合批问题,其中自然而然就会关联到图集的概念。旧版图集,Legacy Atlas,还没有太研究。今天主要看一下SpriteAtlas怎么使用的。

因为我们项目资源工程和Runtime是分离的,所以所有的资源都需要通过AssetBundle加载。

我们做个Demo工程

一个prefab,有三个Image,分别引用了三个Card文件夹下的图片

Card目录如下:

然后我们把prefab单独打一个包,把Cards单独打一个包。

这里先记录一下,打包的大小,然后用AssetStudio看一下ab包里的组成

在运行时我们通过AssetBundle把prefab加载出来

可以看出来,图片是没有合批的,因为没有打图集.

然后我们建立一个图集,把Cards拖动进去

这里勾上Include in Build。让图集自动引用打进AB包

再次构建

发现Card的大小变小了。但是在Manifest里,是看不到任何跟图集有关的信息的,那我们用AssetStudio打开看一下,可以看到图集确实在AssetBundle里了

运行时:

可以看到,已经正确合批了。

不过请注意,我是在Editor上测试的,需要再ProjectSetting里打开Atlas的Always Enabled才能看到效果。不管是不是用AB包加载的。

这个时候我们换一下尝试,如果我们勾选Include in Builds的同时,并且把Atlas的这个图集也打成AB包,会怎么样?

可以看到,本来在card里的图集信息跑到了atlas里

通过manifest的引用关系可以看到。Card没有引用atlas,而是atlas引用了Card。好。那么我们进游戏再加载prefab,注意。prefab只引用了card。二者都没有引用atlas,我们看看会不会有用

结果是正常加载了,这就很奇怪。谁加载的AssetBundle啊?我们通过MemoryProfiler发现

有一张大图集被一个叫CachedSpriteAtlasRuntime的引用着。根据之前查的资料,该不会是缓存吧。或者我的Editor下数据被关联了?于是我把工程里的Atlas文件删掉,只保留ab包里的,果然,效果就不对了

这就比较纠结了。Editor下的资源竟然参与Build了。这就没办法了。那只能打包测试了,打包成andorid以后测试,果然,还是白色的

因为打包成AB以后,实际上是需要自己去处理这个bundle依赖的。所以在加载Prefab之前,先把atlas的AssetBundle也Load出来,显示就正确了。

好。现在再考虑一个问题,如果我不勾选Include in Builds,会怎样。我们做个测试

变成白色了,即便我们提前加载了Atlas的AssetBundle,还是不行。

但是这个时候是触发了官方说的延迟绑定回调了

其实在上一步,如果你不提前加载AssetBundle,也会触发延迟绑定回调

我们处理下延迟绑定的内容

加上代码以后:

    private void Awake(){SpriteAtlasManager.atlasRequested += OnAtlasRequested;}private void OnAtlasRequested(string atlasName, Action<SpriteAtlas> callback){Debug.LogError("AtlasRequested");_atlas = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/atlas");SpriteAtlas atlas = _atlas.LoadAsset<SpriteAtlas>(atlasName);callback(atlas);}

可以看到,在手机上,或者在Editor上,如果你删除了对应的图集,就会触发这个延迟绑定回调。这个时候,你需要把SpriteAtlas回调回去,才可以正确显示,如下图所示

可以看到,中间加载是有一帧是白色的,一点都不平滑。所以这种方式其实不是很推荐。

好了,至此为止,我们已经完成了对Atlas的测试,下边进行总结一下包括认为的最佳实践:

1、SpriteAtlas在AB包统计引用的时候,不会被正确统计依赖,SpriteAtlas会引用贴图,但是Prefab和贴图本身不会依赖SpriteAtlas,所以如果SpriteAtlas单独打,就需要做额外的引用关系维护处理。

2、所以怎么办呢?每个UI单独建立一个文件夹,来存放预制上美术的直接引用(非通过代码动态加载并设置sprite的情况),然后直接把SpriteAtlas打在这个文件夹内,可以通过代码去创建SpriteAtlas来做自动化。不知道的可以自己搜一下。然后对这个整个文件夹打成一个AB包,这样,预制加载的时候,会引用到里边的图片,图片所在的ab加载了,里边的SpriteAtlas也会被正确引用到。它俩生命周期是一致的,没必要单独打。

完结!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/780287.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python实战之进阶篇(一)

定义类 1. 构造方法 2. 实例方法 3. 类方法 类似于Java中的静态方法, 使用方式: 类名.类方法 4. 私有变量 5. 私有方法 6. 使用属性set和get

【二叉树】Leetcode 104. 二叉树的最大深度【简单】

二叉树的最大深度 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例1 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3 解题思路 二叉树的最大深度可以通过递归方式来求解…

RockChip Android8.1 Settings

一:Settings一级菜单 1、AndroidManifest.xml 每个APP对应都有一个AndroidManifest.xml,从该文件入手分析最为合适。 packages/apps/Settings/AndroidManifest.xml 根据<category android:name="android.intent.category.LAUNCHER" />可找到当前当前APP a…

Java 扫描某包下所有类的注解并获得注解值

背景 &#xff1a; 需求 需要获取某个包下的所有的注解 并不是全部项目的 所以 只用针对某个包 进行扫描 获取注解 数据就行 百度了一圈 spring boot 没有自带的 获取注解集合的方法 在看 php 中 hyperf 框架 看到了 这个方法 就是因为 我需求是 php 和java 合体 微服务开发 …

Java复习第十三天学习笔记(HTML),附有道云笔记链接

【有道云笔记】十三 3.29 HTML https://note.youdao.com/s/Ru3zoNqM 一、基本标签 HTML:超文本标记语言 定义页面结构 CSS&#xff1a;层叠样式表 页面显示的样式、排版 BootStrap JS: JavaScript 界面交互(动态交互、逻辑) JQuery <!DOCTYPE html> <html> &l…

C++Template<>模版的介绍及深度解析

一、泛型编程 1.什么是泛型编程 泛型编程&#xff1a;是一种程序设计方法&#xff0c;编写于类型无关的通用代码&#xff0c;实现代码复用。而模版就是泛型编程的基础和核心。 二、template<>模版 1.template模版介绍 模版&#xff0c;顾名思义就是一个模具&#xff0…

SpringBoot实现RabbitMQ的定向交换机(SpringAMQP 实现Direct定向交换机)

文章目录 Direct 交换机特点实战声明交换及其队列(以注解方式)发消息 应用 上一篇文章中的 Fanout 模式&#xff0c;一条消息&#xff0c;会被所有订阅其交换机的队列都消费。 但是&#xff0c;在某些场景下&#xff0c;我们希望不同的消息被不同的队列消费。这时就要用到 Dir…

Linux内核之debugfs_create_dir与debugfs_create_file实例与调用栈流程(三十二)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

.NET CORE使用Redis分布式锁续命(续期)问题

结合上一期 .NET CORE 分布式事务(三) DTM实现Saga及高并发下的解决方案(.NET CORE 分布式事务(三) DTM实现Saga及高并发下的解决方案-CSDN博客)。有的小伙伴私信说如果锁内锁定的程序或者资源未在上锁时间内执行完&#xff0c;造成的使用资源冲突&#xff0c;需要如何解决。本…

Windows12安装Docker

环境及工具&#xff08;文末提供&#xff09; Docker Desktop Installer.exe &#xff08;官网&#xff09; 一、查看windows相关配置 查看是否开启相应的功能&#xff0c;如果没有需要开启&#xff0c;然后重启电脑 打开任务管理器&#xff08;CTRLSHIFTESC&#xff09;-&g…

既有理论深度又有技术细节——深度学习计算机视觉

推荐序 我曾经试图找到一本既有理论深度、知识广度&#xff0c;又有技术细节、数学原理的关于深度学习的书籍&#xff0c;供自己学习&#xff0c;也推荐给我的学生学习。虽浏览文献无数&#xff0c;但一直没有心仪的目标。两周前&#xff0c;刘升容女士将她的译作《深度学习计…

ssm 设备采购管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目

一、源码特点 ssm 设备采购管理系统是一套完善的信息系统&#xff0c;结合springMVC框架完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模…

java中的继承和组合

继承 在java中继承指的是让类与类之间产生父子关系&#xff0c;被继承的类叫做父类或者基类、超类&#xff0c;继承的类叫做子类或者派生类。这里所说的继承和现实生活中的继承可以理解为同一个意思。当子类继承父类时&#xff0c;子类就能使用父类之中的非私有成员&#xff0c…

(十二)图像的Sobel梯度锐化

环境&#xff1a;Windows10专业版 IDEA2021.2.3 jdk11.0.1 OpenCV-460.jar 系列文章&#xff1a; &#xff08;一&#xff09;PythonGDAL实现BSQ&#xff0c;BIP&#xff0c;BIL格式的相互转换 &#xff08;二&#xff09;BSQ,BIL,BIP存储格式的相互转换算法 &#xff08;三…

图论- 最小生成树

一、最小生成树-prim算法 1.1 最小生成树概念 一幅图可以有很多不同的生成树&#xff0c;比如下面这幅图&#xff0c;红色的边就组成了两棵不同的生成树&#xff1a; 对于加权图&#xff0c;每条边都有权重&#xff08;用最小生成树算法的现实场景中&#xff0c;图的边权重…

UI的设计

一、RGB888的显示 即红色&#xff0c;绿色&#xff0c;蓝色都为8位&#xff0c;即通常说的24位色。可以很好显示各种过渡颜色。从硬件上&#xff0c;R、G、B三基色的连接线各需要有8根&#xff0c;即24根数据线&#xff1b;软件上存储的数据量也需要24位&#xff0c;即3个字节&…

主干网络篇 | YOLOv8更换主干网络之EfficientNet

前言:Hello大家好,我是小哥谈。EfficientNet是一种高效的卷积神经网络架构,由Mingxing Tan和Quoc V. Le在2019年提出,其设计思想是在不增加计算复杂度的情况下提高模型的准确性。它引入了一个称为"复合系数"的概念,该系数用于同时缩放网络的深度、宽度和分辨率。…

RabbitMQ 延时消息实现

1. 实现方式 1. 设置队列过期时间&#xff1a;延迟队列消息过期 死信队列&#xff0c;所有消息过期时间一致 2. 设置消息的过期时间&#xff1a;此种方式下有缺陷&#xff0c;MQ只会判断队列第一条消息是否过期&#xff0c;会导致消息的阻塞需要额外安装 rabbitmq_delayed_me…

光伏发电量预测(Python代码,CNN结合LSTM,TensorFlow框架)

1.数据集&#xff08;开始位置&#xff09;&#xff0c;数据集免费下载链接&#xff1a;https://download.csdn.net/download/qq_40840797/89051099 数据集一共8列&#xff0c;第一列是时间&#xff0c;特征列一共有6列&#xff1a;"WindSpeed" - 风速 "Sunshi…

C++template之类模版进一步了解

前言&#xff1a;这一篇是在我的上一篇文章的基础上&#xff0c;再进一步所写的。 链接&#xff1a;CTemplate&#xff1c;&#xff1e;模版的介绍及深度解析-CSDN博客 一、类模板实例化 1.非类型模版参数 类型模版参数&#xff1a;就是跟在 class后面或者typename后的类型 非…