한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

遊戲 Lag 白皮書 › L1 用戶端遊戲程式

用戶端記憶體洩漏 Client memory leak

原因 ID cg-leak · 主要負責 遊戲開發團隊(用戶端開發)

在含圖解與實驗的完整版中開啟卡片 →

開得越久,記憶體用量越大,遊戲越來越慢,最後被強制關閉。

為什麼 切換地圖時,貼圖、UI、特效沒有釋放 → 於是 GC 越來越頻繁,OS 記憶體不足而發生 swap → 畫面上 玩了幾個小時後越來越卡頓,最後強制結束(在玩家看來像斷線)

症狀
卡頓, 斷線
因素
停滯
誰會遇到
只有我
何時
開越久越嚴重
負責單位
主要負責 遊戲開發團隊(用戶端開發)
遊戲開發團隊要做的事
在切換地圖時量測記憶體用量、找出沒有釋放的貼圖、UI、特效並修正、進行長時間自動化測試(soak test)。
圖表上
緩慢爬升 · 遊戲處理程序的記憶體
查看位置
用效能監視器記錄數小時的 Process(遊戲)\Private Bytes。行動裝置看 Android ApplicationExitInfo 的結束原因(REASON_LOW_MEMORY)與 iOS jetsam 報告
符合的跡象
每次切換地圖記憶體都上升且不會下降,開得越久,卡頓與強制結束越多
不符合的跡象
記憶體持平、只是開得越久越顫動時,是「float 時間精度損失」
確認方式
在玩家端環境確認
深入了解
手機主要靠壓縮記憶體撐住。即使如此記憶體仍不夠時,OS 會直接把遊戲關掉(閃退)。RAM 越小的裝置越先被關掉。

出處

  1. Memory allocation among processes Android (Google)
    Android 把記憶體壓縮到 zRAM 撐住,不夠時由 low memory killer 結束處理程序;前景 App 被結束時看起來像閃退
  2. Identifying high-memory use with jetsam event reports Apple
    iOS 在記憶體壓力無法解除時會強制結束 App(jetsam),App 超過各自的記憶體上限就會成為結束對象
  3. Find user-mode memory leaks with Performance Monitor (PerfMon) Microsoft
    長時間記錄 Process > Private Bytes(處理程序配置的專用記憶體)與 Virtual Bytes,只增不減就是洩漏
  4. ApplicationExitInfo Android (Google)
    REASON_LOW_MEMORY:系統的 low memory killer 結束了 App 處理程序(不支援的裝置會回報為 REASON_SIGNALED、SIGKILL)

相關原因

同一層:L1 用戶端遊戲程式

同一症狀(卡頓)在其他層的原因

查看含圖解與實驗的完整版卡片