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.hqwc.cn/news/578257.html

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

相关文章

56、FreeRTOS/GPIO与定时器相关学习20240329

一、代码实现控制开发板上的指示灯闪烁。 /* USER CODE BEGIN 0 */ //利用定时器机制 定时器溢出时对应的回调函数实现如下 //本次实现控制PB0&#xff0c;PB1两个灯 int flag1 0,flag2 0;//使用一个标记执行以下代码 会造成一个灯常亮 另一个常灭 void HAL_TIM_PeriodElaps…

openPLC_Editor C语言编程 在mp157 arm板上调用io等使用记录

1.编程界面比较简单&#xff0c;具备PLC开发编程的四种编程方式。梯形图语言LD &#xff0c;指令表语言IL&#xff0c;结构化文本语言ST&#xff0c;功能模块图语言FBD。 2.官方使用手册。学习资料实在是太少&#xff0c;目前都是自己比较费劲的研究。 3.2 Creating Your First…

智能人像重绘解决方案如何部署

企业对于视觉呈现的需求日益增强&#xff0c;特别是在人像处理方面&#xff0c;精准、自然、高效的解决方案成为了市场的迫切需求。美摄科技&#xff0c;凭借自研AI技术大模型&#xff0c;推出全新人像重绘解决方案&#xff0c;致力于为企业提供一站式人像美化服务&#xff0c;…

绘制特征曲线-ROC(Machine Learning 研习十七)

接收者操作特征曲线&#xff08;ROC&#xff09;是二元分类器的另一个常用工具。它与精确度/召回率曲线非常相似&#xff0c;但 ROC 曲线不是绘制精确度与召回率的关系曲线&#xff0c;而是绘制真阳性率&#xff08;召回率的另一个名称&#xff09;与假阳性率&#xff08;FPR&a…

代码随想录——移除元素(Leetcode27)

题目链接 暴力&#xff1a;&#xff08;没有改变元素相对位置&#xff09; class Solution {public int removeElement(int[] nums, int val) {int len nums.length;for(int i 0; i < len; i){if(nums[i] val){for(int j i 1; j < len; j){nums[j-1] nums[j];}i…

深入并广泛了解Redis常见的缓存使用问题

Redis 作为一门主流技术&#xff0c;缓存应用场景非常多&#xff0c;很多大中小厂的项目中都会使用redis作为缓存层使用。 但是Redis作为缓存&#xff0c;也会面临各种使用问题&#xff0c;比如数据一致性&#xff0c;缓存穿透&#xff0c;缓存击穿&#xff0c;缓存雪崩&#…

2024软件设计师备考讲义——(7)

数据库技术 一、数据库基础 1.数据库系统 DB、DBS、DBA、DBMS 2.三级模式两级映像 内模式 物理存储 概念模式 基本表 外模式 用户使用应用程序&#xff0c;视图级别 外模式-概念模式的映像 表和视图之间的映射若表中数据变化&#xff0c;只要修改映射&#xff0c;不用改程序…

Flink学习(一)-flink 本地部署

1&#xff0c;安装 jdk 官网推荐 jdk11 版本。我用 17也可以跑起来 2&#xff0c;下载 flink-1.19 的版本并解压 下载 release 1.19.0 并解压。 tar -xzf flink-1.19.0-bin-scala_2.12.tgz cd flink-1.19.0 3&#xff0c;启动 ./bin/start-cluster.sh 4&#xff0c;访问…

吴恩达深度学习笔记:浅层神经网络(Shallow neural networks)3.9-3.11

目录 第一门课&#xff1a;神经网络和深度学习 (Neural Networks and Deep Learning)第三周&#xff1a;浅层神经网络(Shallow neural networks)3.9 神 经 网 络 的 梯 度 下 降 &#xff08; Gradient descent for neural networks&#xff09; 第一门课&#xff1a;神经网络和…

HN热帖|替换Redis的一场赛跑

3 月 21 日&#xff0c; Redis Ltd. 宣布了一项重大决定&#xff1a;Redis “内存数据存储”项目从 Redis 7.4 版本开始将以非自由的、源代码可用的许可证发布。这一消息并不受欢迎&#xff0c;但也并非完全意外。这次的变化的不同寻常之处是市面上已经有了多个 Redis 替代品可…

2024最新软件测试20个基础面试题及答案

什么是软件测试&#xff1f; 答案&#xff1a;软件测试是指在预定的环境中运行程序&#xff0c;为了发现软件存在的错误、缺陷以及其他不符合要求的行为的过程。 软件测试的目的是什么&#xff1f; 答案&#xff1a;软件测试的主要目的是保证软件的质量&#xff0c;并尽可能大…

在哪买国外服务器便宜?

在哪买国外服务器便宜&#xff1f;在寻找便宜且可靠的国外服务器商家时&#xff0c;我们需要考虑多个因素&#xff0c;包括价格、性能、可靠性、技术支持和扩展性等。下面是一些备受推崇的便宜国外服务器商家。 Amazon Web Services (AWS)。作为全球最大的云服务提供商之一&am…