Unity —— SpriteAtlas + Include in Build

news/2025/3/19 13:16:38/文章来源:https://www.cnblogs.com/chenxiayun/p/18780078

前言

image
在使用atlas Sprite的过程中,会忍不住产生一个疑问,atlas是做什么用的,这个include in Build的含义是什么呢,以及它是否应该被勾选。网上查阅到了很多资源,有的说这个选项大胆勾选,有的说这个选项勾选完后图集打包后的纹理在游戏启动后,会一直常驻内存,需要自己做好Later Binding。

说法之间互相冲突,各种道理都有,越看越迷糊,遂忍不住自己做下实验,查验atlas Sprite include in Build的作用,以及勾选与否对于内存产生的影响。

在实验之前,先说下实验环境:

  1. 使用Unity版本:2022.3.53
  2. 使用sprite mode:Sprite Atlas V2 -Enabled

测试1

image
第一个测试,atlas打包Sprite文件夹中的散图,但只对atlas文件进行ab打包,Sprite文件夹中的散图不打包。打包后,通过AssetStudio进行ab包逆向,可以查看到所有散图都被打进一个图集中去了,并不会有冗余情况。
image

测试2

第二个测试,同时将atlas和散图资源一起打成ab包,可以发现效果是一样的,unity是有做优化的,所有散图都被打进一个图集中去了,并不会有冗余情况。
image

测试3

image
在测试1的基础,我们增加个UI预制体,里面增加对该图集中两个散图的引用(就是直接使用散图,不用理会图集),并将该UI预制体同atlas一起打成ab包,标记atlas的Inculde in Build为false。查看Addressables Report,发现图元索引被打进ui的ab包中,但没有把图集索引打进ab包中。
image
此时动态加载ui预制体,是没办法帮你主动先加载图集的。会出现白图的情况。
image

测试4

在测试3的基础上,我们将atlas改成Include in Build,可以看到Image.prefab直接引用图集的ab包,同时打出的ab包竟然相较于不勾选Include in Build会更小。可能跟压缩算法有关系,但这里不做探究。
image
此时动态加载ui预制体,不会产生白图情况,drawcall数量也是正常的。
image

测试5

在来看看内存占用情况,根据官方文档,勾选Include in Build后,会在游戏一开始,就将图集加入内存当中,我们来验证下实际情况,首先编写代码,在游戏启动后,2s后加载ui预制体,再2s后删除ui预制体。

using System.Collections;
using UnityEngine;
using UnityEngine.AddressableAssets;public class LoadGO : MonoBehaviour
{public string path;public Transform parent;IEnumerator Start(){yield return new WaitForSeconds(2);GameObject go = null;var handle = Addressables.LoadAssetAsync<GameObject>(path);handle.Completed += (handle) =>{go = GameObject.Instantiate(handle.Result);go.transform.SetParent(parent);go.transform.localScale = Vector3.one;go.transform.localPosition = Vector3.zero;};yield return new WaitForSeconds(2);GameObject.Destroy(go);Addressables.Release(handle);}
}

运行起来,可以看到,在第326帧时,Texture占用情况是378.1M
image
在第327帧是378.4M
image
在第425帧是378.1M
image
可以说明,翻译应该是有误的,勾选Include in Build后,并不会游戏启动后就加载到内存当中,也不会一直常驻,引用图集的资源被释放后,图集也就被释放了。

总结

至此,所有测试完毕,做个总结吧。

  1. 将散图同时跟atlas文件一起打包,或是单独打包atlas文件,对于unity而言结果是一样的,unity不会单独打散图资源。
  2. 勾选Include in Build,引用该图集的ab包,会添加对图集ab包的引用关系;不勾选,则不会添加对图集ab包的引用关系,需要自己做好later binding,否则会产生白图的情况。
  3. Unity在打包时,对于勾选了Include in Build的情况是有做优化,在勾选的情况下,打出的ab包的比不勾选的更小。
  4. 勾选Include in Build后不会在游戏启动就将图集资源加载进内存当中,而是按需加载,当所有引用该图集的资源被释放后,该图集也就被释放。

所以说,放心大胆的使用Include in Build,对于性能是没有害处的。

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

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

相关文章

2025预测:PLM系统集成AI的7种智能决策应用场景

随着科技的飞速发展,产品生命周期管理(PLM)系统与人工智能(AI)的集成正逐渐成为企业提升竞争力的关键因素。这种集成不仅能够优化产品开发流程,还能在多个环节实现智能决策,为企业带来前所未有的价值。在2025 年,我们有望看到 PLM 系统集成 AI 后在众多领域展现出强大的…

PLM项目管理软件在汽车行业的应用案例

PLM项目管理软件在汽车行业的应用案例 汽车行业作为制造业的重要组成部分,面临着日益复杂的产品研发、生产管理等挑战。在这样的背景下,PLM(产品生命周期管理)项目管理软件应运而生,为汽车企业提升竞争力提供了有力支持。PLM项目管理软件涵盖了从产品概念设计到产品退役的…

java自学学习路线笔记+实践项目+面试八股文

基础知识巩固Java基础:掌握基本语法、数据类型、控制结构、面向对象等核心概念。推荐学习资源:韩顺平老师的B站课程。 Java进阶:深入学习集合框架、IO流、反射、注解等高级特性。 Java并发:理解线程、锁、并发工具类等,为高并发项目开发打基础。数据库技术MySQL:掌握SQL语…

awdp pwn

ciscn&ccb半决第十八届CISCN&CCB半决赛 awdp pwn typo snprintf() 是一个 C 语言标准库函数,用于格式化输出字符串,并将结果写入到指定的缓冲区,与 sprintf() 不同的是,snprintf() 会限制输出的字符数,避免缓冲区溢出。 C 库函数 int snprintf(char str, size_t …

matlab并行计算

parfor比较难用,要求变量之间不能有干扰,必须能相互独立,这里推荐一下parfeval,相当于多开了n个matlab。 parfeval可以并行运行同一个函数,赋值不同的参数。 首先创建并行池-: p = parpool(2);%这里相当于使用了两个核心,根据你的CPU核心数决定。parfeval用于并行执行代…

1.4K star!几分钟搞定AI视频创作,这个开源神器让故事可视化如此简单!

story-flicks 是一个基于AI技术的自动化视频生成工具,能够将文字剧本快速转化为高质量短视频。开发者@alecm20通过深度学习算法,实现了从文本解析到视频合成的全流程自动化处理,支持多平台适配输出,是内容创作者和自媒体运营者的效率神器。 嗨,大家好,我是小华同学,关注…

C#实现自己的Json解析器(LALR(1)+miniDFA)

C#实现自己的Json解析器(LALR(1)+miniDFA) Json是一个用处广泛、文法简单的数据格式。本文介绍如何用bitParser(拥有自己的解析器(C#实现LALR(1)语法解析器和miniDFA词法分析器的生成器))迅速实现一个简单高效的Json解析器。 读者可在(JsonFormat)查看、下载完整代码。 J…

R语言中绘制火山图

001、# 生成随机数据 set.seed(123) # 设置种子以便结果可重复 genes <- paste("Gene", 1:1000) # 基因名称 logFC <- rnorm(1000, mean = 0, sd = 2) # log2 fold change,均值为0,标准差为2的正态分布 pvalue <- runif(1000, min = 0, max = 1) # p值…

Windows 系统安装 Python3.7 、3.8、3.9、3.10、 3.11 最新版,附带相应程序。

在 Windows 系统上下载和安装 Python 的教程: 下是 Python 3.7 到 3.11 每个版本在 Windows 64 位系统下最后更新版本的直接下载地址。 其他版本访问Python 官方网站。 Python 3.7.9此版本为 Python 3.7 系列最后更新版本,下载地址:python-3.7.9-amd64.exePython 3.8.10它是…

库存持有成本的底层运算逻辑是什么?

你可能会觉得,库存持有成本这个概念听起来有点抽象: 库存不就是放在仓库里待着吗,怎么还会“花钱”? 其实,库存持有成本就是你把货物放在仓库里,背后所产生的一系列费用。 这些费用包括仓库租金、保险费用、商品的折旧损耗,还有库存过期的风险等等。 今天,我们就来拆解…

Windows部署deepseek R1训练数据后通过AnythingLLM当服务器创建问答页面

如果要了解Windows部署Ollama 、deepseek R1请看我上一篇内容。 这是接上一篇的。 AnythingLLM是一个开源的全栈AI客户端,支持本地部署和API集成。它可以将任何文档或内容转化为上下文,供各种语言模型(LLM)在对话中使用。以下是关于Windows环境下使用AnythingLLM API的一些…

变量数据类型流程控制

常量变量 常量 1.概述:在代码的运行过程中,值不会发生改变的数据 2.分类:整数常量:所有整数小数常量:所有带小数点的2.5 1.5 2.0字符常量:带单引号的 单引号中必须有且只能有一个内容1(算) 11(不算) (不算) a1(不算) (算) (两个空格不算)写一个tab键(算) 字符…