Mulai Android 13, framebuffer baru, yang digunakan selama klien komposisi, dialokasikan setiap kali resolusi tampilan berubah. Ini alokasi dilakukan oleh SurfaceFlinger pada siklus invalid berikutnya setelah perubahan resolusi.
Pengelolaan framebuffer selama peralihan resolusi
Perubahan resolusi terjadi karena salah satu dari hal berikut dua skenario:
Peristiwa hotplug, dimulai oleh Hardware Composer (HWC), yang terjadi saat beralih dari satu perangkat eksternal ke layar eksternal lain yang memiliki resolusi default berbeda.
Selama peristiwa hotplug, handle ke framebuffer lama dirilis saat data tampilan lama dibatalkan alokasinya.
Sakelar mode tampilan yang dimulai oleh SurfaceFlinger, yang terjadi saat pengguna mengubah resolusi dengan setelan pengguna, atau aplikasi mengubah resolusi dengan
preferredDisplayModeId
.Selama tombol mode tampilan, handle ke framebuffer klien yang ada dirilis oleh SurfaceFlinger sebelum memanggil
setActiveConfig
atausetActiveConfigWithConstraints
.
Untuk menghindari masalah yang fatal, seperti fragmentasi memori, pada perangkat yang tidak menyediakan cukup memori untuk {i>framebuffer<i} yang lama dan yang baru, hal ini sangat penting HWC berhenti menggunakan {i>framebuffer<i} yang lama dan melepaskan ke framebuffer seperti ditunjukkan dalam kasus berikut:
Untuk peristiwa hotplug, tepat sebelum memanggil
onHotplug
.Untuk pengalihan mode, segera setelah panggilan ke
setActiveConfig
atausetActiveConfigWithConstraints
.
Melepaskan handle memungkinkan memori framebuffer dibatalkan alokasinya sepenuhnya sebelum alokasi framebuffer baru yang dilakukan SurfaceFlinger selama siklus invalid berikutnya.
Rekomendasi untuk pengelolaan framebuffer
Jika HWC tidak merilis {i>handle<i} ke {i>framebuffer<i} lama, alokasi {i>framebuffer<i} baru terjadi sebelum {i>framebuffer<i} lama dealokasi. Hal ini dapat menyebabkan masalah yang fatal jika alokasi baru gagal karena fragmentasi atau masalah lainnya. Lebih buruk lagi, jika HWC tidak melepaskan {i>handle<i} ini sama sekali, kebocoran memori dapat terjadi.
Untuk menghindari kegagalan alokasi yang fatal, ikuti rekomendasi berikut:
Jika HWC perlu terus menggunakan framebuffer klien lama hingga {i>framebuffer<i} klien disediakan, maka sangat penting untuk mencadangkan memori yang cukup untuk {i>framebuffer<i} lama dan baru, dan mungkin menjalankan defragmentasi pada ruang memori {i>framebuffer<i}.
Alokasikan kumpulan memori khusus untuk {i>framebuffer<i} yang terpisah dari sisa memori {i>buffer<i} grafis. Hal ini penting karena antara dealokasi dan realokasi {i>framebuffer<i}, proses pihak ketiga dapat mencoba mengalokasikan memori grafis. Jika kumpulan memori grafis yang sama yang digunakan oleh {i>framebuffer<i} dan jika memori grafis penuh, pihak ketiga dapat menempati memori grafis yang sebelumnya dialokasikan oleh {i>framebuffer<i}, sehingga memori tidak cukup untuk alokasi ulang {i>framebuffer<i} atau, mungkin memecah ruang memori.
Menguji pengelolaan framebuffer
OEM disarankan untuk menguji manajemen memori framebuffer klien yang tepat di tombol resolusi untuk perangkat mereka, yang dijelaskan sebagai berikut:
Untuk kejadian hotplug, cukup cabut dan sambungkan kembali dua layar yang berbeda dengan resolusi yang berbeda.
Untuk tombol mode, gunakan
ModeSwitchingTestActivity
CTS Pengujian pemverifikasi untuk memulai tombol mode guna menguji perilaku memori framebuffer. Pengujian ini dapat secara visual mengidentifikasi masalah yang sulit dideteksi secara terprogram.