Grafik yığınında, dosya tanımlayıcılarının IPC üzerinden gönderilmesiyle ilişkili ek 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'dan GraphicBufferConsumer
bağlantısını kestiğinde (ör. MediaCodec, SurfaceView'dan bağlantısını kestiğinde) bu arabellek önbelleği temizlenmiyordu. Android 14'ten itibaren, grafik belleği 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ümlerle kullanıma sunulan cihazlarda 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ükseltme yapan 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 cihazlar için geriye dönük uyumlu seçeneği etkinleştirebilirsiniz. Bu seçenek, önceki seçenek kadar olmasa da neredeyse aynı miktarda bellek tasarrufu sağlar.
Aşağıdaki iki bölümde, her seçeneğin nasıl uygulanacağı açıklanmaktadır.
Composer HAL 3.2 API'yi uygulama
Grafik arabellek belleğinin tüm avantajlarından yararlanmak için:
- 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 yapın.
Grafik arabellek belleğiyle ilgili Composer HAL 3.2 API'leri (ör.
LayerCommand:bufferSlotsToClear
)
LayerCommand.aidl-
içinde yer alır.
Geriye dönük uyumlu seçeneği 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 sayede, mevcut etkin arabellek yuvası hariç olmak üzere temizlenen tüm yuvalarda bellek tasarrufu sağlanır. Bellekte kısmi tasarruf avantajlarından yararlanmak için surface_flinger.clear_slots_with_set_layer_buffer
sysprop'u true
olarak ayarlayarak geriye dönük uyumlu seçeneğini etkinleştirin. Bu sysprop, property_contexts
dosyasında bulunur.
Bu sysprop'u ayarlamak için Composer HAL uygulamanızın, tek bir sunum döngüsünde aynı katman için birden fazla setLayerBuffer
komutunu doğru şekilde işlemesi gerekir.
Geriye dönük uyumlu seçeneğin etkinleştirilmesi şu etkilere neden olur:
AIDL HAL'leri 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 tampon tutma yeri ve temizlenmesi gereken önbellek tampon yuvası için bir yuva numarası içerir.HIDL HAL'leri için: SurfaceFlinger, birden fazla
SELECT_DISPLAY
,SELECT_LAYER
,SET_BUFFER
komutu gönderir. Bu komutlar, 1x1 yer tutucu tampon tutma yeri ve temizlenmesi gereken önbellek tampon yuvası için bir yuva numarası içerir.
Geriye dönük uyumlu seçenek, bazı cihazlarda Composer HAL'ın kilitlenmesine neden olabilir. Bu sorunu çözmek için Composer HAL'ınızı değiştirebilirsiniz. Bu davranışı kontrol eden kod şu konumda bulunur:
Grafik arabellek önbelleğinin 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. İzleme sırasında, YouTube'da birden fazla farklı videonun hızlı bir şekilde durdurulup başlatıldığı senaryolarda bellek yetersizliği hatalarının daha az olduğunu fark edeceksiniz.
HAL uygulamasının, yeni API çağrılarını (HAL sürümü 3.2+) işlevsel olarak alabileceğini 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 dünya kullanım alanlarında başarısız olduğundan bu, uygun işlevsellik için yeterli bir test olarak kabul edilmemelidir.
Yeni VTS testleri için aşağıdaki bağlantılara gidin: