Kurangi konsumsi memori grafis

Dalam tumpukan grafis, cache buffer per lapisan berada di antara Composer HAL dan SurfaceFlinger untuk mengurangi overhead yang terkait dengan pengiriman deskriptor file melalui IPC. Sebelum Android 14, cache buffer ini tidak dihapus saat GraphicBufferProducer terputus dari SurfaceFlinger GraphicBufferConsumer , misalnya saat MediaCodec terputus dari SurfaceView. Dimulai dengan Android 14, Anda dapat menghapus paksa cache buffer ini untuk mengurangi konsumsi memori grafis.

Pilih salah satu dari dua opsi berikut:

  • Untuk perangkat yang diluncurkan dengan Android 14 dan lebih tinggi, Anda harus mengimplementasikan Composer HAL API versi 3.2. Opsi ini diaktifkan secara default dan menghemat sebagian besar memori. Perangkat yang ditingkatkan ke versi 14 dan 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 banyaknya dengan opsi sebelumnya.

Dua bagian berikut menjelaskan cara menerapkan setiap opsi.

Menerapkan Komposer HAL 3.2 API

Untuk mencapai manfaat memori buffer grafis penuh, Anda harus:

  1. Perbarui implementasi Composer HAL Anda ke versi 3.2.
  2. Proses LayerCommand::bufferSlotsToClear dengan membersihkan entri cache buffer yang ditunjukkan oleh nomor slot yang ditemukan dalam daftar.

API Komposer HAL 3.2 yang terkait dengan memori buffer grafis, termasuk LayerCommand:bufferSlotsToClear , ada di LayerCommand.aidl- .

Aktifkan opsi kompatibel ke belakang

Opsi pengurangan memori yang kompatibel dengan versi sebelumnya menggantikan buffer sebenarnya di slot cache dengan buffer placeholder 1x1, sehingga menghemat memori untuk semua slot yang dibersihkan, kecuali untuk slot buffer aktif saat ini. Untuk mencapai manfaat penghematan memori sebagian, aktifkan opsi kompatibel dengan versi sebelumnya dengan menyetel sysprop surface_flinger.clear_slots_with_set_layer_buffer ke true . Sysprop ini ditemukan di file property_contexts .

Menyetel sysprop ini memerlukan implementasi Komposer HAL Anda untuk menangani beberapa perintah setLayerBuffer dengan benar untuk lapisan yang sama dalam satu siklus saat ini.

Mengaktifkan opsi kompatibel mundur mempunyai pengaruh berikut:

  • Untuk AIDL HAL: SurfaceFlinger mengirimkan beberapa instance LayerCommand untuk satu lapisan, masing-masing dengan satu BufferCommand . Setiap BufferCommand berisi pegangan buffer placeholder 1x1 dan nomor slot untuk slot buffer cache yang perlu dibersihkan.

  • Untuk HIDL HAL: SurfaceFlinger mengirimkan beberapa perintah SELECT_DISPLAY , SELECT_LAYER , SET_BUFFER . Perintah ini berisi pegangan buffer placeholder 1x1 dan nomor slot untuk slot buffer cache yang perlu dibersihkan.

Opsi kompatibel ke belakang mungkin menyebabkan Composer HAL mogok di beberapa perangkat. Anda mungkin dapat memodifikasi HAL Komposer Anda untuk mengatasi masalah ini. Kode yang mengendalikan perilaku ini ditemukan di sini:

Uji konsumsi memori cache buffer grafis

Pengujian tidak dapat memverifikasi apakah slot cache dibersihkan oleh implementasi HAL. Namun, Anda dapat menggunakan alat debugging untuk memantau penggunaan buffer grafis. Saat memantau, Anda akan melihat bahwa ada lebih sedikit kesalahan kehabisan memori dalam skenario ketika beberapa video berbeda dihentikan dan dimulai secara berurutan di YouTube.

Tersedia pengujian VTS yang memverifikasi bahwa implementasi HAL secara fungsional mampu menerima panggilan API baru (HAL versi 3.2+) atau beberapa perintah setLayerBuffer untuk implementasi yang kompatibel dengan versi sebelumnya. Namun, pengujian ini tidak boleh dianggap sebagai pengujian yang memadai untuk fungsionalitas yang tepat, karena beberapa perangkat lulus pengujian VTS ini, namun gagal dalam kasus penggunaan di dunia nyata.

Untuk tes VTS baru, navigasikan ke tautan berikut: