Manajemen framebuffer klien

Dimulai dengan Android 13, framebuffer baru, yang digunakan selama komposisi klien , dialokasikan setiap kali resolusi tampilan berubah. Alokasi ini dilakukan oleh SurfaceFlinger pada siklus tidak valid berikutnya setelah perubahan resolusi.

Manajemen framebuffer selama peralihan resolusi

Perubahan resolusi terjadi karena salah satu dari dua skenario berikut:

  • Peristiwa hotplug , yang diprakarsai oleh Hardware Composer (HWC), yang terjadi saat berpindah dari satu layar eksternal ke layar eksternal lain yang memiliki resolusi default berbeda.

    Selama acara hotplug, pegangan ke framebuffer lama dilepaskan ketika data tampilan lama tidak dialokasikan.

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

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

Untuk menghindari masalah besar, seperti fragmentasi memori, pada perangkat yang tidak memiliki cukup memori untuk framebuffer lama dan baru, HWC harus berhenti menggunakan framebuffer lama dan melepaskan pegangan apa pun ke framebuffer ini seperti yang ditunjukkan dalam kasus berikut:

Melepaskan pegangan memungkinkan memori framebuffer untuk sepenuhnya dibatalkan alokasinya sebelum alokasi framebuffer baru yang dilakukan SurfaceFlinger selama siklus pembatalan berikutnya.

Rekomendasi untuk manajemen framebuffer

Jika HWC tidak melepaskan pegangan ke framebuffer lama tepat waktu, alokasi framebuffer baru akan dilakukan sebelum deallokasi framebuffer lama. Hal ini dapat menyebabkan masalah yang sangat besar ketika alokasi baru gagal karena fragmentasi atau masalah lainnya. Lebih buruk lagi, jika HWC tidak melepaskan pegangan ini sama sekali, kebocoran memori dapat terjadi.

Untuk menghindari kegagalan alokasi yang parah, ikuti rekomendasi berikut:

  • Jika HWC perlu terus menggunakan framebuffer klien lama hingga framebuffer klien baru tersedia, maka penting untuk mencadangkan memori yang cukup untuk framebuffer lama dan baru, dan mungkin menjalankan algoritme defragmentasi pada ruang memori framebuffer.

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

Uji manajemen framebuffer

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

  • Untuk acara hotplug, cukup cabut dan sambungkan kembali dua layar berbeda dengan resolusi berbeda.

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