探寻ASTC纹理压缩后,内存下降的实际值

  • Creator 版本: 3.8.6
  • 目标平台: 微信小游戏

起因是做的游戏测试在某些IOS机型上点击开始游戏必闪退,尝试砍掉很多预加载后出一个新的体验版,再用对应机型反复测试两个体验版,有预加载的体验版点击开始游戏必定闪退,不进行预加载的体验版点击开始游戏就不会闪退(游戏逻辑经过很多天的测试了,其他机型都没问题,不大可能是逻辑报错导致的),于是猜测是内存占用过高导致了闪退,开始进行内存优化。

根据抖音官方文档: 性能优化_小游戏_抖音开放平台,第一步:让美术同学对大尺寸的图片进行九宫格剪裁,能复用的则复用,尽量减少总体图片尺寸。

为了验证占用内存是否降低,借助了微信小游戏的云测试服务,优化图片尺寸前后分别打了体验版,提交云测试,前后数据对比如下:


可以看到,结果筛选了相同设备后,验证出内存占用下降明显,有高达17%的下降,对于某些闪退机型来说,这个百分比的下降很可能就是闪退和不闪退的天壤之别。
我让测试同学再次用闪退的机型去测试,发现点击开始游戏时确实也不闪退了。

到这一步其实已经初步解决因为内存而导致的闪退问题了,不过看到抖音官方文档: 优化普通小游戏内存_小游戏_抖音开放平台 提到对图片进行ASTC压缩,能让内存减少70%+,非常心动,想继续尝试一下。

于是将项目里所有自动图集和手动图集勾选了“压缩纹理”,最初使用的是ASTC8x8,打包出来后手机运行时发现图片太糊了,完全不能接受,于是分别尝试了8x8、6x6、5x5,对比了视觉效果、文件大小、内存占用,数据如下:

· 视觉效果:
· ASTC 8x8:很糊,完全不能接受;
· ASTC 6x6:比8x8好一点,但图片依然出现了毛刺,依然不能接受;
· ASTC 5x5:毛刺消失了,接近png的效果;

· 文件大小(bundle大部分勾选了zip压缩方式):
· png:构建后原始大小40MB,经过pngquant压缩后17MB
· ASTC 8x8:24.8MB
· ASTC 6x6:38MB
· ASTC 5x5:50MB

· 内存占用(依然使用微信云测试服务,使用的都是经过了图片尺寸优化的游戏版本,仅压缩纹理的格式的不同):
· png vs ASTC6x6:


· ASTC 6x6 vs ASTC 8x8:
可以看到,经过ASTC压缩后,内存占用的结果相对于png格式,并无明显变化,完全没有“70%”这样子夸张的变化。

疑问:为什么经过ASTC压缩后,内存并无明显下降呢?有大佬指点一下吗?

ASTC配置是排在PNG前面的吗

没有配置png,只配置了ASTC一个选项,构建出来的产物里也只有.astc没有.png

图片二次幂了吗?

你可以查查什么机型,有些机型不支持astc

bundle zip压缩,只是变成zip包,应该是会释放文件到缓存目录,
加载时其实是加载解压后内容先进内存再进显存
加载文件时有可能是导致内存峰值更高的原因之一

感觉不是这里的问题,他说的是bundle 这个包用的是zip方式,你下载了bundle 然后解压缩成散文件,这个过程不占内存,只占CPU,然后加载的都是包里面的那些散文件了,如果是加载ASTC 那根本不会和内存打交道的 直接进显存了就

先本地找一台设备测试一下吧,减少一些干扰因素。

有少数几张图,构建时警告说非二次幂,压缩纹理的配置将失效。但大部分图的astc都是构建成功的,从构建后的产物的体积确实变化了也能看出来。

你这个是3.7及以下的文档版本,3.8版本文档写了小游戏都是支持的

你啊 打个安卓包 AS里比较一下就知道了其实 这个最直观

好,我打个包试试

这个前后,有关系吗?

不是直接进显存的
先读取文件进内存,
ASTC就不需要解码直接传递给显存
PNG就需要先解码为argb数据
你看前面给出的抖音文档的示图。

2赞

来源于抖音文档

题主都没有配PNG,只有ASTC,如果设备不支持的ASTC的话,图像都显示不出来

我也好奇为么题主开启了纹理压缩,内存看起来毫无变化?

我分别用png和ASTC8x8打了安卓包,运行时使用androidStudio的Profiler查看内存,发现两个包内存占用还是差不多,在260MB~290MB之间波动。

ASTC 8x8:


PNG:

可以肯定纹理压缩是生效了的,因为ASTC 8x8的画质明显很糊。

:rofl:

你的图片占的比例是不是太小了,就是内存可能都是其他部分占用的,虽然图片压缩了,但这部分比例很小?

1赞

有可能,一张2048*2048的图片不压缩内存也就16M。引擎本身打开就占了几百M的内存。如果他只是拿几张图测试是很有可能这样的