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 invalidate 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ünürlük değişiklikleri aşağıdaki iki senaryodan biri nedeniyle gerçekleşir:
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 hotplug etkinliği sırasında, eski ekran verileri tahsis edildiğinde eski çerçeve belleklerinin tutamaçlarının ayrılması gerekir.
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 tahsisinden önce çerçeve belleğinin tamamen tahsis edilmesini sağlar.
Görüntü çerçevesi yönetimiyle ilgili öneriler
HWC, eski çerçeve belleklerinin tutamacını zamanında serbest bırakmazsa yeni çerçeve belleği ayırma işlemi, eski çerçeve belleğinin serbest bırakılmasından ö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 yol açabilir. Daha da kötüsü, HWC bu imleçleri hiç serbest bırakmazsa hafıza sızıntısı meydana gelebilir.
Yıkıcı düzeyde atama hatalarını önlemek için aşağıdaki önerileri uygulayın:
HWC'nin yeni istemci çerçeve bellekleri sağlanana kadar eski istemci çerçeve belleklerini kullanmaya devam etmesi gerekiyorsa hem eski hem de yeni çerçeve bellekleri için yeterli bellek ayırmak ve muhtemelen çerçeve 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, ekran kartı belleğinin ayrılması ve yeniden ayrılması arasında üçüncü taraf bir işlemin grafik belleği ayırmaya çalışabileceği için önemlidir. 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 anahtarları arasında uygun istemci çerçeve belleği yönetimi olup olmadığını test etmeleri önerilir. Bu test aşağıdaki gibi açıklanır:
Sıcak takma etkinlikleri için farklı çözünürlüklere sahip iki farklı ekranı çıkarıp yeniden takmanı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.