感谢您的反馈!
小游戏运行过程中,内存过大是最为困扰开发者的一个问题。因为小游戏的内存使用过大时,在操作系统内存管理机制下,有可能会导致闪退或无法运行从而使得用户流失。 据统计有超过千款小游戏内存使用不佳,因内存产生的Crash率居高不小。
随着时间推移(单位:分钟),游戏在不注意资源释放的情况下很有可能会越来越大。在内存的使用中, 图形内存(graphic memory)往往是游戏内存消耗大户。对于重度游戏我们发现图形渲染所使用的内存占比更大。因此优化图形内存对于整体内存使用率的降低是非常有必要的。
对于图形渲染资源的内存使用是否有比较好的办法去降低呢? 纹理压缩是一种专为在计算机图形渲染系统中存储纹理而使用的图像压缩技术。 与普通图像压缩算法的不同之处在于,纹理压缩算法为纹素的随机存取做了优化。
目前淘宝Android支持ETC/ASTC、iOS支持PVRTC。
Android设备中一般使用ETC1压缩,一种有损的图像压缩方式。
iOS设备中采用的图像格式一般是PVR,也是一种有损的图像压缩方式。PVR压缩分为两种,PVRTC2和PVRTC4。
KTX和PKM都是纹理存储的文件格式,前者支持存储多纹理,后者只支持单纹理,大部分移动设备的 GPU 均支持这两种格式。可以有效降低设备的显存占用,提高运行效率和稳定性。
参考:https://mp.weixin.qq.com/s/V7sK1WwQ4D3LikK2AHgrZQ
在cocos creator里面进行简单的配置,就可以在打包小游戏的过程中把图片进行纹理压缩。
这里不仅能选择压缩算法,还能选择压缩算法质量等参数,非常方便。 不过目前引擎自带设置还不能支持批量操作(其实有方法解决不能批量操作的问题,这就要在cocos社区上找)。
目前LayaAir2.x版本提供的纹理压缩功能是只有VIP会员账号才能使用,可以支持批量转换的操作如下。
选择需要纹理压缩的图片所在文件夹和转换后的保存路径,接着选择使用平台按确定即可。
从上述实践过程中,我们发现:
然而,是否所有情况都适合使用压缩纹理呢? 是否还存在使用上需要注意的问题
纹理压缩的资源体积会比常规压缩算法偏大, 硬件对不同压缩算法的尺寸有要求,这也是最为影响开发者制作流程的一个因素。典型地,在Android中的ETC1纹理压缩算法需要长宽尺寸是2的N次幂, 而iOS中的PVRTC则除了2的N次幂外还要求是正方形。例如原图尺寸为 228x380 的图片,转换成 PVRTC 的 ktx后,尺寸为 512x512。 我们来举个制作不太符合此规范的资源的例子,原始图像是:879 x 1242。那么:
格式 |
纹理压缩 |
像素 |
文件大小 |
JPG |
无 |
879x1242 |
584KB |
PVRTC |
有 |
2048x2048 |
2049KB |
ETC1 |
有 |
1024x2048 |
1025KB |
可以看到,ETC1, PVRTC压缩后的文件体积比以前大很多(在考虑mipmap的情况下,还会增加30%左右) 因此,在使用纹理压缩时,最为挑战开发者的一个问题就是如何让美术资源更符合压缩算法的标准尺寸。美术资源最好是2的N次幂,在iOS PVRTC下则需要长宽相等。
Android下ETC1是不支持alpha通道的,因此还需要额外体积去多存储这部分alpha通道数据,而PVRTC则默认支持。