Grafik belleği tüketimini azaltın

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 MediaCodec'in SurfaceView ile bağlantısının kesilmesi gibi bir GraphicBufferProducer SurfaceFlinger GraphicBufferConsumer ile bağlantısı kesildiğ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 seçin:

  • Android 14 ve sonraki sürümlerle başlatılan 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 hafıza 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.
  • Composer HAL 3.2 API'yi uygulamak istemediğiniz Android 14'e yükseltme yapan cihazlar için geriye dönük uyumluluk seçeneğini etkinleştirebilirsiniz. Bu seçenek neredeyse önceki seçenek kadar 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'sini uygulayın

Tam grafik ara bellek avantajları elde etmek için şunları yapmalısınız:

  1. Composer HAL uygulamanızı 3.2 sürümüne güncelleyin.
  2. Listede bulunan yuva numaralarıyla belirtilen arabellek önbellek girişlerini temizleyerek LayerCommand::bufferSlotsToClear işlemini gerçekleştirin.

LayerCommand:bufferSlotsToClear dahil grafik ara bellekle ilgili Composer HAL 3.2 API'leri LayerCommand.aidl- içindedir.

Geriye dönük uyumluluk seçeneğini etkinleştirin

Geriye dönük uyumlu bellek azaltma seçeneği, önbellek yuvasındaki gerçek arabelleği 1x1 yer tutucu arabellekle değiştirerek, geçerli etkin arabellek yuvası dışında tüm temizlenen yuvalar için bellek tasarrufu sağlar. Kısmi bellek tasarrufu avantajları elde etmek için, surface_flinger.clear_slots_with_set_layer_buffer sysprop'u true olarak ayarlayarak geriye dönük uyumlu seçeneği etkinleştirin. Bu sysprop, property_contexts dosyasında bulunur.

Bu sysprop'un ayarlanması, Composer HAL uygulamanızın tek bir mevcut döngüde aynı katman için birden fazla setLayerBuffer komutunu doğru şekilde işlemesini gerektirir.

Geriye dönük uyumluluk seçeneğinin etkinleştirilmesi aşağıdaki etkileri doğurur:

  • AIDL HAL'ler 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 tanıtıcısını ve temizlenmesi gereken önbellek arabellek yuvası için bir yuva numarasını içerir.

  • HIDL HAL'ler için: SurfaceFlinger birden fazla SELECT_DISPLAY , SELECT_LAYER , SET_BUFFER komutu gönderir. Bu komutlar, 1x1 yer tutucu arabellek tanıtıcısını ve temizlenmesi gereken önbellek arabellek yuvası için bir yuva numarasını içerir.

Geriye dönük uyumlu seçenek, Composer HAL'nin bazı cihazlarda çökmesine neden olabilir. Bu sorunu çözmek için Composer HAL'inizi değiştirebilirsiniz. Bu davranışı kontrol eden kod burada bulunur:

Grafik arabelleği önbellek tüketimini test edin

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. İzlerken, YouTube'da birden fazla farklı videonun hızlı bir şekilde art arda durdurulup başlatıldığı senaryolarda yetersiz bellek hatasını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çtiğinden ancak gerçek dünyadaki kullanım durumlarında başarısız olduğundan, bunun düzgün işlevsellik açısından yeterli bir test olduğu düşünülmemelidir.

Yeni VTS testleri için aşağıdaki bağlantılara gidin: