Pengelolaan framebuffer klien

Mulai dari Android 13, framebuffer baru, yang digunakan selama komposisi klien, dialokasikan setiap kali resolusi layar berubah. Alokasi ini dilakukan oleh SurfaceFlinger 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 tampilan eksternal ke tampilan eksternal lain yang memiliki resolusi default berbeda.

    Selama peristiwa hotplug, handle ke framebuffer lama dilepaskan saat data tampilan lama dibatalkan alokasinya.

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

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

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

Melepaskan handle memungkinkan memori framebuffer dialokasikan sepenuhnya sebelum alokasi framebuffer baru yang dilakukan SurfaceFlinger selama siklus invalidate berikutnya.

Rekomendasi untuk pengelolaan framebuffer

Jika HWC tidak melepaskan handle ke framebuffer lama tepat waktu, alokasi framebuffer baru akan terjadi sebelum pelepasan alokasi framebuffer lama. Hal ini dapat menyebabkan masalah yang sangat serius 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, maka sangat penting untuk mencadangkan memori yang cukup untuk framebuffer lama dan baru, dan mungkin menjalankan algoritma defragmentasi pada ruang memori framebuffer.

  • Alokasikan kumpulan memori khusus untuk framebuffer yang terpisah dari memori buffer grafis lainnya. Hal ini penting karena di antara de-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 tidak cukup untuk realokasi framebuffer atau, mungkin, memecah ruang memori.

Menguji pengelolaan framebuffer

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

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

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