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, sistem tidak menghapus cache buffer ini saat GraphicBufferProducer terputus dari GraphicBufferConsumer SurfaceFlinger, misalnya, saat MediaCodec terputus dari SurfaceView. Mulai Android 14, Anda dapat menghapus cache buffer 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 mengimplementasikan Composer HAL API versi 3.2 yang baru. Opsi ini diaktifkan secara default dan menyimpan jumlah memori maksimum. Perangkat yang diupgrade ke versi 14 dan yang lebih tinggi juga dapat menggunakan opsi ini untuk mendapatkan manfaat memori penuh.
  • Untuk perangkat yang diupgrade ke Android 14 dan Anda tidak ingin mengimplementasikan Composer HAL 3.2 API, Anda dapat mengaktifkan opsi yang kompatibel dengan versi lama. Opsi ini menyimpan memori hampir sebanyak opsi sebelumnya.

Dua bagian berikut menjelaskan cara mengimplementasikan setiap opsi.

Mengimplementasikan Composer HAL 3.2 API

Untuk mendapatkan manfaat memori buffer grafis penuh, Anda harus:

  1. Mengupdate implementasi Composer HAL ke versi 3.2.
  2. Memproses 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 file.

Mengaktifkan opsi yang kompatibel dengan versi lama

Opsi pengurangan memori yang kompatibel dengan versi lama mengganti buffer sebenarnya di slot cache dengan buffer placeholder 1x1. Hal ini menghasilkan penghematan memori untuk semua slot yang dihapus, kecuali slot buffer aktif saat ini. Untuk mendapatkan manfaat penghematan memori sebagian, aktifkan opsi yang kompatibel dengan versi lama dengan menetapkan surface_flinger.clear_slots_with_set_layer_buffer sysprop ke true. Sysprop ini ditemukan di file property_contexts.

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

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

  • Untuk AIDL HAL: 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 memerlukan penghapusan.

  • Untuk HIDL HAL: 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 memerlukan penghapusan.

Opsi yang kompatibel dengan versi lama dapat menyebabkan Composer HAL mengalami error di beberapa perangkat. Anda mungkin dapat mengubah Composer HAL untuk mengatasi masalah ini. Kode yang mengontrol perilaku ini dapat ditemukan di sini:

Menguji konsumsi memori cache buffer grafis

Pengujian tidak dapat memverifikasi apakah implementasi HAL menghapus slot cache. Namun, Anda dapat menggunakan alat proses debug untuk memantau penggunaan buffer grafis. Saat memantau, Anda mungkin melihat lebih sedikit error kehabisan memori dalam skenario saat beberapa video berbeda dihentikan dan dimulai dengan cepat di YouTube.

Pengujian VTS tersedia 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 lama. 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, lihat link berikut: