Ekran kartı belleği tüketimini azaltma

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:

  1. Composer HAL uygulamanızı 3.2 sürümüne güncelleyin.
  2. 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 fazla LayerCommand örneği gönderir. Her BufferCommand, 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: