DragonWind

关于Unity图集的一些事情

主要包括图集合批和打包的一些事情。

前面是一些碎碎念和一些实验,不想看的话可以跳到总结那一章。

SpritePacker的Mode

参见https://docs.unity3d.com/2022.2/Documentation/Manual/SpritePackerModes.html

条件准备

Mode选用Sprite Atlas V2 - Enabled

现在有三张图片sp0,sp1,sp2,在一个图集tp中。

有一个图集tp,勾选Include in Build

场景中有两个Image组件。

我把sp0打在一个AB包中AB0

我把sp1打在另一个AB包中AB1

我把sp2打在同一个AB包中AB1

第一种情况

现在我运行时加载AB包,AB0,从AB0中加载Spritesp0,赋给Image0组件。

现在我运行时加载AB包,AB1,从AB1中加载Spritesp1,赋给Image1组件。

会合批吗?

不会

第二种情况

现在我运行时加载AB包,AB1,从AB1中加载Spritesp1,赋给Image0组件。

继续从AB1中加载Spritesp2,赋给Image1组件。

会合批吗?

结论

在同一个图集中,如果图集里的图片分散在不同的AB包中,那么无法合批。只有在同一AB包中的才能合批。原因下面会讲。

分析一下打包的manifest文件

ClassTypes:
- Class: 28
  Script: {instanceID: 0}
- Class: 213
  Script: {instanceID: 0}
- Class: 687078895
  Script: {instanceID: 0}
SerializeReferenceClassIdentifiers: []
Assets:
- Assets/boss_skill_001.png
- Assets/boss_skill_002.png
Dependencies: []

注意到ClassTypes有三种,28对应Texture213对应Sprite687078895对应SpriteAtlas。表示这个ab包确实有SpriteAtlasClassType参见

为什么会有Texture呢?因为图集包含sprite,而原始sprite的格式就是Texture

奇怪的是在Assets下只有进包的图片,但是没有*.spriteAtlasv2。原因下面会讲。

再来看一下不勾选Include in Build的情况

ClassTypes:
- Class: 213
  Script: {instanceID: 0}
SerializeReferenceClassIdentifiers: []
Assets:
- Assets/boss_skill_001.png
- Assets/boss_skill_002.png
Dependencies: []

可以看到只剩下一个类型213就是Sprite

比较两个AB包的大小,包含图集的AB包为19k,不包含的为3k。很正常,因为图集存储需要空间。

还有什么新发现,资源冗余

图集有三张图,0和1在一个AB包中,2在另一个AB包中。

不勾选Include in Build时,大小为3k,2k

勾选Include in Build时,大小为19k,19k

也就是说同一个图集同时进了两个AB包,资源冗余

如何避免资源冗余:给图集单独打AB包

勾选或者不勾选Include in Build,同时给图集单独打一个AB包,发现两个图片的AB包大小又变回了3k,2k。图集的AB包的大小为18k。

ClassTypes:
- Class: 28
  Script: {instanceID: 0}
- Class: 213
  Script: {instanceID: 0}
- Class: 687078895
  Script: {instanceID: 0}
SerializeReferenceClassIdentifiers: []
Assets:
- Assets/New Sprite Atlas.spriteatlasv2
Dependencies:
- G:/AB/b1.ab
- G:/AB/b3.ab

分析manifest文件,发现这个图集AB包依赖于另两个图片AB包。

如果第一个AB包有两张图片,第二个AB包有一张图片和图集呢?

勾选或者不勾选Include in Build,发现第一个AB包3k,第二个AB包19k

ClassTypes:
- Class: 28
  Script: {instanceID: 0}
- Class: 213
  Script: {instanceID: 0}
- Class: 687078895
  Script: {instanceID: 0}
SerializeReferenceClassIdentifiers: []
Assets:
- Assets/boss_skill_003.png
- Assets/New Sprite Atlas.spriteatlasv2
Dependencies:
- G:/AB/b1.ab

分析第二个AB包的manifest文件,发现这个包依赖于第一个包。

使用Sprite的时候,他怎么知道我这个Sprite在哪个图集

生成图集的时候,Sprite也会生成信息,指向该sprite对应的图集;

总结

打包的时候

使用的时候

如果不勾选Include in Build

如果勾选Include in Build,并且没有手动把SpriteAtlas打进去

如果勾选Include in Build,并且把SpriteAtlas打进了AB包