Mengurangi konsumsi memori grafis

Dalam stack 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 GraphicBufferConsumer SurfaceFlinger, seperti saat MediaCodec terputus dari SurfaceView. Mulai Android 14, Anda dapat menghapus paksa cache buffer ini untuk mengurangi penggunaan 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 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 API Composer HAL 3.2, Anda dapat mengaktifkan opsi yang kompatibel mundur. Opsi ini menghemat memori hampir sebanyak opsi sebelumnya.

Dua bagian berikut menjelaskan cara menerapkan setiap opsi.

Mengimplementasikan Composer HAL 3.2 API

Untuk mendapatkan manfaat penuh dari memori buffer grafis, Anda harus:

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

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

Aktifkan opsi yang kompatibel dengan versi lama

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

Menetapkan sysprop ini mengharuskan implementasi HAL Composer Anda menangani beberapa perintah setLayerBuffer untuk lapisan yang sama dengan benar dalam satu siklus presentasi.

Mengaktifkan opsi yang kompatibel dengan versi lama akan memiliki efek berikut:

  • Untuk HAL AIDL: SurfaceFlinger mengirim beberapa instance LayerCommand untuk satu lapisan, masing-masing dengan satu BufferCommand. Setiap BufferCommand 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 penampung 1x1 dan nomor slot untuk slot buffer cache yang perlu dihapus.

Opsi yang kompatibel dengan versi lama dapat menyebabkan HAL Composer error di beberapa perangkat. Anda mungkin dapat mengubah 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 buffer grafis. Saat memantau, Anda akan melihat bahwa ada lebih sedikit error kehabisan memori dalam skenario saat beberapa video berbeda dihentikan dan dimulai secara berurutan dengan cepat di YouTube.

Tersedia pengujian VTS yang memverifikasi bahwa penerapan HAL secara fungsional mampu menerima panggilan API baru (HAL versi 3.2+) atau beberapa perintah setLayerBuffer untuk penerapan yang kompatibel dengan versi sebelumnya. Namun, hal ini tidak boleh dianggap sebagai pengujian yang 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: