Android 13'ten itibaren, ekran çözünürlüğü her değiştiğinde istemci oluşturma sırasında kullanılan yeni çerçeve tamponları ayrılır. Bu atama, çözünürlük değişikliğinden sonraki bir sonraki geçersiz kılma döngüsünde SurfaceFlinger tarafından gerçekleştirilir.
Çözünürlük geçişleri sırasında çerçeve arabelleği yönetimi
Çözüm değişiklikleri aşağıdaki iki senaryodan biri nedeniyle ortaya çıkar:
Donanım Oluşturucu (HWC) tarafından başlatılan ve bir harici ekrandan farklı bir varsayılan çözünürlüğe sahip farklı bir harici ekrana geçiş yapıldığında gerçekleşen bir hotplug etkinliği.
Bir hotspot etkinliği sırasında, eski görüntüleme verileri ayrıldığında eski framearabelleklerin tutma yerleri serbest bırakılır.
SurfaceFlinger tarafından başlatılan ekran modu geçişi. Kullanıcı kullanıcı ayarlarıyla çözünürlüğü değiştirdiğinde veya bir uygulama
preferredDisplayModeId
ile çözünürlüğü değiştirdiğinde gerçekleşir.Ekran modu değiştirilirken, mevcut istemci çerçeve belleklerinin tutamaçları
setActiveConfig
veyasetActiveConfigWithConstraints
çağrılmadan önce SurfaceFlinger tarafından serbest bırakılır.
Eski ve yeni çerçeve tamponları için yeterli bellek ayırmayan cihazlarda bellek parçalanması gibi ciddi sorunları önlemek için HWC'nin eski çerçeve tamponlarını kullanmayı bırakması ve aşağıdaki durumlarda gösterildiği gibi bu çerçeve tamponlarına ait tüm imleçleri serbest bırakması kritik önem taşır:
Hotplug etkinlikleri için
onHotplug
çağrılmasından hemen önce.Mod geçişlerinde,
setActiveConfig
veyasetActiveConfigWithConstraints
çağrısından hemen sonra.
İşaretçileri serbest bırakmak, SurfaceFlinger'ın bir sonraki invalidate döngüsü sırasında gerçekleştirdiği yeni çerçeve belleklerinin ayrılmasından önce çerçeve belleğinin tamamen tahsis edilmesini sağlar.
Görüntü çerçevesi yönetimiyle ilgili öneriler
HWC, eski kare arabelleklerine tutma noktalarını zamanında yayınlamazsa yeni framebuffer ayırma işlemi, eski çerçeve arabelleği ayırma işleminden önce gerçekleşir. Bu durum, yeni tahsis işlemi parçalanma veya başka sorunlar nedeniyle başarısız olduğunda ciddi sorunlara neden olabilir. Daha da kötüsü, HWC bu imleçleri hiç serbest bırakmazsa hafıza sızıntısı meydana gelebilir.
Ciddi ayırma hatalarını önlemek için aşağıdaki önerileri uygulayın:
HWC'nin, yeni istemci çerçeve arabellekleri sağlanana kadar eski istemci çerçeve arabelleklerini kullanmaya devam etmesi gerekiyorsa hem eski hem de yeni framebuffer'lar için yeterli bellek ayırmak ve muhtemelen çerçeve arabelleği bellek alanında birleştirme algoritmaları çalıştırmak kritik önem taşır.
Görüntü çerçeveleri için, grafik arabellek belleğinin geri kalanından ayrı bir özel bellek havuzu ayırın. Bu önemlidir, çünkü çerçeve ardışık düzenleyicilerinin ayrılması ve yeniden atanması arasında bir üçüncü taraf işlemi grafik belleği ayırmaya çalışabilir. Aynı grafik bellek havuzu, çerçeve önbelleği tarafından kullanılıyorsa ve grafik belleği doluysa üçüncü taraf işlemi daha önce bir çerçeve önbelleği tarafından ayrılan grafik belleğini işgal edebilir. Bu da çerçeve önbelleği yeniden atama işlemi için yetersiz bellek bırakır veya bellek alanını parçalara böler.
Test çerçeve ara belleği yönetimi
OEM'lerin, cihazlarının çözünürlük geçişlerinde istemci ön çerçeve bellek yönetiminin doğru olup olmadığını test etmeleri önerilir. Bu test aşağıdaki gibi açıklanmaktadır:
Hotplug etkinlikleri için, farklı çözünürlüklere sahip iki farklı ekranı çıkarıp yeniden bağlamanız yeterlidir.
Mod geçişleri için, ekran kartı belleği davranışını test etmek üzere bir mod geçişi başlatmak amacıyla
ModeSwitchingTestActivity
CTS Doğrulayıcı testini kullanın. Bu test, programatik olarak tespit edilmesi zor olan sorunları görsel olarak tanımlayabilir.