内存优化对于在 Android 上提供稳定、高性能的游戏体验至关重要。本指南概述了内存效率的重要性、Android 操作系统如何管理和强制执行进程内存限制,以及 Google Play 管理中心中公开的新阈值,以帮助您监控和改进游戏的技术质量。
内存优化的重要性
优化游戏的内存对于保持玩家留存率、扩大设备兼容性以及遵守平台质量标准至关重要:
- 防止冷启动(用户体验和留存率):当玩家 暂时切换离开您的游戏(例如,接听 通知或查看消息)时,操作系统会将游戏 进程置于后台。如果游戏的后台内存占用量过高,系统的低内存终止守护程序 (LMK) 会优先终止游戏进程,以便为前台任务回收 RAM。下次用户恢复游戏时,游戏必须经历漫长的冷启动,而不是无缝且即时的暖启动,即从存储空间完全重新加载大量图形资源、音频和游戏引擎二进制文件。保持较低的后台内存用量可以防止这些静默后台终止,保留用户状态,并确保玩家可以立即恢复会话。如需详细了解 系统 LMK 行为,请参阅 Android Vitals - 低内存终止守护程序 指南。
- 生态系统和设备稳定性:内存用量效率低下和内存 泄漏会降低整体系统运行状况。当系统内存不足时,系统会面临严重压力,导致帧速率下降、界面卡顿和音频故障。如果内存压力过大,系统的低内存终止守护程序 (LMK) 会积极终止后台进程,导致玩家在任务之间切换时,其他应用会经历缓慢的冷启动并丢失用户状态。
- 平台级终止:从 Android 17(API 级别 37)开始,系统会更主动地终止使用过多内存的进程。如果游戏的占用量过高,操作系统可能会突然终止其进程,而不会生成标准堆栈轨迹。
- 设备兼容性:虽然旗舰设备配备 12 GB 到 16 GB 的 RAM,但全球游戏玩家中有很大一部分使用的是配备 4 GB 或 6 GB RAM 的设备。适当的内存管理可确保您的游戏在所有硬件层级上保持可访问性和响应能力,而无需复杂的单独资源软件包。
了解 Android 中的内存
为了设计有效的内存预算策略,开发者必须了解 Android 平台如何管理物理内存,以及如何衡量游戏的活跃占用量。
核心 Android 内存概念
如需了解有关平台级内存管理的基本概念,请参阅 官方 内存管理概览 文档。此资源涵盖四个架构领域:
- 内存概览:Android 使用分页和内存映射 (mmap) 来管理 RAM。它不支持磁盘上的传统交换文件;相反,它依赖于页面压缩(使用 zRAM)和页面回收来释放物理内存。
- 进程间的内存分配:Android 在整个 系统中共享 RAM。它为 Dalvik 或 ART 虚拟机执行分配特定的堆,同时允许原生开发环境(例如 C++ 游戏引擎)从原生系统堆请求内存。
- 应用内存管理:Android 在多进程模型下运行, 希望应用动态监控其生命周期状态,并 主动释放不必要的资源(例如未缓存的图形和 位图),以支持系统运行状况。
- 进程和线程概览:系统根据进程当前的用户感知可见性和重要性将进程分类到 层次结构中,从而确定在内存不足的情况下哪些进程保持活跃,哪些进程首先终止。
总内存占用量指标
平台级 Android 17 内存限制器使用总内存占用量(而不是总常驻大小 [RSS] 或虚拟内存大小)来评估进程消耗。
总内存占用量 = 匿名 RSS (RssAnon) + 未压缩的交换空间 (VmSwap)
为了防止游戏超出平台强制执行的限制,开发者必须准确了解这些指标在系统级别上的含义。如需详细了解这些指标、物理 RAM 分配以及如何处理文件支持的 页面,请参阅了解 RSS 和交换空间指标在监控 内存用量指南。
内存限制
为了保持系统稳定性并确保应用不会消耗过多资源,Android 平台会对正在运行的进程强制执行内存限制。
Android 17 及更高版本中的内存限制器
Android 17 及更高版本使用 Linux cgroup v2 强制执行严格的每应用内存限制,以防止单个应用导致系统范围的不稳定性。如需详细了解技术实现,请参阅 AOSP 内存限制器指南和 优先考虑内存效率:Android 17 的基本步骤博客。
- 机制:内存限制器会监控所有应用进程,并
根据进程的生命周期状态动态分配限制:
- 可见进程(前台):当前显示 界面的应用进程预计会运行更大的资源工作集,并获得 更宽松的限制。
- 不可见进程(后台或服务):在不显示界面的情况下执行 活跃工作的应用进程会受到更严格的 预算限制。
- 内核属性:该服务依赖于两个主要属性:
memory.high:软限制。超出此限制后,内核会限制进程并尝试积极回收内存。这种回收可能会导致游戏性能下降。memory.swap.max:对进程可以使用的交换空间或 zRAM 空间强制执行硬上限。
- 终止行为:如果进程继续分配匿名
内存超出
memory.high并耗尽其交换空间容量,则分配会失败, 并且操作系统会静默终止该进程。此终止会使用ApplicationExitInfo在内存限制器退出原因下进行记录 (从 Android 17、26Q4 开始提供)。
监控内存用量
为了有效地优化游戏的内存,您必须首先了解 Android 平台如何衡量其占用量。Android 17 会更新内存强制执行指标,以跟踪匿名 RSS (RssAnon) 和未压缩的交换空间 (VmSwap) 的总和,但不包括文件支持的内存或 GPU 私有内存。本指南详细介绍了如何利用 Perfetto 和 meminfo 等系统级工具、实现 ProfilingManager 和 onTrimMemory 等诊断 API,以及在 Unity 和 Unreal Engine 中提取精确的内存分配。了解如何准确分析游戏,并避免与传统运行时内存轮询相关的性能卡顿。
如需了解详情,请参阅监控内存用量。
内存缩减策略
虽然游戏引擎简化了跨平台开发,但其默认内存处理可能会触发操作系统级内存限制。本页详细介绍了专门针对 Unity 和 Unreal Engine 的实用优化步骤。了解为什么依赖于基于 Java 的 onTrimMemory 会导致 Unity 中的死锁,以及如何改用原生生命周期回调。您还将了解关键的资源级优化,例如使用 ASTC 8x8 纹理压缩和配置资源卸载,以确保游戏在所有硬件层级上流畅运行。