本指南介绍如何减小游戏的大小。安装后,较小的游戏需要更少的时间下载和更少的数据。这两者都会导致更高的安装转化率。Google 研究表明,提供的APK大小增加6 MB会导致安装率下降1%。许多开发人员将资产从APK移动到内容分发网络 (CDN),但随后会在托管CDN以及开发和维护资产管理系统方面产生成本。
要减小游戏的大小,请执行以下步骤
使用优化的交付方法,例如Android应用捆绑包和Play Asset Delivery
考虑以下交付方法
虽然传统项目通常输出APK进行发布,但在Google Play上发布的游戏应使用Android应用捆绑包。应用捆绑包提供针对每个用户设备配置量身定制的优化APK。平均而言,应用捆绑包可将应用大小减少20%。
要通过Google Play提供游戏资产并超过应用捆绑包的200 MB下载大小限制,最多可达多个GB,请使用Play Asset Delivery (PAD)。不需要外部CDN。PAD支持三种不同的交付方法,每种方法都可以在单个游戏中使用
- 安装时:安装后下载资产。资产打包在资产包中,这些资产包替换了不透明二进制 Blob (OBB) 文件。
- 快速后续:安装后下载资产。
- 按需:游戏根据需要启动资产下载。
PAD要求游戏使用应用捆绑包格式打包。PAD还可以减少开发人员CDN(如果仍然需要)使用的数据量。
Google Play使用Android应用捆绑包为每个用户的设备配置生成和提供优化的APK。这些优化的APK包含一组纹理资产,并使用设备的最佳压缩格式进行格式化。配置您的应用捆绑包以支持不同的纹理压缩格式,以支持最广泛的设备。
确定游戏的基线大小并了解其结构
要熟悉游戏,确定任何给定优化所需的工作量,并确定游戏是否下载了其他资产,请执行以下步骤
- 使用开发人员提供的生产(非调试)版本或已发布的APK。
- 记录二进制文件的大小,无论是开发人员提供的,还是如果游戏已发布,则在游戏的Play商店页面上。对于APK大小,最重要的因素是用户必须下载多少数据才能运行实际游戏。
- 在设备上安装游戏并运行到初始游戏菜单。此时,检查Android报告的游戏安装大小(在**设置>存储**下)。某些游戏具有较小的初始安装大小,因为这是要优化的关键数字,但在安装后会下载其他数据。有些游戏在安装后会下载数GB的数据。
- 有些游戏只有在你开始玩它们之后才会下载数据。您应该玩一会儿游戏以确定游戏为第一次玩游戏的典型用户下载了多少其他数据。
搜索可以减小尺寸的资产和其他文件
本节介绍如何减小APK中文件的大小。您可以使用应用捆绑包浏览器下载特定于设备的APK。
要减小直接打包到APK中的文件的大小,请执行以下步骤
- 使用Android Studio APK分析器。在Android Studio中,选择**文件>分析或调试APK**并选择您的APK。
- 选择**Assets**文件夹。对于每个文件,都会列出原始文件大小和总下载大小的百分比。
查看**Assets**文件夹并确定游戏数据的大部分位于哪里。确定是否有任何资产占用过多的空间(即超过总量的1%)。特别是,寻找以下内容
- 大型图像和视频文件(例如,PNG、JPEG和mp4文件):这些文件通常用于启动画面、背景和徽标。这些文件在大多数游戏中很少使用,并且可以在不影响用户体验的情况下进一步压缩。无损PNG文件特别大,并且是压缩的极佳候选对象。
- 大型字体文件(例如,TTF文件):如果您添加表情符号支持,它会大大增加字体文件的大小。如果字体文件大于几百KB,请考虑减少其大小的方法。
- 可以组合的重复音频文件格式或版本。
确定共享对象 (.so) 文件的二进制大小。要检查二进制文件以查看是否存在不需要包含的内容(例如日志文件),您可以使用Bloaty McBloatface工具。有关如何优化二进制文件的更多信息,请参阅编译标志和选项。
查看Android清单文件以获取支持的图形格式。确定APK中是否存在多个
<supports-gl-texture>
标签。如果游戏在一个APK中支持多个GPU的格式,则考虑使用Binomial的Basis Universal。此GPU纹理压缩系统以中间格式创建纹理文件,可以快速转码到GPU。
检查图形纹理并确定优化机会
本节介绍确定游戏中使用的图形纹理是否可以优化的工具和方法。
要检查游戏中的纹理,请使用Android GPU Inspector (AGI)、RenderDoc或仅适用于高通骁龙GPU的Snapdragon Profiler。
查找以下内容
- 可以调整大小到更低分辨率的纹理,例如,游戏中仅以较小尺寸渲染的大型纹理。纹理降采样计算量很大。
- 使用多个可以组合成单个纹理贴图的小纹理。
- 可以使用较少位数颜色通道的纹理。合适的候选对象是具有少量纯色纹理的纹理。渐变和颜色阴影需要更高的位数分辨率,因此不是好的候选对象。
- 探索更好的纹理压缩算法,从 ETC1 到 ETC2 和 ASTC。
在低端设备上加载纹理时丢弃顶层 mipmap 层以节省内存。Unity 的 纹理流系统 可以做到这一点。
如果您尚未执行此操作,请查看 Android 清单文件以了解支持的图形格式。确定 APK 中是否存在多个
<supports-gl-texture>
标签。如果游戏在一个 APK 中支持多个 GPU 的格式,则考虑使用 Binomial 的 Basis Universal。此 GPU 纹理压缩系统以中间格式创建纹理文件,可以快速转码到 GPU。
资源的一般建议
按照这些建议为 APK 的资源操作
- 图像、音频和视频资源(非 GPU 纹理):确定这些资源是否可以进一步调整大小或压缩。对于游戏,通常可以接受更高的压缩率。无损 PNG 文件特别大,因此是压缩的绝佳候选对象。
- 图像资源(非 GPU 纹理):考虑使用 WEBP,这是一种用于有损和无损压缩的图像压缩格式。有损 WEBP 比 JPG 压缩图像多 25% 到 34%。
- 降低纹理分辨率:比最终在屏幕上渲染的像素数大得多的纹理是空间和 GPU 资源的低效使用。要更改纹理并在无需重建游戏的情况下查看其在帧中的显示效果,请使用 AGI。
- 更改图形的纹理格式:使用每个通道使用更少位的纹理格式。例如,使用 16 位纹理格式(如 RGB565)而不是 32 位纹理格式(如 ARGB)。有关更多信息,请参阅以下内容