·来源于唐老狮的视频教学,仅作记录和感悟记录,方便日后复习或者查找
一、图集可以吃嘛?
1.什么是图集
图集就是把好几张图片打包在一起成为一张大图
2.为什么要打图集
①因为在同一图集中的图片可以作为同一批次的Draw Call发送给GPU,可以优化一些性能
问:那之间把所有图都打成图集不就好了?
答:打成图集是相当于把这些图片都放入一张大图(这张大图会保持2的次方的大小)当中,更多的图片放入会使得这张大图越来越大,使得占用的内存越来越多。所以可以看出这是一种空间换时间的优化方法。
问:那Draw Call是什么东西呀?
答:Draw Call就是CPU整理好这一次渲染需要的数据之后打包发送给GPU进行渲染的一个命令。GPU可以很快地处理Draw Call命令,但是CPU要是进行多次打包会重复很多一样的工作,在Draw Call数量过大的时候会极大地拖累渲染的速度。
更详细的说明可以去看之前的笔记:《Unity Shader入门精要》学习--基础篇--渲染流水线
【就像电脑一次复制粘贴一个10MB大小的文件到另一个位置会很快,但是同时复制粘贴每个大小是1KB,总共大小也是10MB的小文件(也就是大概10000个小文件)就会相对更慢一些了。】
UGUI中可以先把图片用着做着,最后再打图集
二、怎么打图集
1.在项目设置中把打图集功能打开
有For Builds标识的就是只有在打包之后才会真的打图集合
我们要在编辑器模式下运行后也能看见选Sprite Atlas V2 - Enabled就好了
2.创建一个图集文件
然后可以给他重命名
然后记得在打UI图片的图集的时候,这两个选项要取消勾选!(Allow Rotation一定要取消,Tight Packing可以先勾选着,要是发现出现问题了再取消勾选)
【关于这些参数是什么意思可以去看之前的笔记:Unity学习--2D相关--SpriteAtlas 精灵图集(早期的笔记编排的有些不太好,勉强勉强看一下参数的含义还行的)】
3.拖入需要打成图集的图片
这里有两种方式来拖入需要的图片
3.1.一个一个拖入图片
3.2.把图片放入文件夹然后拖入文件夹
之后在拖入了所有需要的图片按一下Pack Preview按钮
然后就能够在预览窗口看到这里打出来的图集了
注意:如果打入的图片太多导致图集太大了的话,它好像是会分成两张图来装
这两张看起来像是在同一个图集里的,但是其实确实是两张图集了已经。
实测Draw Call也确实会分成两次大小来进行发送
三、打图集的效果
1.如何查看Draw Call呢?
可以在Game窗口的【State】上查看
会自带两次Draw Call,所以什么都没有的时候是2,现在有三张图片所以是5。
2.在打图集之后运行检查
把这几张图打成图集之后,可以看出Draw Call变回3了,也就是对这三张图片只进行了1次额外的Draw Call,相比没打图集之前就减少了2次。
3.注意图片重叠
如果是两张相同图集中的图片中间又插入了一张不是该图集中的图片,那这个时候还是会分三次Draw Call进行渲染
像这个时候,我们知道中间这张图和上下的两张图并不在同一个图集当中,所以这个时候会导致本来可以在同一个Draw Call命令中发送过去的数据被截断。于是这三张图片还是发送了三次Draw Call。
所以最好的Draw Call数量就还是5了
四、代码控制
可以直接传入图集中图片的名字来获取这个图片(获取得到的是精灵类型的图片)
如果这个图集中的图片需要多次被载入调用,可以动态载入这个图集之后把它存放在一个变量当中,然后每次需要再次使用这个图集的时候直接通过这个变量来进行使用这个图集,调用里面的方法。
五、总结
①打图集是用空间换性能,需要做好权衡,不能一说口气全打包了性能就优化到最好了
②打图集之前需要在项目设置中把打图集的选项打开来。
③对UI图片进行打图集的话,要把可以让图片旋转和紧缩打包这两个选项都取消勾选,这样不容易出问题
④打图集可以一张一张拖入图集资源中,也可以直接把包含这些图片的文件夹拖进去(显然是拖文件夹更方便了)
⑤注意相同图集的图片之间不要有其他图集的图片来插入,交叉。这会导致图集白打了的
⑥通过代码控制可以在获取到图集资源之后通过图片名字读取到里面的相应图片(精灵类型)