# 压缩纹理使用(Beta) 因为目前Unity导出的WEBGL游戏只支持DXT1和DXT5,在移动端上并不支持,而且除非使用Addressable这种将图片打包出来的手段,否则也会导致包体过大。为了解决这两个问题。我们提供了这个功能,让Unity游戏也能在移动端自动支持ASTC和ETC2的压缩纹理。而且图片也自动做了按需加载,无需再单独拆分打包。 简单总结使用我们的压缩纹理的好处: - 降低内存、减少解码消耗 - 自动懒加载,降低包体 `注意:` 使用压缩纹理的图片或者图集,宽高需要为4的倍数,否则不会转化为移动端的压缩纹理。对于需要动态读取图片内容做处理的,目前还不支持将其转为压缩纹理。 ## 原理简介 简单来说,我们使用占位符的方式将纹理图片设置为ETC1格式,然后在运行时再根据占位符去加对应纹理的压缩纹理格式。从而达到了减少内存和自动懒加载纹理的效果。 ## 使用 ### 1、安装NodeJS 下载并安装[NodeJs](https://nodejs.org/en/) ### 2、Mac上授权 因为Mac上的隐私安全问题,使用mac的用户需要先授权,使用window的用户跳过这步。点击"微信小游戏"->"MacOS脚本授权",进行授权,直到不报错为止。若授权后还是报错,则需重启unity后再点授权。 ### 3、打bundle文件 如果使用了bundle文件,要先打好AB或AB包。注意不要开启crc对bundle进行校验。且纹理格式不要使用RGBA Crunched DXT5或RGB Crunched DXT1格式,但可以使用RGBA Compressed DXT5等其他格式。 ### 4、导出游戏 点击"微信小游戏"->"转换小游戏" 打开转换小游戏弹窗,点击左下角的"导出WEBGL并转化为小游戏"按钮等待导出游戏即可 ### 5、处理bundle文件 点击"微信小游戏"->"包体瘦身--压缩纹理",点击处理bundle,如果自定义了bundle生成路径,要将bundle复制到导出目录的webgl目录下。如果项目用到的图片比较多这一步可能需要花费较长时间,比如10多分钟。执行完后请留意控制台的提示信息。 导出后的纹理所在目录: ![avatar](../image/cm-texture1.png) ### 6、根据提示用NodeJs生成纹理 进入WX-WASM-SDK/Editor/Node 目录用命令行,执行 ’node compress_astc_only.js‘ (开发阶段使用,只生成部分格式纹理) 或 ’node compress_all.js‘(上线时候使用,生成全部格式纹理) 命令来生成纹理。 ### 7、上传CDN 对应的资源应该选用webgl-min目录下的资源,比如webgl-min里的Assets目录,StreamingAssets目录,和xxx.webgl.data.unityweb.bin.txt 这些文件,应将其上传至CDN对应目录才能正确展示。 ## QA: ### 1. 生成的纹理太大 * PC端上预览的时候展示的是PNG图片会比较大,手机上用的是带txt后缀的,如astc.txt, 这些文件压缩率很高,注意正式环境CDN一定要开启Brotli或者Gzip,这样加载的时候纹理就会很小。速度快很多。建议优先使用Brotli ### 2. 资源上传至CDN的注意事项 * 上传至CDN时,请注意要按二进制传输,强制storebinary,如果按文本传输也会出现加载回来的图片成黑色。 ### 3. Unity升级至2021后已支持ASTC,是否无需再使用微信压缩纹理工具 - Unity引擎自身压缩纹理:更统一的工作流;ASTC能支持最近3-4年大部分机型;但PC端不支持ASTC依然需要解压。 - 微信压缩纹理工具:支持不同平台的自适应(ETC2,ASTC,DXT);同时纹理从ab中剥离出来,使得ab占用内存更小。 - 建议:如果是中轻度,对于内存和PC端不需要DXT可使用Unity自身的ASTC即可。对于重度游戏(MMO、SLG),非常看重内存和不同平台适配,则使用微信压缩纹理。