UGUI性能优化学习笔记(三)图片和图集

Unity3D UGUI图集打包与动态使用(TexturePacker) 制作图集的好处:众所周知CPU是用来处理游戏的逻辑运算的,而GPU是用来处理游戏中图像的。在GPU中,我们要绘制一个图像需要提交图片(纹理)到显存,然后再进行绘制(在这个过程中会产生一次DrawCall),也就是说我们要绘制100张图片就要产生100次DrawCall.显然这是非常消耗性能的。这是制作图集的好处就显而易见了: ①、减少性能消耗,提高处理效率 ②、可以归类不同模... 阅读详情

一、图片

1.1 纹理压缩

虽然我们可以将JPG、PNG之类的格式导入Unity作为纹理的源文件,但实际上,在导入Unity后,会自动对其进行纹理压缩。

为什么要进行纹理压缩?
每像素位数 (bpp) 表示单个纹理像素所需的存储量。bpp 值越低的纹理在磁盘和内存中也越小。较低的 bpp 值也意味着 GPU 使用较少的内存带宽来读取纹理像素。GPU 内存带宽通常是帧率的瓶颈,因此纹理压缩有助于避免这一问题。

既然要进行纹理压缩,JPG、PNG这类格式也拥有较高的压缩率,为什么不直接作为纹理呢?
这是因为这类格式不支持像素随机访问。GPU在进行渲染时,只使用需要的纹理部分,如果采用这种格式,在访问某个像素之前,就需要解码整张纹理。这就会造成严重的性能问题。

  • 安卓平台压缩格式
    在安卓平台下,官方建议设置压缩格式为ETC2或ETC。前者支持Alpha通道,且拥有更高的质量;后者不支持Alpha通道,要使用Alpha通道需要将纹理拆分为两个,一个用于RGB,一个用于Alpha。但是ETC支持比较旧的设备,且占用空间要小很多。

上图中带有“Crunched”字样的是Unity的二次压缩格式,即在ETC的基础上再次进行压缩。它可以使压缩后的图片占用体积更小,但相应的在运行时也需要进行二次解压。

  • IOS平台压缩格式
    IOS上的压缩格式官方推荐格式为ASTC或PVRTC。前者适用于较新的设备,后者则拥有更广泛的兼容性。

1.2 精灵的多边形模式

在图片的精灵模式中,有一个「Polygon」也就是多边形模式。

在多边形模式下,打开精灵的编辑窗口,选择「Custom Outline」模式,即可自定义精灵的网格。

最后需要在Image组件中开启「Use Sprite Mesh」选项

它的作用是允许我们自定义精灵的网格。对于一个透明背景的图片来说,如果采用默认的模式,其透明背景仍然会参与渲染,而且同样会造成Overdraw。

但如果我们自定义它的顶点,让网格更贴合非透明的部分,就可以减少可能产生Overdraw的面积。但代价是增加了顶点和边的数量。这就需要结合CPU和GPU的占用情况进行权衡。

1.3 关闭图片的读写和Mip Map

对于在UI中使用的图片,如果没有需求,建议关闭下面这两个选项

开启读写会导致在运行时将图片的一份拷贝加载到内存,从而造成资源的浪费。「Generate Mip Map」是用于在3D场景下,降低远处图片的渲染质量以提高性能,但对于UI来说并没有用处。而且开启这个选项会在运行时生成多个质量不一的图片加载到内存,同样会造成资源的浪费。

二、图集

2.1 为什么需要打图集

图集就是一种将多个纹理合并为一个组合纹理的资源。在之前学习优化的过程中我们了解到,决定UI元素能否合批的其中一个关键因素就是材质ID是否相同。假如每个UI元素都使用一张独立的材质,那么它们的材质ID是不同的,也就无法进行合批,最终导致UI产生大量的Draw Call。通过将这些材质打包成一张图集就可以很好地解决这个问题。

2.2 打包图集的方式

在「Edit -> Project Settings -> Editor -> Sprite Packer -> Mode」选项中,选择启用「Sprite Atlas V1」即可开启图集打包。

主图集

接下来在资源目录里创建一个图集「Create -> 2D -> Sprite Atlas」

这里的Type选择Master,表示这是一个主图集。然后将需要打包的图片添加到「Objects for Packing」中。然后点击「Pack Preview」按钮即可开始打包。效果如下

子图集

我们也可以将图集的Type设置为「Variant」,即子图集。它需要指定一个主图集,然后会继承主图集的所有属性。不过子图集可以设置「Scale」,可以用于不同分辨率下加载不同精度的图片。

我们可以在代码中通过如下方式加载图集中的图片

public SpriteAtlas atlas;
private void Start()
{
	// 参数填图集中对应图片的名称
	GetComponent<Image>().sprite = atlas.GetSprite("技能1");
}

2.3 图集的打包原则

  • 同一UI下的图片打进同一个图集
    因为在运行时加载图集中的图片时需要将整个图集载入内存,因此对于同一UI中的图片不应该跨多个图集。
  • 对于通用的图片可以单独打一个图集
    如果某些图片需要在多个UI中复用,可以单独打包到一个图集中。在运行时常驻内存,避免频繁加载。
  • 只将较小的图片打入图集

2.4 动态图集

下面来设想一个场景。场景中是一个装备商店,商店中有数十件装备,对应有数十张图片。按照我们打图集的策略,只要将这些图片打到一个图集中,即可大幅减少Draw Call。但假如玩家要在这些装备中选择几样带在身上,那么这张由几十张图片构成的大图集就需要驻留在内存中。显然,这会造成资源的浪费。如果不将这些图片打成一个图集,又会造成大量的Draw Call。一个比较合理的解决方法是使用动态图集。

所谓的动态图集就是在运行时动态打包图集。我们可以将玩家选择的几件装备的图片动态打成一个图集。这样既可以避免大量的Draw Call,又可以防止无意义的内存占用。

具体的动态图集使用方法可以参考:https://zhuanlan.zhihu.com/p/367679754

三、参考资料

[1]. https://zhuanlan.zhihu.com/p/391885850
[2]. https://zhuanlan.zhihu.com/p/237940807
[3]. https://blog.csdn.net/linxinfa/article/details/108827197
[4]. https://zhuanlan.zhihu.com/p/399537508
[5]. https://docs.unity3d.com/cn/2021.3/Manual/class-TextureImporterOverride.html

Unity开发——UGUI优化之图集的生成与运用 制作2D游戏UI的Batches优化解决方案~ 阅读详情

相关推荐

Unity UGUI性能优化实战:从12个DrawCall降到2个的完整图集打包指南

本文提供了一份完整的Unity UGUI性能优化实战指南,核心在于通过Sprite Atlas(精灵图集)打包技术,系统性地降低DrawCall。文章详细解释了DrawCall的性能瓶颈原理,并逐步演示如何将UI界面的DrawCall从12个优化至2个,涵盖了图集创建、配置、应用验证及常见问题排查的全流程,旨在帮助开发者解决移动端UI卡顿问题。

cuda7parallel的博客 1078

Unity-UGUI控件全面解析】| Image 图片组件详解

Image是图片组件,是UGUI组件中常见的基础组件,主要用来显示图片效果。 还有其他的一些组件都会用到Image组件,比如Button组件、Dropdown组件、InputField组件等。 在这里介绍完Image,后面其他组件中用到Image的地方就不多做介绍了~ 在Unity的Hierarchy视图中选择 Create→UI→Image 创建Image组件。

努力前行,总会成为自己心中的那道光 2万+

UGUI】ui性能优化

1、性能优化包括哪些? UGUI的性能从四方面来优化 一、从CPU方面优化 1、重建界面: 尽量减少Rebuild的频率,将动态静态的元素分离,放到不同的Canvas里面 使用尽可能少的UI元素。这里指的是删除不必要的节点隐藏不用的节点。这样能减少深度排序rebuild Layout的执行时间 2、触摸事件 对应不需要接受输入的元素。一定要关闭Raycast Target选项 3.UI的隐藏显示 UI切换的时候,有两个地方非常耗时,一个是SetActive,另外一个则是SetPare

huang11055的专栏 1489

如何永久保存微信聊天记录:WeChatMsg完整解决方案

你是否曾担心那些珍贵的微信对话会随着时间而消失?家人的温馨问候、朋友的贴心话语、工作中的重要讨论,这些数字记忆都值得被永久珍藏。今天我要为你介绍一款强大的工具——WeChatMsg,它能够将微信聊天记录安全导出为HTML、Word、CSV等多种格式,并生成精美的年度聊天报告,让你的数字记忆真正属于你。 ## 🔍 为什么你的微信数据需要专业管理? 微信已经成为我们日常生活中最重要的沟通工具,但

gitblog_09805的博客 497

[Unity UGUI图集系统]浅谈UGUI图集使用

1、在工程里面使用(正常包内使用建议打成AB,更新比较方便,加载方式下面一样,工程为了方便,我将上面打好的图集放在Resources下面)我在打图集的时候发现,有一张素材中间有很大一块透明区域,导致打图集时把几个尺寸比较小的素材打到这个素材中间了,使用的时候出现下面这种情况。**写在前面,下面是自己做Demo的时候一些记录吧,参考了很多网上分享的资源。刚开始我以为是图集问题,不能将小尺寸打到中间有透明区域的大尺寸素材里面。如果你也有类似情况,选他选他选他。2、这是最喜欢的c+v环节,加载图集

weixin_43004856的博客 1940

Unity UGUI图集专题

一:图集介绍 什么是图集:我们可以将其理解为将一系列小图合并为一张大图。使用图集可以减少drawcall,提升效率。 ​ 游戏中的图片模型最终是要给到显卡去渲染的,然后CPU通知GPU要开始渲染,这一次通知就是一次Drawcall。当一个UI里面图片非常多的时候,我们可以使用图集技术将其一次性渲染。 Unity打包图集的方式有很多种,这里我们讲解种: (1)一种是使用系统自带的打包工具SpritePacker; (2)使用SpriteAtlas进行打包图集 (3)使用TexturePacker

zhuyuqiang1238的专栏 6363

Unity使用UGUI制作图集

制作图集的好处: 众所周知CPU是用来处理游戏的逻辑运算的,而GPU是用来处理游戏中图像的。在GPU中,我们要绘制一个图像需要提交图片(纹理)到显存,然后再进行绘制(在这个过程中会产生一次DrawCall),也就是说我们要绘制100张图片就要产生100次DrawCall.显然这是非常消耗性能的。这是制作图集的好处就显而易见了: ①、减少性能消耗,提高处理效率 ②、可以归类不同模块的图片 ③...

qq_38721111的博客 1万+

unity性能优化图集打包——Sprite packer Sprite Atlas 使用总结

UGUI 图集打包1. 为什么要进行图集打包2. NGUIUGUI 图集的不同3. UGUI图集打包的两种方式【3.1】 sprite packer 旧版本的图集打包方式:sprite packer第一步:设置 Mode: Always Enabled ( Legacy Sprite Packer)[Mode 各个选项的说明]第二步:设置 tag Mesh Type第步:点击Pack,完成...

weixin_36961960的博客 1万+

UGUI学习--基础--打图集

本文总结了SpriteAtlas精灵图集的使用要点:图集是将多张小图打包成一张大图,通过减少DrawCall次数来优化性能,但会增加内存占用。具体操作包括:1)在项目设置中启用图集功能;2)创建图集文件并取消UI图片的旋转紧缩选项;3)可通过拖拽单个图片或整个文件夹方式添加素材。使用时需注意:避免不同图集图片交叉排列,否则会破坏优化效果;可通过代码按名称获取图集中的精灵图片图集是典型的空间换时间优化方案,需要合理平衡内存与性能的关系。

misco43的博客 1616

UGUI的一些性能优化经验

自从Unity问世以来,UI一直都存在比较大的问题,自带的OnGUI不能所见即所得,制作过程比较麻烦。于是出现了很多第方的优秀的UI插件,比如很多项目里面用到的NGUI,或者后来出的FairyGUI。Unity官方在4.x时代开始推出了自己的新UI系统,名为UGUI。由于是官方出品,所以选择使用的人也比较多。 阿赵我也是基于信任官方出品的心理,在最近的两个项目里面都使用UGUI进行开发。UGU...

阿赵的博客 9259

UGUI-- 图集制作

1、为什么要打图集 UGUI与NGUI使用上最大的不同是,NGUI使用前就要打图集UGUI可以在之后再打图集图集的目的就是减少DrawCall,提高性能,具体Drawcall是什么取看NGUI。 简单来说,DrawCall(DC)就是CPU通知GPU进行一次渲染的命令,如果DC次数较多会导致游戏卡顿,我们可以通过打图集,将小图合并成大图,将本应n次的DC变成1次DC来提高性能 2、在Unity中打开自带的打图集功能 在工程设置面板中打开功能 Edit->Project Sett.

Go_Accepted的博客 3563

Unity 3D UGUI游戏界面 图集Atlas 以及图片显示错乱问题

每个Canvas 会自动合并下面所有元素到一个Mesh 里。Mesh 虽然可以合并在一起,但是如果贴图是分开的,那么每个贴图依然会多占用一个DrawCall。为了减少DrawCall,我们可以把多张图片合并在一个图片中,这称为Atlas(图集)。 //--创建Atlas 创建Atlas之前,请先确保 Sprite Packer 已开启。 接着在Project视图中选择Create→Spr...

songhuanfei2017的博客 1万+

Unity使用UGUI-制作图集

UGUI的AtlasNGUI的Atlas的区别,NGUI是必须先打出图集然后才能开始做界面。这一点很烦,因为始终都要去考虑你的UI图集。比如图集会不会超1024 ,图集该如何来规划等等。而UGUI的原理则是,让开发者彻底模糊图集的概念,让开发者不要去关心自己的图集。做界面的时候只用小图,而在最终打包的时候unity才会把你的小图并在一张大的图集里面。然而这一切一切都是自动完成的,开发者不需要去...

hehe_CSDNALS的博客 834

Unity性能优化UGUI优化篇

Unity性能优化UGUI篇里,优化UGUI主要对内存、DrawCall等进行优化。以下为常见的优化方法。

m0_64251659的博客 3355

Unity性能优化之 - 图集

版权声明:本文为CSDN博主「X Y126」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_38721111/article/details/79870373 原文链接: https://www.jianshu.com/p/bdc39395f768 制作图集的好处: 众所周知CPU是用来...

sindyra的博客 2415

Unity UGUI5——图集

​ 字面理解 DrawCall,就是绘制呼叫的意思,表示 CPU(中央处理器)通知 GPU(图形处理器-显卡)就是 CPU (处理器)准备好渲染数据(顶点,纹理,法线,Shader 等等)后告知 GPU(图形处理器-显卡)开始渲染(将命令放入命令缓冲区)的命令​ 简单来说:一次 DrawCall 就是 CPU 准备好渲染数据通知 GPU 渲染的这个过程​ 如果游戏中 DrawCall 数量较高会影响 CPU 的效率,最直接的感受就是游戏会卡顿​ 以拷贝文件来进行类比。

weixin_53163894的博客 2110
上一篇: 拓扑排序与关键路径
下一篇: Unity Animancer插件(二)精确控制
夜槿笙歌
博客等级 码龄7年 173粉丝 82原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值