《影子冒险》—— 资源管理篇
前言
这篇文章记录一下,我独立开发微信小游戏的过程中遇到的资源管理问题,以及对应的优化策略。如果有帮助到大家,可以来体验看看我的小游戏哦,可以扫二维码,或者在微信上搜索《影子冒险》哦。

车辆FBX资源过大
我使用的是Unity资源商店中购买的一整套不带Animation的车辆模型,举一个模型为例子,它的文件格式如下:

整个fbx文件中,除了网格资源以外,还夹杂着材质和预制体文件,导致整个fbx文件资源莫名其妙的达到了2.3MB

但是,我们其实只需要使用它的网格资源就可以了,而且一个车子模型,就包含车身+4个不同位置车轮=5个网格参数,会导致5次drawcall,这代价也有点高昂了。所以,对它进行优化是十分有必要的,优化的方式,就是将车子模型的所有子节点网格提前合并成一个网格。具体的合并代码,可以参考我另一篇博文:《影子冒险》—— 美术优化篇,这里就不贴代码进行介绍了。
将合并好的网格,作为资产在本地存储起来,查看它的大小,发现资源大小减缩到惊人148KB,数据体积压缩至原大小的 6.3%,缩减比率达到93.7%,还是十分惊人的。

纹理贴图格式
在游戏开发中,Unity引擎在最终发布的游戏运行时不会直接使用常见的图片格式(如JPG/PNG/TGA/PSD),而是会将它们转换为显卡专用的纹理压缩格式。原因有2点:
- 上述提到的格式解压后的像素数据(RGBA32)会占用大量显存,例如一张1024*1024的RGBA32纹理会占用到4MB显存(1024*1024bytes)。
- GPU读取效率低,GPU需要快速访问纹理数据,但上述那些格式在被读取前,还需要先被CPU解压才可以使用。
而采用目标显卡支持的压缩格式(例如ASTC\ETC\DXT\BC7)则具有以下好处:
- 硬件加速解压:这些格式是GPU原生支持的,解压过程由显卡硬件直接完成,无需CPU参与。
- 显存占用低:游戏运行时,GPU直接读取压缩后的纹理格式,无需解压到原始像素格式。
- 渲染性能提升:压缩纹理减少了数据量,提高了纹理采样速度。
但要注意,如果采用了目标显卡不支持的纹理压缩格式,Unity会尝试通过格式回退机制,最坏会导致Unity将纹理格式改为未压缩格式(例如RGBA32)。
在WebGl平台,Unity对于透明纹理默认采用DXT5|BC3格式,对于不透明纹理采用DXT1|BC1格式,前者能达到3.25:10的压缩比,后者差不多达到0.4:10的压缩比,效率都算非常不错了。但是对于我而言,是没法使用的,因为我目标是打成微信小游戏,是需要运行在安卓和iso端,所以我就采用两者通用的ASTC的格式进行压缩了,这个纹理压缩格式也是微信官方推荐的。我最终决定采用压缩比和质量都比较均衡的ASTC8x8进行压缩,压缩比有0.8:10,非常nice,质量也没有损失多少。
这里可以查看,unity官方推荐各个平台的压缩纹理格式:各平台的推荐、默认和支持的纹理压缩格式
这里可以查看,微信官方推荐纹理压缩方法文档:微信小游戏压缩纹理工具2.0(Beta)
有点要注意,当打包图集时,原始纹理格式最好选定为RGBA32格式,不要进行任何压缩,避免图集二次压缩带来的精度损失,在这种情况下,unity也会警告提示:Source Texture of Sprite (settings) is using compressed format. To ensure no loss in source pixel details when packing to SpriteAtlas, please use uncompressed format in TextureImporter.
模型采用LZ4压缩后反而比之前大
在开发中遇到了一个很古怪的事情,我一个模型资源未进行AB压缩(采用LZ4格式)之前是2M,压缩后反而剧增到了8M,上网搜集了下资料,LZ4是速度导向型算法,优势在于极快的解压速度,而非压缩率。当数据重复率低或无法找到有效匹配模式时,压缩后的文件可能反而更大。
而FBX文件中的Mesh数据,通常会包含大量不重复的的顶点坐标、法线、UV等数据,这类数据重复率低且相邻数据差异较小,导致 LZ4 的滑动窗口(默认 64KB)难以找到重复模式。
所以,我们就可以从这方面入手,考虑剔除掉一下用不到的数据,因为我的游戏玩法,是模型映射到地面上形成的影子作为主角,所以对于我的模型而言,只不过需要模型顶点、骨骼(动作)这2种数据即可。打开Fbx的Inspector面板,将所有的法线、切线、UV相关数据都设置成不导入,关掉Read/Write(必须关,如果你需要操作顶点数据还开了这个,会导致多生成一份在内存当中)。将Mesh Compression等级调整到High:

再次导出,可以惊喜的发现,导出的ab包大小来到惊人的280K,直接起飞!

浙公网安备 33010602011771号