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也会被正确引用到。它俩生命周期是一致的,没必要单独打。

完结!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

旅游管理系统|基于springBoot旅游管理系统设计与实现(附项目源码+论文)

基于springBoot旅游管理系统设计与实现 一、摘要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本旅游管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助…

国产暴雨AI服务器X3418开启多元自主可控新篇章

在当前数字化转型的大潮中&#xff0c;算力作为新质生产力的重要动力引擎&#xff0c;对推动经济社会发展起着关键作用。尤其在人工智能领域&#xff0c;随着高性能、安全可控的AI算力需求持续攀升&#xff0c;国产化服务器的研发与应用显得尤为迫切。 作为国内专业的算力基础…

Netty核心原理剖析与RPC实践6-10

Netty核心原理剖析与RPC实践6-10 06-粘包拆包问题&#xff1a;如何获取一个完整的网络包 本节课开始我们将学习 Netty 通信过程中的编解码技术。编解码技术这是实现网络通信的基础&#xff0c;让我们可以定义任何满足业务需求的应用层协议。在网络编程中&#xff0c;我们经常…

Java八股文(高并发,分布式,JUC)

Java八股文の高并发&#xff0c;分布式&#xff0c;JUC 高并发&#xff0c;分布式&#xff0c;JUC 高并发&#xff0c;分布式&#xff0c;JUC 对于高并发的系统&#xff0c;为了提高用户的体验&#xff0c;你是如何做的&#xff1f;或者说高并发的技巧你用过哪些&#xff1f; …

Webpack生成企业站静态页面 - ajax请求

一些项目因需求不同&#xff0c;如需SEO或小项目&#xff0c;使用angular、react或vue就大材小用了。可以通过webpack、gulp这些构建工具&#xff0c;也能快速完成html页面开发&#xff0c;并且也能使用less/sass/styus等样式预编译功能&#xff0c;以及将js、html分模块、分组…

【昇腾系列产品应用】英码科技EA500I边缘计算盒子接口使用示例和目标检测算法演示(附视频)

EA500I是英码科技联合华为昇腾精心打造的AI边缘计算盒子&#xff0c;其搭载昇腾310系列处理器&#xff0c;可提供20TOPS INT8 的计算能力&#xff0c;并设计了丰富的外围接口&#xff0c;包括Type-C系统调试口、LINE音频接口、USB3.0*2、千兆LAN*8、WAN*1、5G/4G、GNSS天线口、…

构建ELK+Filebeat+kafka+zookeeper大数据日志分析平台

主机IP 角色 所属服务层 部署服务 192.168.11.11 日志生产 采集层 filebeat 192.168.11.12 日志缓存 数据处理层、缓存层 Zookeeperkafkalogstash 192.168.11.13 192.168.11.14 日志展示 持久、检索、展示层 Logstashelasticsearchkibana 数据流向 filebeat--…

git仓库太大只下载单个文件或文件夹

有没有这样的苦恼&#xff1a;仓库太大&#xff0c;只想下载其中某些文件(夹)&#xff1f; 一招解决&#xff1a;bash down_folder_from_git.sh 运行前&#xff0c;先修改开头三个变量 原理: 稀疏检出 让工作树仅包含自定义的文件 #!/usr/bin/bash addrhttps://github.com/fac…

时序预测 | Matlab实现CPO-BP冠豪猪算法优化BP神经网络时间序列预测

时序预测 | Matlab实现CPO-BP冠豪猪算法优化BP神经网络时间序列预测 目录 时序预测 | Matlab实现CPO-BP冠豪猪算法优化BP神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现CPO-BP冠豪猪算法优化BP神经网络时间序列预测&#xff08;完整源码…

每天五分钟卷积神经网络:如何基于滑动窗口技术完成目标的检测?

汽车检测算法 现在我们想要构建一个汽车检测算法,我们希望输入到算法中一张图片,算法就可以帮助我们检测出这张图片中是否有汽车。 数据集 首先创建一个标签训练集,x是样本,y是标签。我们的训练集最好是被剪切过的图片,剪掉汽车以外的部分,使汽车居于中间位置,就是整张…

安卓开机动画

目录 一、开机动画的2种模式1.1 android模式2.2 movie模式 二、开机动画代码运行位置三、删除开机动画四、自定义开机动画实践 一、开机动画的2种模式 一种是使用两张图片利用某种效果来造成动态&#xff0c;另一种则是用一个图包循环显示的方式来形成动态。当然&#xff0c;这…

uinapp触底与下拉时间触发的使用

在UniApp中&#xff0c;onReachBottom 和 onPullDownRefresh 是两个重要的生命周期函数&#xff0c;分别用于处理页面滚动到底部时触发的事件和下拉刷新时触发的事件。 在页面的 .vue 文件中&#xff1a; <template> <view> <scroll-view scroll-y"tr…

React Native框架开发APP,安装免费的图标库(react-native-vector-icons)并使用详解

一、安装图标库 要使用免费的图标库&#xff0c;你可以使用 React Native Vector Icons 库。 首先&#xff0c;确保你已经安装了 react-native-vector-icons&#xff1a; npm install --save react-native-vector-iconsnpm install --save-dev types/react-native-vector-ic…

Arcgis中使用NDVI阈值法提取农田shape

首先有一幅NDVI影像TIFF&#xff0c;对其查看农田上的NDVI范围&#xff0c;大概是0.1以上&#xff0c;因为是12月份&#xff0c;小麦播种完1-2个月&#xff0c;此时NDVI并不是很高&#xff0c;但是树林基本叶子掉落了&#xff0c;所以比较好提取农田。 打开地图代数-栅格计算器…

OpenHarmony OpenCV应用样例开发

背景 OpenCV 介绍 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习软件库。它由一系列的 C 函数和少量 C 类构成&#xff0c;同时提供 Python、Java 和 MATLAB 等语言的接口&#xff0c;实现了图像处理和计算机视觉方面…

一则关于Go的高级构建指北

本文将探索Golang高级构建技巧&#xff0c;从而有助于创建更高效的二进制文件。 构建选项 以下是 go build 命令最常用的一些选项&#xff1a; -o: 指定输出文件名。默认输出文件名是主软件包的名称&#xff0c;在 Windows 系统中会自动添加 .exe 后缀。-v: 详细输出。该选项…

产品经理的进阶之路

1. 前言 本文深入剖析了产品经理这一职业从产品专员起步,逐步晋升为产品经理、高级产品经理,直至产品总监的整个职业发展路径。在每个阶段,产品经理都需承担不同的工作职责,展现出独特的职业特点。 2. 产品专员 关键词【产品需求/原型/文档/沟通】 对于初步接触产品领域…

Remote Desktop Manager for Mac:一站式远程桌面管理,高效掌控所有连接!

Remote Desktop Manager for Mac是一款专门用于远程桌面管理的软件。它的主要功能包括&#xff1a; 远程连接管理&#xff1a;Remote Desktop Manager允许用户集中管理所有远程连接&#xff0c;包括远程桌面、远程服务器、虚拟机、云服务等&#xff0c;用户可以一次性登录并管理…

Pocket 2荧光拍摄的几个有趣玩法

荧光是现象&#xff0c;当某种常温物质经某种波长的入射光&#xff08;通常是或&#xff09;照射&#xff0c;吸收光能后进入&#xff0c;并且立即退激发并发出出射光&#xff08;通常波长比入射光的波长&#xff0c;原先看不见的短波长紫外线&#xff0c;变成在可见光波段的可…

java算法day38 | 动态规划part01 ● 509. 斐波那契数 ● 70. 爬楼梯 ● 746. 使用最小花费爬楼梯

理论基础 递归五部曲&#xff1a; 确定dp数组&#xff08;dp table&#xff09;以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组 509. 斐波那契数 动规五部曲&#xff1a; 这里我们要用一个一维dp数组来保存递归的结果 确定dp数组以及下标的含义 dp…