微信小游戏纹理压缩及缓存问题反馈

产品类型是放置、合成类型的游戏,项目最终美术资源有60M。根据玩家反馈信息得出:iPhone6、iPhone6s手机崩溃率较高。现阶段采取纹理压缩方式降低内存


关于整个纹理压缩的流程:
一、在编辑器里设置需要压缩的美术资源。在我们项目中android手机采用的etc1,iPhone手机采用的是pvrtc4格式。
二、把导出的所有纹理压缩文件(.pkm,.pvr)用gzip压缩
三、小程序客户端下载相应的压缩文件,下载完成后,解压相应的压缩文件,再供引擎使用。

说明:美术资源纹理压缩后的资源要比png文件大好几倍,为了减少用户的下载时间,对纹理压缩后的资源用gzip再次压缩。

在这个流程中有许多风险:
1)刚刚说了纹理压缩后的资源再次用gzip进行了压缩,但是gzip压缩后的文件不能被引擎直接使用,需要解压后才能被正常使用。而微信下载正常的.png文件,得到的是一个临时文件,这个临时文件直接被引擎使用。请问:我这样手动的解压gzip在实际的情况下有没有风险?(iPhone6、iPhone6s手机测试暂时没有发现异常情况)

2)我们项目中的美术资源过大,用户正常玩游戏,在一个段时间后,本地游戏包大小会达到50M,在用户后续的游戏中,下载的美术资源无法再写入本地。请问:引擎会不会自动清理本地暂时不用的文件、wx-downloader.js中的cleanOldCaches接口在何时调用?

3)对于正常的.png文件,小游戏客户端直接使用的是下载后的临时文件,如果本地游戏包达到50M后,只会影响临时文件写入本地的过程,并不会影响整个游戏(无非下次进入游戏重新下载罢了)。但是对于gzip压缩包来说,微信的unzip接口只能解压到本地路径下,如果游戏包达到50M后,unzip就会失败,导致无法正常游戏。请问:后续引擎是否直接支持读取gzip压缩文件?

急需引擎组的解答!!!


  • Creator 版本:2.1.4

  • 目标平台:微信小游戏

为啥要自己gzip压缩呢?
CDN上直接配置对.pkm, .pvr启用http gzip不就行了?

这是我们测试源和CDN不同格式,启用gzip的结果:

怎么具体使用?学习

我在oss上对.pkm .pvr文件的设置了content-Encoding:gzip
实际测试并没有减少下载文件的大小

纹理压缩是挺大的,对于小游戏来说50M不太适用,一张jpg背景pvr就有2M,完全玩不了,gzip能压缩多少?

gzip为了减少游戏下载资源时间

压缩后也不会减少多少,还是很大,也是个头疼的问题

在传输效率上是要快很快。但是本地缓存需要在合适的时机清理了。

不仅仅是oss源要设置,cdn域名下也要设置的。
因为发布后,使用的是cdn的地址。
源那里设置只是在cdn节点到源之间是以gzip传输。

缓存文件大小是一个问题,
但需要纠结的一个地方:你在js层实现的gzip,比起浏览器对http gzip实现的性能要差得多的。
自己做gzip减少了缓存文件大小,但效率更低了。

是的。自己实现解压gzip,有很多坑,小游戏下载的资源是临时文件,直接被引擎使用。自己解压后的文件不能为临时文件。

我们体验版本的资源没有使用cdn,直接放在了oss上。在小游戏客户端请求资源.pkm .pvr资源是设置成这样header: {“Accept-Encoding”:“gzip”}

肯定使用cdn的。。。。
默认的源本来有一个用来请求的地址,那个地址去域名管理里能看到(腾讯云),
然后域名管理里可以指定配置gzip(腾讯云叫智能压缩),
并不是客户端请求时使用gzip的header请求就可以了

我们使用第三方JS库 上传资源时对全部的pkm pvr文件进行压缩后 上传CDN
用户在下载完成资源后 重写wx-download的读取文件方法 当检测到读取pkm pvr文件 就使用库解压到内存 返回给回调使用

我是按照你的个流程做的。解压使用的是微信的接口unzip,解压出来的文件是写在本地,并不是内存中的。

因为体验版的缘故就暂时没有使用cdn。
正式包版本是使用cdn

在阿里云里已开通cdn,在cdn里开启了(智能压缩)


这是阿里云支持gzip压缩传输的文件格式。

.pkm .pvr文件的内容格式为:application/octet-stream

经过测试也证明下载文件大小并没有减少

腾讯云的智能压缩好像可以自定义压缩类型的。阿里云智能压缩好像不支持的

如果你本身已经gzip压缩了文件,
然后cdn上的配置就没效果了。
对gzip内容进行二次gzip没啥作用。

我们是源与cdn域名(测试url的域名)都配置gzip。

不要使用微信解压接口 自己使用第三方JS库嵌套到游戏里面 让第三方库解压到内存 而不是硬盘 这样就可以最大限度避免硬盘IO的问题

明白了

使用微信的接口,有很多局限。我试试这样方案