遊戲 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 越小的裝置越先被關掉。
出處
- Memory allocation among processes Android (Google)
Android 把記憶體壓縮到 zRAM 撐住,不夠時由 low memory killer 結束處理程序;前景 App 被結束時看起來像閃退 - Identifying high-memory use with jetsam event reports Apple
iOS 在記憶體壓力無法解除時會強制結束 App(jetsam),App 超過各自的記憶體上限就會成為結束對象 - Find user-mode memory leaks with Performance Monitor (PerfMon) Microsoft
長時間記錄 Process > Private Bytes(處理程序配置的專用記憶體)與 Virtual Bytes,只增不減就是洩漏 - ApplicationExitInfo Android (Google)
REASON_LOW_MEMORY:系統的 low memory killer 結束了 App 處理程序(不支援的裝置會回報為 REASON_SIGNALED、SIGKILL)
相關原因
同一層:L1 用戶端遊戲程式
同一症狀(卡頓)在其他層的原因
查看含圖解與實驗的完整版卡片