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, sistem bir GraphicBufferProducer SurfaceFlinger'ın GraphicBufferConsumer bağlantısını kestiğinde (ör. MediaCodec bir SurfaceView'in bağlantısını kestiğinde) bu arabellek önbelleğini temizlemiyordu. 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 etkinleştirilir ve maksimum 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.
  • Composer HAL 3.2 API'yi uygulamak istemediğiniz Android 14'e yükseltilen cihazlar için 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 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.

LayerCommand::bufferSlotsToClear dahil olmak üzere grafik arabellek belleğiyle ilgili Composer HAL 3.2 API'leri, LayerCommand.aidl dosyasındadı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 işlem, mevcut etkin arabellek yuvası hariç olmak üzere, temizlenen tüm yuvalarda bellek tasarrufu sağlar. 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ştirilmesinin etkileri:

  • 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 arabellek tutma yeri ve temizlenmesi gereken önbellek arabellek 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 arabellek tutmaç ve temizlenmesi gereken önbellek arabellek 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, HAL uygulamalarının önbellek yuvalarını temizleyip temizlemediğ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 daha az bellek yetersizliği hatasıyla karşılaştığınızı fark edebilirsiniz.

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 hayattaki 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 bakın: