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:
- Composer HAL uygulamanızı 3.2 sürümüne güncelleyin.
- 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 fazlaLayerCommand
örneği gönderir. HerBufferCommand
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:
HIDL uyumlu:
GraphicsComposerHidlCommandTest::SET_LAYER_BUFFER_multipleTimes
AIDL 3.1 uyumlu:
GraphicsComposerAidlCommandTest::SetLayerBufferMultipleTimes
AIDL 3.2:
GraphicsComposerAidlCommandV2Test::SetLayerBufferSlotsToClear