动态图集概述
1.先看一组icon相关的图集数据:
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也是省不了的。
4.有哪些优化点
资源规划优化?
图标更新ab包大小的优化?
图集内存占用性价比不高?
DC优化?
比如上面说的礼包类图集,2048*2048最大可包含625个80*80的图标,但如果超过了,再新加一张图集去放新礼包图标?针对其中存在的一些优化点,这里讨论一种运行时动态图集的方案。
5.运行时动态图集(V1.0)
上面图标的尺寸比较规则,适合我们动态图集的处理,暂时不用去考虑复杂的动态排列。一般情况下,1024*1024的纹理图最大可包含144个80*80的图标,基本可满足使用。
思路抽象图:
具体说明:
1.散图打AB包;
2.加载该AB中用到的Sprite;
3.创建纹理,进行纹理复制;
4.设置图标sprite。
具体实现:
1.散图ab包测试
2.加载AB与指定Sprite
加载AB:
加载指定Sprite:
3.纹理复制
Graphics.CopyTexture
Texture2D.SetPixels
测试112个图标纹理复制,合成后纹理:
4.实际展示
手机上测试:(红米note4X)ETC2_RGB
(荣耀20)ETC2_RGB
tx手游助手:
这里在模拟器上日志显示,不支持GPU直接操作纹理复制,所以测试用的像素复制。SetPixels要慢GC也高。为啥模拟器上没显示?猜测是纹理格式兼容问题。(前面认真看了api就不会遇到了)
在PC上强制用像素复制+ETC2_RGB纹理格式,测试下,发现:
换成强制用像素复制+RGB24纹理格式,测试下:
换RGB24再去tx模拟器测试:
用ETC_RGB4、ETC2_RGBA8格式手机上测试:(note4X)
因此,需要注意纹理兼容的情况!
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