Unity图集

讲讲Unity图集OvO

图集它是一种将多个纹理合并为一个组合纹理的资源。Unity可以调用此单个纹理来发出单个绘制调用而不是发出多个绘制调用,能够以较小的性能开销一次性访问压缩的纹理

具体来讲,就是如果将多个纹理合并成一个图集,那么涉及到这些纹理的正常绘制时,只需要调用一次DrawCall即可,方便渲染合批,降低渲染消耗。

在不借助第三方插件的情况下,Unity有两个打图集的方式

1.Sprite Packer(在Unity2020.1及之后版本弃用)

首先需要在Edit>Project Settings>Editor中找到Sprite Packer一栏,并将其设置为Always Enabled(Legacy Sprite Packer)
在这里插入图片描述
通过设置图片的Packing Tag来将其归类到不同的图集中
Unity图集_第1张图片
接着在Window>2D>Sprite Packer打开Sprite Paker窗口,点击Pack即可打图集。

2.Sprite Atlas

同样需要在Edit>Project Settings>Editor中找到Sprite Packer一栏,并将其设置为Always Enabled
在这里插入图片描述
之后创建Sprite Atlas,在Objects for Packing中指定纹理或者文件夹来打图集
Unity图集_第2张图片
新版的SpriteAtlas相比之前的SpritePacker做了更多的优化,比如可以实时查看图集的大小,图集里面元素的排列布局,并且增加了LateBinding(即不勾选include in build,会把Prefab和Atlas的依赖关系解开)等特性

相较于旧版的Sprite Packer,使用Sprite Atlas时每一个图集都是用一个单独的SpriteAtlas管理起来,图集的格式也被定义在这个资源中,预览单张图集不用像旧版的那样需要把所有的图集都集中在一个SpritePacker的编辑器窗口中预览,而是可以实时在Inspector窗口可视化预览。Sprite Packer的图集管理方式在图集数量多的时候,查找不方便还非常卡,新版的作业方式是一种分而治之的理念,更为方便和快捷。

注意:放在Resources文件夹下的图片不会被打包到图集中,打包好的图集会放在Project/Library/AtlasCache里面

3.图集整理策略及资源优化

图集整理要点

  • 图集要尽可能紧凑,并且图集本身不能太大也不要太小
  • 同一界面的小图尽可能在同一个图集中,降低DrawCall,也防止出现热更一个界面需要热更多个图集的情况
  • 被很多界面引用的图最好放在一个common图集下统一管理

需要注意图集大小需要是2的n次方,这是因为OpenGL在载入图片纹理时,所用内存会自动扩张到2的n次方,这种自动转化过程比较慢,所以提前将资源转化为符合标准的图片,这样可以提升转化速度

纹理优化
纹理优化的目的是让它们占用的内存尽量的小,纹理加载进内存后,大小计算公式如下:

纹理内存大小(字节) = 纹理宽度 x 纹理高度 x 像素字节
像素字节 = 像素通道数(R/G/B/A) x 通道大小(1字节/半字节)

优化方向:

  • 调整纹理尺寸:
    根据项目实际情况将贴图都缩小至合适的大小。这里的合适大小是指渲染对象在画面中大多数情况下不可能达到的最大尺寸,这个尺寸最好保持2的N次方。
  • 调整纹理压缩方式:
    为了让贴图在手机中运行时占用尽可能少的内存,需要设置贴图的压缩格式,目前 Unity 支持的主要压缩格式有:android 上的 ETC/ETC2,iOS 上的 PVRTC,以及未来可能会使用的 ASTC。这几个压缩格式有自己的特点:
    ETC:不支持透明通道,被所有 android 设备支持。
    ETC2:支持透明通道,Android 设备的 GPU 必须支持 OpenGL es 3.0 才可以使用,对于不支持的设备,会以未压缩的形式存在内存中,占用更多内存。
    PVRTC:所有苹果设备都可以使用,要求压缩纹理长宽相等,且是 2 的幂次(POT,Power of 2)。
    ASTC:高质量低内存占用,未来可能普遍使用的压缩格式,现在有一部分机型不支持。
  • 提高纹理复用率:
    建立共享图库。将通用的元素放至共享库,例如按钮/进度条/背景/UI通用元素等。
    用九宫格图代替大块背景图。九宫格在游戏开发中是比较常见的UI组件。
    纹理元素通过变换可组合成复合纹理。例下图,上下左右对称的背景图可以用4张相同贴图实例通过旋转/翻转后获得

4.图集打AB包

需要注意的,UGUI的图集,无论新旧,在构建AssetBundle的时候,同一个图集内的所有图元都要放在同一个AssetBundle中,否则,如果同一个图集的图元被分散到多个AssetBundle中,那么每一个AssetBundle都会包含一份这个图集的Copy,最终的结果就是包体冗余、内存膨胀和加载耗时等问题,使用Sprite Atlas时可以通过勾选include in build,并将图集也打成一个AB包来解决这个问题。

参考:

【Unity游戏开发】SpriteAtlas与AssetBundle最佳食用方案
【内存优化】图集整理策略
Unity图集Atlas使用总结
Unity 分离贴图 alpha 通道实践

你可能感兴趣的:(unity,游戏引擎)