Mulai Android 13, sistem akan mengalokasikan framebuffer baru, yang digunakan selama komposisi klien, setiap kali resolusi layar berubah. SurfaceFlinger melakukan alokasi ini pada siklus invalidate berikutnya setelah perubahan resolusi.
Pengelolaan framebuffer selama peralihan resolusi
Perubahan resolusi terjadi karena salah satu dari dua skenario berikut:
Peristiwa hotplug, yang dimulai oleh Hardware Composer (HWC), yang terjadi saat beralih dari satu layar eksternal ke layar eksternal lain yang memiliki resolusi default yang berbeda.
Selama peristiwa hotplug, HWC merilis pengendali ke framebuffer lama saat membatalkan alokasi data layar lama.
Peralihan mode layar yang dimulai oleh SurfaceFlinger, yang terjadi saat Anda mengubah resolusi menggunakan setelan pengguna, atau aplikasi mengubah resolusi menggunakan
preferredDisplayModeId.Selama peralihan mode layar, SurfaceFlinger merilis pengendali ke framebuffer klien yang ada sebelum memanggil
setActiveConfigatausetActiveConfigWithConstraints.
Untuk mencegah masalah besar seperti fragmentasi memori pada perangkat tanpa memori framebuffer yang cukup, HWC harus merilis pengendali ke framebuffer lama. Hal ini sangat penting dalam kasus berikut:
Untuk peristiwa hotplug, segera sebelum memanggil
onHotplug.Untuk peralihan mode, segera setelah memanggil
setActiveConfigatausetActiveConfigWithConstraints.
Merilis pengendali memungkinkan memori framebuffer dibatalkan alokasinya sepenuhnya sebelum SurfaceFlinger mengalokasikan framebuffer baru selama siklus invalidate berikutnya.
Rekomendasi untuk pengelolaan framebuffer
Jika HWC tidak merilis pengendali ke framebuffer lama tepat waktu, alokasi framebuffer baru akan terjadi sebelum pembatalan alokasi framebuffer lama. Hal ini dapat menyebabkan masalah besar jika alokasi baru gagal karena fragmentasi atau masalah lainnya. Yang lebih buruk lagi, jika HWC tidak merilis pengendali ini sama sekali, kebocoran memori dapat terjadi.
Untuk menghindari kegagalan alokasi yang besar, ikuti rekomendasi berikut:
Jika HWC perlu terus menggunakan framebuffer klien lama hingga framebuffer klien baru disediakan, penting untuk mencadangkan memori yang cukup untuk framebuffer lama dan baru, dan mungkin menjalankan algoritma defragmentasi pada ruang memori framebuffer.
Alokasikan gabungan memori khusus untuk framebuffer yang terpisah dari memori buffer grafis lainnya. Hal ini penting karena proses pihak ketiga mungkin mencoba mengalokasikan memori grafis antara pembatalan alokasi dan realokasi framebuffer. Jika framebuffer menggunakan gabungan memori grafis yang sama dan jika memori grafis penuh, proses pihak ketiga dapat menempati memori yang sebelumnya dialokasikan oleh framebuffer. Hal ini dapat menyebabkan memori yang tidak cukup untuk realokasi framebuffer atau fragmentasi memori.
Menguji pengelolaan framebuffer
OEM disarankan untuk menguji pengelolaan memori framebuffer klien yang tepat di seluruh peralihan resolusi untuk perangkat mereka, seperti yang dijelaskan berikut:
Untuk peristiwa hotplug, cabut dan sambungkan kembali dua layar berbeda yang memiliki resolusi berbeda.
Untuk peralihan mode, gunakan
ModeSwitchingTestActivityCTS Verifier test untuk memulai peralihan mode untuk menguji perilaku memori framebuffer. Pengujian ini dapat mengidentifikasi masalah secara visual yang sulit dideteksi secara terprogram.