Pengelolaan framebuffer klien

Mulai Android 13, framebuffer baru, yang digunakan selama komposisi klien, dialokasikan setiap kali resolusi layar berubah. Alokasi ini dilakukan oleh SurfaceFlinger pada siklus invalid berikutnya setelah perubahan resolusi.

Pengelolaan framebuffer selama pengalihan 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 tampilan eksternal ke layar eksternal lain yang memiliki resolusi default berbeda.

    Selama peristiwa hotplug, handle ke framebuffer lama akan dirilis saat data tampilan lama dide-alokasikan.

  • Tombol mode tampilan yang dimulai oleh SurfaceFlinger, yang terjadi saat pengguna mengubah resolusi dengan setelan pengguna, atau aplikasi mengubah resolusi dengan preferredDisplayModeId.

    Selama pengalihan mode tampilan, handle ke framebuffer klien yang ada dirilis oleh SurfaceFlinger sebelum memanggil setActiveConfig atau setActiveConfigWithConstraints.

Untuk menghindari masalah yang parah, seperti fragmentasi memori, pada perangkat yang tidak menyediakan memori yang cukup untuk framebuffer lama dan baru, sangat penting agar HWC berhenti menggunakan framebuffer lama dan melepaskan handle apa pun ke framebuffer ini seperti yang ditunjukkan dalam kasus berikut:

Dengan melepaskan handle, memori framebuffer dapat dide-alokasikan sepenuhnya sebelum alokasi framebuffer baru yang dilakukan SurfaceFlinger selama siklus invalidate berikutnya.

Rekomendasi untuk pengelolaan framebuffer

Jika HWC tidak merilis handle ke framebuffer lama tepat waktu, alokasi framebuffer baru akan dilakukan sebelum dealokasi framebuffer lama. Hal ini dapat menyebabkan masalah yang sangat besar jika alokasi baru gagal karena fragmentasi atau masalah lainnya. Lebih buruk lagi, jika HWC tidak melepaskan handle 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 framebuffer klien baru disediakan, Anda harus mencadangkan memori yang cukup untuk framebuffer lama dan baru, dan mungkin menjalankan algoritma defragmentasi di ruang memori framebuffer.

  • Alokasikan kumpulan memori khusus untuk framebuffer yang terpisah dari sebagian besar memori buffer grafis. Hal ini penting karena antara pembatalan alokasi dan realokasi framebuffer, proses pihak ketiga dapat mencoba mengalokasikan memori grafis. Jika kumpulan memori grafis yang sama digunakan oleh framebuffer dan jika memori grafis penuh, proses pihak ketiga dapat menempati memori grafis yang sebelumnya dialokasikan oleh framebuffer, sehingga memori yang tersedia tidak cukup untuk realokasi framebuffer atau, mungkin memfragmentasi ruang memori.

Menguji pengelolaan framebuffer

OEM disarankan untuk menguji pengelolaan memori framebuffer klien yang tepat di seluruh tombol resolusi untuk perangkat mereka, yang dijelaskan sebagai berikut:

  • Untuk peristiwa hotplug, cukup cabut dan hubungkan kembali dua layar yang berbeda dengan resolusi yang berbeda.

  • Untuk pengalihan mode, gunakan pengujian Verifier CTS ModeSwitchingTestActivity untuk memulai pengalihan mode guna menguji perilaku memori framebuffer. Pengujian ini dapat mengidentifikasi masalah secara visual yang sulit dideteksi secara terprogram.