缩减游戏大小

本指南介绍了如何缩减游戏大小。安装时,游戏越小,所需的下载时间越短,消耗的数据流量越少。这两个优势都有助于提高安装转化次数。Google 研究表明,提供的 APK 大小增加 6 MB 会使安装率下降 1%。许多开发者都将资源从 APK 移出到内容分发网络 (CDN),但托管 CDN 以及开发和维护资源管理系统都会产生费用。

如需缩减游戏大小,请执行以下步骤:

  1. 使用经过优化的分发方法,例如 App Bundle 和 Play Asset Delivery
  2. 确定游戏的基线大小并了解其结构
  3. 看看是否有大小可缩减的资源和其他文件
  4. 检查图形纹理并发现优化机会
  5. 遵循资源方面的一般建议

使用经过优化的分发方法,例如 Android App Bundle 和 Play Asset Delivery

考虑使用以下分发方法:

  • 虽然旧版项目通常会输出 APK 以供发布,但 Google Play 上的游戏发布应使用 Android App Bundle。app bundle 会根据每位用户的设备配置提供经过优化的 APK。平均而言,app bundle 会使应用大小缩减 20%。

  • 若要通过 Google Play 提供游戏资源,并且资源大小比 app bundle 下载大小上限 (200 MB) 多出高达多个 GB,请使用 Play Asset Delivery (PAD)。此方法无需使用外部 CDN。PAD 支持三种不同的分发方法,单个游戏中可以使用任一种方法:

    • 安装时分发:在安装时下载资源。资源打包到资源包中,可替换不透明二进制 Blob (OBB) 文件。
    • 快速跟进式分发:安装后下载资源。
    • 按需分发:游戏会根据需要启动资源下载。

    PAD 要求使用 App Bundle 格式打包游戏。PAD 还可以减少开发者的 CDN(如果仍需使用 CND 的话)消耗的数据流量。

  • Google Play 会根据每位用户的设备配置,使用 Android App Bundle 生成并提供经过优化的 APK。这些经过优化的 APK 包含一组纹理资源,这些资源采用适用于设备的最佳压缩格式。配置 app bundle 以支持不同的纹理压缩格式,进而支持尽可能多的设备。

确定游戏的基线大小并了解其结构

如需熟悉游戏,确定任何指定优化所需的工作量,以及确定游戏是否下载其他资源,请执行以下步骤:

  1. 使用开发者提供的正式版(非调试版)build 或已发布 APK。
  2. 记录二进制文件的大小。该大小由开发者提供;如果游戏已发布,则可在游戏的 Play 商店页面上找到。对于 APK 大小,最重要的因素是用户必须下载多少数据才能运行实际游戏。
  3. 在设备上安装游戏,然后运行游戏,进入到游戏的初始菜单。此时,查看 Android 报告的游戏安装大小(在设置 > 存储空间下)。有些游戏的初始安装大小较小(因为这是要优化的关键指标),但会在安装后下载其他数据。有些游戏会在安装后下载多个 GB 的数据。
  4. 有些游戏仅在用户开始玩后才会下载数据。您应试玩一下游戏,以确定一般用户首次玩这款游戏时,游戏会下载多少其他数据。

看看是否有大小可缩减的资源和其他文件

本部分介绍了如何缩减 APK 中文件的大小。您可以使用 App Bundle 资源管理器下载设备专用 APK。

如需缩减直接打包到 APK 中的文件的大小,请执行以下步骤:

  1. 使用 Android Studio 中的 APK 分析器。在 Android Studio 中,依次选择 File > Profile or debug APK,然后选择您的 APK。
  2. 选择 Assets 文件夹。系统会列出每个文件的原始文件大小及其在总下载大小中所占的百分比。
  3. 查看 Assets 文件夹,并确定游戏的大部分数据所在的位置。确定是否有任何资源占用过多空间(即超过总空间大小的 1%)。尤其要注意以下各项:

    • 较大的图片和视频文件(例如 PNG、JPEG 和 mp4 文件):这些文件通常在启动画面、背景和徽标中使用。这些文件在大多数游戏中都很少使用,可以进一步压缩,而不会影响用户体验。无损 PNG 文件特别大,非常适合压缩。
    • 较大的字体文件(例如 TTF 文件):添加表情符号支持会显著增加字体文件的大小。如果字体文件大于几百 KB(千字节),请设法缩减其大小。
    • 可以合并的重复音频文件格式或版本。
  4. 如果 APK 中包含多个应用二进制接口 (ABI),请将其移至 App Bundle 或构建多个 APK。

  5. 确定二进制共享对象 (.so) 文件的大小。如需检查二进制文件,以了解是否存在可能并不需要包含在内的文件(如日志文件),您可以使用 Bloaty McBloatface 工具。如需详细了解如何优化二进制文件,请参阅编译标记和选项

  6. 查看 Android 清单文件,了解支持的图形格式。确定 APK 中是否有多个 <supports-gl-texture> 标记。如果游戏支持一个 APK 中包含多个 GPU 的格式,请考虑使用 Binomial 的 Basis Universal。此 GPU 纹理压缩系统会创建采用中间格式且可快速转码为 GPU 的纹理文件。

检查图形纹理并发现优化机会

本部分介绍了在确定游戏中使用的图形纹理是否可以优化时需要使用的工具和方法。

如需检查游戏中的纹理,请使用 Android GPU 检查器 (AGI)、RenderDoc,或 Snapdragon 分析器(仅适用于 Qualcomm Snapdragon GPU)。

注意以下各项:

  • 可调整大小以采用较小分辨率的纹理,例如在游戏中仅以较小尺寸渲染的内容所用的较大纹理。对纹理执行降采样的计算开销很大。
  • 使用了可合并为单个纹理图的多个小纹理。
  • 可在颜色通道中使用较少位数的纹理。例如,由几种纯色纹理组成的纹理。颜色的渐变和深浅需要更多位数的分辨率,因此不太适合进行压缩。
  • 探索更好的纹理压缩算法(从 ETC1 到 ETC2 和 ASTC)。
  • 在较低端的设备上加载纹理时舍弃最高的 mipmap 层级,以节省内存。Unity 的 Texture Streaming 系统可以做到这一点。

  • 请查看 Android 清单文件,以了解支持的图形格式(如果您尚未这样做)。确定 APK 中是否有多个 <supports-gl-texture> 标记。如果游戏支持一个 APK 中包含多个 GPU 的格式,请考虑使用 Binomial 的 Basis Universal。此 GPU 纹理压缩系统会创建采用中间格式且可快速转码为 GPU 的纹理文件。

资源方面的一般建议

对于 APK 的资源,请遵循以下建议:

  • 图片、音频和视频资源(非 GPU 纹理):确定是否可以进一步调整资源大小或压缩资源。游戏通常可以接受较高的压缩比。无损 PNG 文件特别大,因此非常适合压缩。
  • 图片资源(非 GPU 纹理):请考虑使用 WEBP,这是一种同时支持有损压缩和无损压缩的图片压缩格式。与 JPG 相比,有损 WEBP 对图片的压缩比要高 25% 到 34%。
  • 降低纹理分辨率:纹理远大于屏幕上最终渲染的像素数是对空间和 GPU 资源的低效利用。若想在无需重新构建游戏的情况下更改纹理并查看纹理在帧中的效果,请使用 AGI
  • 更改图形的纹理格式:选择在各个通道中使用更少位数的纹理格式。例如,考虑使用 16 位纹理格式(例如 RGB565),而非 32 位纹理格式(例如 ARGB)。如需了解详情,请参阅以下资源:

其他资源