關於記憶體管理

如要在 Android 上提供穩定、高效能的遊戲體驗,記憶體最佳化至關重要。本指南將概略說明記憶體效率的重要性、Android 作業系統如何管理程序記憶體限制,以及 Google Play 管理中心的新記憶體指標,協助您監控及提升遊戲的技術品質。

記憶體最佳化的重要性

最佳化遊戲記憶體,對於維持玩家留存率、擴大裝置相容性,以及遵守平台品質標準至關重要:

  • 防止冷啟動 (使用者體驗和留存率):當玩家暫時切換離開遊戲 (例如回覆通知或查看訊息),作業系統會將遊戲程序置於背景。如果遊戲的背景記憶體用量過高,系統的記憶體不足終止工具 (LMK) 會優先終止遊戲程序,回收 RAM 供前景工作使用。下次使用者繼續遊戲時,遊戲必須經過漫長的冷啟動,從儲存空間完整重新載入大型圖像資源、音訊和遊戲引擎二進位檔,無法順暢快速地熱啟動。保持較低的背景記憶體用量,可避免這些背景終止作業,保留使用者狀態,並確保玩家能立即繼續工作階段。如要進一步瞭解系統 LMK 行為,請參閱「Android Vitals - 記憶體不足終止程式」指南。
  • 生態系統和裝置穩定性:記憶體用量效率不佳和記憶體流失會降低整體系統健康狀態。系統記憶體不足時,系統會面臨嚴重壓力,導致影格率下降、UI 卡頓和音訊故障。如果記憶體壓力過大,系統的記憶體不足終止器 (LMK) 會積極終止背景程序,導致其他應用程式在玩家切換工作時,發生冷啟動速度緩慢和使用者狀態遺失的情況。
  • 平台層級終止:從 Android 17 (API 級別 37) 開始,系統會更主動終止使用過多記憶體的程序。如果遊戲的記憶體用量過高,OS 可能會突然終止程序,而不會產生標準堆疊追蹤。
  • 裝置相容性:雖然旗艦裝置配備 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 (API 級別 37) 以上版本會使用 Linux cgroup v2,嚴格管理每個應用程式的記憶體限制,防止個別應用程式造成整個系統不穩定。如要進一步瞭解技術實作,請參閱 AOSP 記憶體限制器指南和優先提升記憶體效率:Android 17 的重要步驟網誌。

  • 機制:記憶體限制器會監控所有應用程式程序,並根據程序的生命週期狀態動態指派限制:
    • 可見程序 (前景):目前顯示 UI 的應用程式程序預期會執行較大的資源工作集,因此會獲得較寬鬆的限制。
    • 不可見程序 (背景或服務):應用程式程序在不顯示 UI 的情況下執行有效工作,會受到更嚴格、更受限的預算限制。
  • 核心屬性:這項服務仰賴兩項主要屬性:
    • memory.high:軟限制。超過上限時,核心會限制程序,並嘗試積極回收記憶體。這項回收作業可能會導致遊戲效能降低。
    • memory.swap.max:管理程序可使用的交換或 zRAM 空間硬上限。
  • 終止行為:如果程序持續分配匿名記憶體,超過 memory.high 並耗盡交換容量,分配就會失敗,OS 會在不通知的情況下終止程序。系統會使用 ApplicationExitInfo 記錄這項終止作業,並將結束原因歸類為「記憶體限制器」(自 Android 17、26Q4 起提供)。

Play 管理中心 Android Vitals 的新記憶體限制

為協助開發人員主動找出記憶體問題,Google Play 在 Play 管理中心的 Android Vitals 中推出新指標。Play 管理中心會追蹤遊戲工作階段的第 90 百分位數 (P90) 匿名 RSS + 交換記憶體用量,找出極端離群值。

警告和強制執行門檻會根據裝置的實體 RAM 容量和程序狀態進行調整。這些限制會分兩個階段實施。

如需詳細指南和記憶體限制,請參閱「Android Vitals - 不良行為門檻為何?」。

使用者感知服務

可感知服務是 Android 系統認為使用者會注意到的重要背景程序。這個狀態涵蓋所有執行中的程序:

  • 前景服務 (FGS)
  • 加急作業
  • 使用者啟動的資料移轉工作
  • 系統繫結服務或由其他應用程式繫結的服務

由於 Perceptible 服務是專為在背景執行重要、長時間執行的工作而設計,因此很容易發生累積生命週期外洩。Android 平台記憶體限制會將此狀態視為非前景,也就是說,如果遊戲在背景執行,但繼續執行可感知服務,則會受到 Play 說明中心頁面顯示的更嚴格背景或服務記憶體限制。遊戲從前景移至背景可感知服務狀態時,必須積極刪除不必要的資產。

R8 規定

為盡可能縮減位元碼大小,並減少基本 Java 程序負擔,Google Play 管理中心會根據應用程式品質指南評估程式碼最佳化。如要進一步瞭解遊戲適用的最佳化規定和限制,請參閱 Android Vitals 說明文件中的「DEX 程式碼最佳化」。

如要在標準 Android 專案中設定 R8,請按照「啟用應用程式最佳化功能」指南操作。如要啟用進階縮減和最佳化設定,請參閱「在完整模式下使用 R8」。如要找出哪些規則導致 R8 無法模糊處理類別或移除無效程式碼,請使用 R8 設定分析器。

如果您使用遊戲引擎建構,預設 R8 行為會因引擎和版本而異:

點陣圖規定

在現代高擬真度遊戲中,點陣圖會占用大量記憶體用量。在 Android 8.0 (API 級別 26) 以上版本中,點陣圖像素資料會直接儲存在未受管理的原生堆積中,因此未經最佳化的圖片載入作業可能會導致程序超出平台記憶體門檻。如需圖片縮放和快取的最佳做法,請參閱「最佳化圖片使用方式」。

監控記憶體用量

如要有效最佳化遊戲記憶體,您必須先瞭解 Android 平台如何測量記憶體用量。Android 17 更新了記憶體指標,追蹤匿名 RSS (RssAnon) 和未壓縮交換空間 (VmSwap) 的總和,但不包括檔案備份或 GPU 私有記憶體。本指南將詳細說明如何使用 Perfetto 和 meminfo 等系統層級工具、實作 ProfilingManager 和 onTrimMemory 等診斷 API,以及在 Unity 和 Unreal Engine 中擷取精確的記憶體配置。瞭解如何準確分析遊戲,並避免與傳統執行階段記憶體輪詢相關的效能卡頓。

詳情請參閱「監控記憶體用量」。

記憶體用量縮減策略

雖然遊戲引擎可簡化跨平台開發作業,但預設的記憶體處理方式可能會觸發 OS 層級的記憶體限制。本頁面將詳細說明專為 Unity 和 Unreal Engine 量身打造的實用最佳化步驟。瞭解為何依賴 Java onTrimMemory 會導致 Unity 發生死結,以及如何改用原生生命週期回呼。您也會瞭解重要的資產層級最佳化做法,例如使用 ASTC 8x8 紋理壓縮和設定資產卸載,確保遊戲在所有硬體層級都能順暢執行。

詳情請參閱「減少記憶體用量」。