Dalam stack grafis, cache buffering per lapisan berada di antara Composer HAL dan
SurfaceFlinger untuk mengurangi overhead yang terkait dengan pengiriman deskripsi file
melalui IPC. Sebelum Android 14, cache buffering ini
tidak dihapus saat
GraphicBufferProducer
terputus dari GraphicBufferConsumer
SurfaceFlinger, seperti saat
MediaCodec terputus dari SurfaceView. Mulai Android
14, Anda dapat menghapus cache buffering ini secara paksa untuk
mengurangi konsumsi memori grafis.
Pilih salah satu dari dua opsi berikut:
- Untuk perangkat yang diluncurkan dengan Android 14 dan yang lebih tinggi, Anda harus menerapkan Composer HAL API versi 3.2 yang baru. Opsi ini diaktifkan secara default dan menghemat memori paling banyak. Perangkat yang diupgrade ke versi 14 dan yang lebih baru juga dapat menggunakan opsi ini untuk mendapatkan manfaat memori penuh.
- Untuk perangkat yang diupgrade ke Android 14 yang tidak ingin Anda terapkan Composer HAL 3.2 API, Anda dapat mengaktifkan opsi kompatibilitas mundur. Opsi ini menghemat memori hampir sama banyak dengan opsi sebelumnya.
Dua bagian berikut menjelaskan cara menerapkan setiap opsi.
Mengimplementasikan Composer HAL 3.2 API
Untuk mendapatkan manfaat memori buffer grafis penuh, Anda harus:
- Update implementasi HAL Composer ke versi 3.2.
- Proses
LayerCommand::bufferSlotsToClear
dengan menghapus entri cache buffer yang ditunjukkan oleh nomor slot yang ditemukan dalam daftar.
Composer HAL 3.2 API yang terkait dengan memori buffer grafis, termasuk
LayerCommand:bufferSlotsToClear
, berada di
LayerCommand.aidl-
.
Mengaktifkan opsi yang kompatibel dengan versi sebelumnya
Opsi pengurangan memori yang kompatibel dengan versi lama mengganti buffer sebenarnya di
slot cache dengan buffer placeholder 1x1, sehingga menghemat memori
untuk semua slot yang dihapus, kecuali untuk slot buffer aktif saat ini. Untuk mencapai manfaat penghematan memori sebagian, aktifkan opsi yang kompatibel dengan versi lama dengan menetapkan sysprop surface_flinger.clear_slots_with_set_layer_buffer
ke true
. Sysprop ini ditemukan dalam file property_contexts
.
Menetapkan sysprop ini mengharuskan penerapan HAL Composer Anda menangani beberapa perintah setLayerBuffer
untuk lapisan yang sama dengan benar dalam satu siklus presentasi.
Mengaktifkan opsi kompatibilitas mundur akan memiliki efek berikut:
Untuk AIDL HAL: SurfaceFlinger mengirim beberapa instance
LayerCommand
untuk satu lapisan, masing-masing dengan satuBufferCommand
. SetiapBufferCommand
berisi handle buffer placeholder 1x1 dan nomor slot untuk slot buffer cache yang perlu dihapus.Untuk HAL HIDL: SurfaceFlinger mengirim beberapa perintah
SELECT_DISPLAY
,SELECT_LAYER
,SET_BUFFER
. Perintah ini berisi handle buffer placeholder 1x1 dan nomor slot untuk slot buffer cache yang perlu dihapus.
Opsi kompatibilitas mundur dapat menyebabkan HAL Composer error di beberapa perangkat. Anda mungkin dapat memodifikasi HAL Composer untuk mengatasi masalah ini. Kode yang mengontrol perilaku ini dapat ditemukan di sini:
Menguji konsumsi memori cache buffer grafis
Pengujian tidak dapat memverifikasi apakah slot cache dihapus oleh implementasi HAL. Namun, Anda dapat menggunakan alat proses debug untuk memantau penggunaan buffering grafis. Saat memantau, Anda akan melihat bahwa terjadi lebih sedikit error kehabisan memori dalam skenario saat beberapa video yang berbeda dihentikan dan dimulai secara berurutan di YouTube.
Pengujian VTS tersedia yang memverifikasi bahwa penerapan HAL
secara fungsional dapat menerima panggilan API baru (HAL versi 3.2+) atau
beberapa perintah setLayerBuffer
untuk penerapan
yang kompatibel dengan versi lama. Namun, pengujian ini tidak boleh dianggap memadai untuk
fungsi yang tepat, karena beberapa perangkat lulus pengujian VTS ini,
tetapi gagal selama kasus penggunaan di dunia nyata.
Untuk pengujian VTS baru, buka link berikut:
Kompatibel dengan HIDL:
GraphicsComposerHidlCommandTest::SET_LAYER_BUFFER_multipleTimes
Kompatibel dengan AIDL 3.1:
GraphicsComposerAidlCommandTest::SetLayerBufferMultipleTimes
AIDL 3.2:
GraphicsComposerAidlCommandV2Test::SetLayerBufferSlotsToClear