Pengelolaan framebuffer klien

Mulai Android 13, sistem 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 tampilan eksternal ke tampilan eksternal lain yang memiliki resolusi default berbeda.

    Selama peristiwa hotplug, HWC melepaskan handle ke framebuffer lama saat membatalkan alokasi data tampilan lama.

  • Perubahan mode tampilan yang dimulai oleh SurfaceFlinger, yang terjadi saat Anda mengubah resolusi menggunakan setelan pengguna, atau aplikasi mengubah resolusi menggunakan preferredDisplayModeId.

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

Untuk mencegah masalah parah seperti fragmentasi memori pada perangkat tanpa memori framebuffer yang memadai, HWC harus melepaskan handle ke framebuffer lama. Hal ini sangat penting dalam kasus berikut:

Melepaskan handle memungkinkan memori framebuffer dibatalkan alokasinya sepenuhnya sebelum SurfaceFlinger mengalokasikan framebuffer baru selama siklus invalidate berikutnya.

Rekomendasi untuk pengelolaan framebuffer

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

  • Alokasikan kumpulan memori khusus untuk framebuffer yang terpisah dari memori buffer grafis lainnya. Hal ini penting karena proses pihak ketiga mungkin mencoba mengalokasikan memori grafis antara pelepasan alokasi dan realokasi framebuffer. Jika framebuffer menggunakan kumpulan 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 tidak cukup untuk realokasi framebuffer atau fragmentasi 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, cabut dan hubungkan kembali dua layar berbeda yang memiliki resolusi 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.