最近在做性能优化,发现图集占用内存比较大,想做下优化,最简单的办法,修改压缩格式,我们项目以前用的大部分UI图集还是RGBA 16bit,那肯定要改成ASTC了。
说做就做,一通改完以后,真机运行,天,为什么内存比原先的还大了1倍。一张2048*2048的图集,压缩格式设置为ASTC,但运行时内存占用却是16M! 很明显ASTC没生效,用了RGBA 32bit的格式
PS:官方文档友情提醒:如果使用目标平台不支持的纹理压缩格式,则纹理将被解压缩为RGBA 32,并与压缩的纹理一起存储在内存中。发生这种情况时,会浪费时间对纹理进行解压缩,并且会丢失内存,因为您将纹理存储两次。
所有是我的手机不支持了??
官方提供的支持的设备
IOS手机从A8就支持了(iPhone6及以上)
继续使用Unity提供的API打印一下是否支持:(打印结果false)
SystemInfo.SupportsTextureFormat(TextureFormat.RGB_ASTC_6x6); //具体枚举自己看下就行(我的版本是48-59代表ASTC所有格式)
中间历程省略。。。。。。
最终找到原因:
在Edit > Project Settings > Player>Other Settings中有一个Auto Graphics API
目前IOS 平台可以添加三个 metal,OpenGL ES 2.0,OpenGL ES 3.0
如果你的真机支持ASTC,并且Unity版本>= Unity5.5(我的是Unity2017.4,具体最低支持的忘记啦,自行百度吧),图集设置ASTC后仍然不生效,请看这里的选项。如果使用的是OpenGL ES 2.0,恭喜,这个就是不支持。 其他两个测试都是支持的。
那么区别是什么呢,请看:
OpenGL ES 2.0,OpenGL ES 3.0 的区别
那么能改吗?OpenGL ES 2.0改成3.0 只要面向用户的设备支持就行,如果不支持,它会顺位用下一个API,想要兼容的话就添加两个就可以。
对于支持的设备请看:
metal 的最低支持iphone5s ios9,这个被苹果吹爆,但没研究过,有兴趣的童鞋可以自己查下。
最后PS一下官方对于这个选项的解释:
https://docs.unity3d.com/2017.4/Documentation/Manual/GraphicsAPIs.html