Grafik yığınında, IPC üzerinden dosya tanımlayıcıları göndermeyle ilişkili yükü azaltmak için Composer HAL ile SurfaceFlinger arasında katman başına bir arabellek önbelleği bulunur. Android 14'ten önce, bir GraphicBufferProducer
, SurfaceFlinger GraphicBufferConsumer
ile bağlantısını kestikten sonra bu arabellek önbelleği temizlenmiyordu (ör. MediaCodec, SurfaceView ile bağlantısını kestiğinde). Android 14'ten itibaren, grafik bellek tüketimini azaltmak için bu arabellek önbelleğini zorla temizleyebilirsiniz.
Aşağıdaki iki seçenekten birini belirleyin:
- Android 14 ve sonraki sürümleri ile kullanıma sunulan cihazlar için yeni Composer HAL API sürüm 3.2'yi uygulamanız gerekir. Bu seçenek varsayılan olarak etkindir ve en fazla bellek tasarrufu sağlar. 14 ve sonraki sürümlere yükseltilen cihazlar da tam bellek avantajlarından yararlanmak için bu seçeneği kullanabilir.
- Android 14'e yükseltilen ve Composer HAL 3.2 API'yi uygulamak istemediğiniz cihazlarda geriye dönük uyumlu seçeneği etkinleştirebilirsiniz. Bu seçenek, önceki seçenekle neredeyse aynı miktarda bellek tasarrufu sağlar.
Aşağıdaki iki bölümde, her bir seçeneğin nasıl uygulanacağı açıklanmaktadır.
Composer HAL 3.2 API'sini uygulama
Grafik arabelleği belleğinin tüm avantajlarından yararlanmak için şunları yapmanız gerekir:
- Composer HAL uygulamanızı 3.2 sürümüne güncelleyin.
- Listede bulunan yuva numaralarıyla belirtilen arabellek önbelleği girişlerini temizleyerek
LayerCommand::bufferSlotsToClear
işlemini gerçekleştirin.
LayerCommand:bufferSlotsToClear
dahil grafik arabellek ile ilgili Composer HAL 3.2 API'leri LayerCommand.aidl-
içindedir.
Geriye dönük uyumlu seçenekleri etkinleştirme
Geriye dönük uyumlu bellek azaltma seçeneği, önbellek yuvasındaki gerçek arabelleği 1x1 yer tutucu arabellekle değiştirir. Bu da mevcut etkin arabellek yuvası hariç tüm temizlenen yuvalarda bellek tasarrufu sağlar. Kısmi bellek tasarrufu avantajlarından yararlanmak için surface_flinger.clear_slots_with_set_layer_buffer
sysprop değerini true
olarak ayarlayarak geriye dönük uyumlu seçeneği etkinleştirin. Bu sysprop, property_contexts
dosyasında bulunur.
Bu sysprop'u ayarlamak için Composer HAL uygulamanızın aynı katman için birden fazla setLayerBuffer
komutunu tek bir mevcut döngüde doğru şekilde işlemesi gerekir.
Geriye dönük uyumlu seçenek etkinleştirildiğinde aşağıdaki etkiler ortaya çıkar:
AIDL HAL'ler için: SurfaceFlinger, tek bir katman için her biri tek bir
BufferCommand
içeren birden fazlaLayerCommand
örneği gönderir. HerBufferCommand
, 1x1 yer tutucu tamponu mülkünü ve temizlenmesi gereken önbellek tamponu yuvası için bir yuva numarası içerir.HIDL HAL'ler için: SurfaceFlinger birden fazla
SELECT_DISPLAY
,SELECT_LAYER
,SET_BUFFER
komutu gönderir. Bu komutlar, 1x1 yer tutucu tamponu tutamacını ve temizlenmesi gereken önbellek tamponu yuvası için bir yuva numarası içerir.
Geriye dönük uyumlu seçenek, bazı cihazlarda Composer HAL'in kilitlenmesine neden olabilir. Bu sorunu çözmek için Composer HAL'inizi değiştirebilirsiniz. Bu davranışı kontrol eden kod şurada bulunur:
Grafik arabellek önbelleği bellek tüketimini test etme
Testler, önbellek yuvalarının HAL uygulamaları tarafından temizlenip temizlenmediğini doğrulayamaz. Ancak grafik arabellek kullanımını izlemek için hata ayıklama araçlarınızı kullanabilirsiniz. İzlemeye devam ettikçe YouTube'da birden fazla farklı videonun durdurulup hızlı bir şekilde arka arkaya başlatıldığı senaryolarda bellek dışı hataların daha az olduğunu fark edeceksiniz.
HAL uygulamasının işlevsel olarak yeni API çağrılarını (HAL sürümü 3.2+) veya geriye dönük uyumlu uygulama için birden fazla setLayerBuffer
komutunu alabileceğini doğrulayan VTS testleri mevcuttur. Ancak bazı cihazlar bu VTS testlerini geçse de gerçek kullanım alanlarında başarısız olduğu için bu, düzgün işlevsellik için yeterli test olarak kabul edilmemelidir.
Yeni VTS testleri için aşağıdaki bağlantılara gidin:
HIDL uyumlu:
GraphicsComposerHidlCommandTest::SET_LAYER_BUFFER_multipleTimes
AIDL 3.1 ile uyumlu:
GraphicsComposerAidlCommandTest::SetLayerBufferMultipleTimes
AIDL 3.2:
GraphicsComposerAidlCommandV2Test::SetLayerBufferSlotsToClear