动态图集概述
1.先看一组icon相关的图集数据:
![E0NbwYsbzuKgWUwEUxrx.png](https://tigimg-1252093452.image.myqcloud.com/2020/04/30/E0NbwYsbzuKgWUwEUxrx.png)
2.普通道具相关散图打包测试
上面表格中,普通道具是一张1024*2048的图集,RGB ETC2 4bit压缩格式下占1M内存,打包出的安卓ab为610KB。
普通道具这里有299个小图标,尝试打包299个散图到ab,打包出的安卓ab为436KB。
3.一些问题思考
*更新图标
图标有更新,一个图标需要大图集更新。比如上面分类中的礼包如果新加或修改了某个图标(几k),安卓至少有一个849kb的更新。这里是一个资源规划问题,需根据具体项目具体分析。
*内存占用
各类图标在游戏中展示时,内存占用性价比不高,比如展示一个礼包图标,安卓ab包里的大图load出来后会占2M内存。
*DC
比如背包里,我们可能会展示各类型的图标,假设有上面5个不同种类同时展示的话,安卓下相关图集会占0.5+1+0.25+0.5+2=4.25M。且这5个dc也是省不了的。
![H9PHR008q96daYD5lYUg.png](https://tigimg-1252093452.image.myqcloud.com/2020/04/30/H9PHR008q96daYD5lYUg.png)
4.有哪些优化点
资源规划优化?
图标更新ab包大小的优化?
图集内存占用性价比不高?
DC优化?
比如上面说的礼包类图集,2048*2048最大可包含625个80*80的图标,但如果超过了,再新加一张图集去放新礼包图标?针对其中存在的一些优化点,这里讨论一种运行时动态图集的方案。
5.运行时动态图集(V1.0)
上面图标的尺寸比较规则,适合我们动态图集的处理,暂时不用去考虑复杂的动态排列。一般情况下,1024*1024的纹理图最大可包含144个80*80的图标,基本可满足使用。
思路抽象图:
![gWKgHsQKegvz97i6zY7N.png](https://tigimg-1252093452.image.myqcloud.com/2020/04/30/gWKgHsQKegvz97i6zY7N.png)
具体说明:
1.散图打AB包;
2.加载该AB中用到的Sprite;
3.创建纹理,进行纹理复制;
4.设置图标sprite。
具体实现:
1.散图ab包测试
![ONMmGr9hP5hw9MoIXphB.png](https://tigimg-1252093452.image.myqcloud.com/2020/04/30/ONMmGr9hP5hw9MoIXphB.png)
2.加载AB与指定Sprite
加载AB:
![1UvrhmjfXmc6aKy6EYCp.png](https://tigimg-1252093452.image.myqcloud.com/2020/04/30/1UvrhmjfXmc6aKy6EYCp.png)
加载指定Sprite:
![IKMIJULnmenos3d1ZmVU.png](https://tigimg-1252093452.image.myqcloud.com/2020/04/30/IKMIJULnmenos3d1ZmVU.png)
3.纹理复制
![unE1fbEFbae35phco9yT.png](https://tigimg-1252093452.image.myqcloud.com/2020/04/30/unE1fbEFbae35phco9yT.png)
Graphics.CopyTexture
![Pw56F9Rw2IAcJkp25Baw.png](https://tigimg-1252093452.image.myqcloud.com/2020/04/30/Pw56F9Rw2IAcJkp25Baw.png)
Texture2D.SetPixels
![eKoGmjDa8FEwyYvUnijg.png](https://tigimg-1252093452.image.myqcloud.com/2020/04/30/eKoGmjDa8FEwyYvUnijg.png)
测试112个图标纹理复制,合成后纹理:
![PJoHjL5JFTgUtbC9uzP9.png](https://tigimg-1252093452.image.myqcloud.com/2020/04/30/PJoHjL5JFTgUtbC9uzP9.png)
4.实际展示
![W5m9FlPZN3J0PKj4ylSx.png](https://tigimg-1252093452.image.myqcloud.com/2020/04/30/W5m9FlPZN3J0PKj4ylSx.png)
![HKPbWDOZzVmSa76Yrc21.png](https://tigimg-1252093452.image.myqcloud.com/2020/04/30/HKPbWDOZzVmSa76Yrc21.png)
手机上测试:(红米note4X)ETC2_RGB
![7s2YIoUMZxp1WHlmP3iw.png](https://tigimg-1252093452.image.myqcloud.com/2020/04/30/7s2YIoUMZxp1WHlmP3iw.png)
(荣耀20)ETC2_RGB
![t4YhpqcStt77vgOXzvTx.png](https://tigimg-1252093452.image.myqcloud.com/2020/04/30/t4YhpqcStt77vgOXzvTx.png)
tx手游助手:
![rarM5UJA3ZeFAFvdrwHA.png](https://tigimg-1252093452.image.myqcloud.com/2020/04/30/rarM5UJA3ZeFAFvdrwHA.png)
这里在模拟器上日志显示,不支持GPU直接操作纹理复制,所以测试用的像素复制。SetPixels要慢GC也高。为啥模拟器上没显示?猜测是纹理格式兼容问题。(前面认真看了api就不会遇到了)
在PC上强制用像素复制+ETC2_RGB纹理格式,测试下,发现:
![FxFgqu4pitQhYe1JYtY9.png](https://tigimg-1252093452.image.myqcloud.com/2020/04/30/FxFgqu4pitQhYe1JYtY9.png)
换成强制用像素复制+RGB24纹理格式,测试下:
![jaSjEjsSjufAwWBrhS2w.png](https://tigimg-1252093452.image.myqcloud.com/2020/04/30/jaSjEjsSjufAwWBrhS2w.png)
换RGB24再去tx模拟器测试:
![lkePvVvIpTcEZx9r05s8.png](https://tigimg-1252093452.image.myqcloud.com/2020/04/30/lkePvVvIpTcEZx9r05s8.png)
用ETC_RGB4、ETC2_RGBA8格式手机上测试:(note4X)
![iNodMmAQIqtLLSxb2NR1.png](https://tigimg-1252093452.image.myqcloud.com/2020/04/30/iNodMmAQIqtLLSxb2NR1.png)
因此,需要注意纹理兼容的情况!
Exact rules for which formats are compatible vary a bit between graphics APIs
6.拓展方向
支持纹理动态size适应;
支持不规则贴图纹理排列;
Ios未做测试
7.资料
https://docs.unity3d.com/ScriptReference/Rendering.CopyTextureSupport.html
https://docs.unity3d.com/ScriptReference/Graphics.CopyTexture.html
https://docs.unity3d.com/ScriptReference/Texture2D.SetPixels.html
https://blog.csdn.net/nxshow/article/details/90724350
https://blog.zhangshirong.com/2019/01/118.html
https://zhuanlan.zhihu.com/p/38004837