内存优化对于在 Android 上提供稳定、高性能的游戏体验至关重要。本指南概述了内存效率的重要性、Android 操作系统如何管理进程内存限制,以及 Google Play 管理中心内的新内存指标,可帮助您监控和提升游戏的技术质量。
内存优化的重要性
优化游戏的内存对于保持玩家留存率、扩大设备兼容性以及遵守平台质量标准至关重要:
- 防止冷启动(提升用户体验和留存率):当玩家暂时切换到其他应用(例如,接听通知或查看消息)时,操作系统会将游戏进程置于后台。如果游戏的后台内存占用量过高,系统的低内存终止守护程序 (LMK) 会优先终止游戏进程,以便为前台任务回收 RAM。下次用户恢复游戏时,游戏必须经历漫长的冷启动,而不是无缝的即时暖启动,即从存储空间完全重新加载大量图形资源、音频和游戏引擎二进制文件。保持较低的后台内存用量可防止这些静默后台终止,从而保留用户状态并确保玩家可以立即恢复会话。如需详细了解系统 LMK 行为,请参阅 Android Vitals - 低内存终止守护程序指南。
- 生态系统和设备稳定性:内存用量效率低下和内存泄漏会降低整体系统运行状况。当系统内存不足时,系统会面临严重压力,导致帧速率下降、界面卡顿和音频故障。如果内存压力过大,系统的低内存回收机制 (LMK) 会主动终止后台进程,导致玩家在任务之间切换时,其他应用会经历缓慢的冷启动并丢失用户状态。
- 平台级终止:从 Android 17(API 级别 37)开始,系统会更主动地终止使用过多内存的进程。如果游戏的内存占用过高,操作系统可能会突然终止其进程,而不会生成标准堆栈轨迹。
- 设备兼容性:虽然旗舰设备的 RAM 为 12 GB 到 16 GB,但全球有很大一部分游戏玩家使用的是 RAM 为 4 GB 或 6 GB 的设备。适当的内存管理可确保游戏在所有硬件层级上保持可访问性和响应性,而无需复杂的单独资源包。
了解 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(API 级别 37)及更高版本使用 Linux cgroup v2 管理严格的按应用划分的内存限制,以防止单个应用导致系统范围的不稳定性。如需详细了解技术实现,请参阅 AOSP 内存限制器指南和优先考虑内存效率:Android 17 必备步骤博客。
- 机制:内存限制器会监控所有应用进程,并根据进程的生命周期状态动态分配限制:
- 可见进程(前台):当前显示界面的应用进程预计会运行更大的资源工作集,因此会获得更宽松的限制。
- 不可见进程(后台或服务):在不显示界面时执行活跃工作的应用进程会受到更严格的预算限制。
- 内核属性:该服务依赖于两个主要属性:
memory.high:软性限制。如果超出此值,内核会限制进程并尝试积极回收内存。这种回收可能会导致游戏性能下降。memory.swap.max:管理进程可使用的交换空间或 zRAM 空间的硬性上限。
- 终止行为:如果进程继续分配超过
memory.high的匿名内存并耗尽其交换容量,则分配会失败,并且操作系统会静默终止该进程。此终止使用ApplicationExitInfo在 Memory Limiter 退出原因下记录(从 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 纹理压缩和配置资源卸载,以确保游戏在所有硬件层级上都能流畅运行。
如需了解详情,请参阅减少内存用量。