自 Android 13 起,新的影格緩衝區,在 客戶 組合,只要螢幕解析度變更,就會分配。這個 SurfaceFlinger 會在下個無效週期執行 問題為何無法解決
在解析度切換期間管理影格緩衝區
解決方法是因下列其中一項原因而變更 兩種情況:
活動是發生熱潮 由 Hardware Composer (HWC) 啟動,即從外部執行個體交換時執行 以不同預設解析度的外接螢幕顯示。
在熱插電事件期間,系統會釋放舊 framebuffer 的控制代碼 當舊的多媒體廣告資料被取消配置時
由 SurfaceFlinger 啟動的顯示模式開關,這個開關會在 使用者透過使用者設定變更解析度, 或透過
preferredDisplayModeId
變更解析度。在顯示模式切換期間,現有用戶端頁框緩衝區的控制代碼 由 SurfaceFlinger 發布,再呼叫
setActiveConfig
或setActiveConfigWithConstraints
。
為了避免發生災難性問題 (例如記憶體不足) 無法為新舊框架緩衝區保留足夠的記憶體,因此 停止使用舊的 framebuffer,並 對這些 framebuffer 的支援,如下列情況所示:
若是熱接事件,則在呼叫
onHotplug
之前立即顯示。模式切換:在呼叫
setActiveConfig
後立即執行 或setActiveConfigWithConstraints
。
釋放控點可讓 framebuffer 記憶體完整釋放 之前 SurfaceFlinger 執行的新影格緩衝區未經配置
適用於框架緩衝區管理的建議
如果 HWC 未及時將控點釋放到舊 framebuffer, 新的 framebuffer 配置發生在舊的 framebuffer 之前 。這可能會在新分配失敗時造成災難問題 。更糟的是 硬體總和不會釋放這些控點,可能會導致記憶體流失 。
為避免發生災難配置失敗,請遵循下列建議:
如果 HWC 仍需繼續使用舊的用戶端訊框,直到新的 用戶端 Framebuffer 也都會保留,因此務必保留足夠的記憶體 新、新的 framebuffer,以及有可能會執行重組程序 尤其是在 framebuffer 記憶體空間運作
為影格緩衝區分配專屬記憶體集區 其餘圖形緩衝區記憶體的其餘部分這點非常重要 取消配置和重新定位 framebuffer,第三方程序 嘗試分配圖形記憶體如果相同的圖形記憶體集區 而如果圖形記憶體已滿,請使用第三方廠商 程序可能會佔用先前由 framebuffer 分配的圖形記憶體, 因此會為 framebuffer 重新配置造成記憶體不足,或 分割記憶體空間。
測試 framebuffer 管理
建議原始設備製造商 (OEM) 測試,在 調整裝置解析度,方法如下:
如果是熱插電事件,只要拔除兩個不同螢幕的電源插頭, 不同解析度
如果是模式開關,請使用
ModeSwitchingTestActivity
CTS 透過驗證器測試啟動模式切換鈕,以便測試 framebuffer 記憶體行為。 這項測試能以視覺方式找出難以偵測的問題 編寫程式