Android 13'ten itibaren, ekran çözünürlüğü her değiştiğinde sistem, istemci kompozisyonu sırasında kullanılan yeni arabellekler ayırır. SurfaceFlinger, bu ayırmayı çözünürlük değişikliğinden sonraki geçersiz kılma döngüsünde gerçekleştirir.
Çözünürlük değiştirme 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 bir hotplug etkinliği. Bu etkinlik, varsayılan çözünürlüğü farklı olan bir harici ekrandan farklı bir harici ekrana geçiş yapıldığında gerçekleşir.
HWC, bir sıcak takma etkinliği sırasında eski ekran arabelleklerinin tutamaçlarını eski ekran verilerinin tahsisini kaldırdığında serbest bırakır.
SurfaceFlinger tarafından başlatılan bir ekran modu anahtarıdır. Kullanıcı ayarlarını kullanarak çözünürlüğü değiştirdiğinizde veya bir uygulama
preferredDisplayModeIdkullanarak çözünürlüğü değiştirdiğinde gerçekleşir.Ekran modu değiştirilirken SurfaceFlinger,
setActiveConfigveyasetActiveConfigWithConstraintsişlevini çağırmadan önce mevcut istemci çerçeve arabelleklerinin tutamaçlarını serbest bırakır.
Yeterli çerçeve arabelleği belleği olmayan cihazlarda bellek parçalanması gibi ciddi sorunları önlemek için HWC, eski çerçeve arabelleklerinin tutamaçlarını serbest bırakmalıdır. Bu, aşağıdaki durumlarda çok önemlidir:
Hotplug etkinlikleri için
onHotplugçağrısı yapılmadan hemen önce.Mod geçişleri için
setActiveConfigveyasetActiveConfigWithConstraintsnumaralı telefonu aradıktan hemen sonra.
Tutma yerlerinin serbest bırakılması, SurfaceFlinger bir sonraki invalidate döngüsünde yeni arabellekler ayırmadan önce arabellek çerçevesi belleğinin tamamen serbest bırakılmasını sağlar.
Framebuffer yönetimiyle ilgili öneriler
HWC, eski arabellekleri zamanında serbest bırakmazsa eski arabellek serbest bırakılmadan önce yeni arabellek ayrılır. Bu durum, yeni ayırma 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 tutamaçları hiç serbest bırakmazsa bellek sızıntısı oluşabilir.
Yıkıcı düzeyde tahsis hatalarını önlemek için aşağıdaki önerileri uygulayın:
HWC'nin yeni istemci arabellekleri sağlanana kadar eski istemci arabelleklerini kullanmaya devam etmesi gerekiyorsa hem eski hem de yeni arabellekler için yeterli bellek ayırmak ve arabellek bellek alanında birleştirme algoritmaları çalıştırmak kritik önem taşır.
Çerçeve arabellekleri için, grafik arabellek belleğinin geri kalanından ayrı özel bir bellek havuzu ayırın. Üçüncü taraf bir işlem, çerçeve arabelleği ayırma ve yeniden ayırma arasında ekran kartı belleği ayırmaya çalışabileceğinden bu önemlidir. Framebuffer aynı grafik belleği havuzunu kullanıyorsa ve grafik belleği doluysa üçüncü taraf işlemi, daha önce framebuffer tarafından ayrılan belleği kullanabilir. Bu durum, çerçeve arabelleği yeniden dağıtımı için yetersiz belleğe veya bellek parçalanmasına neden olabilir.
Test framebuffer yönetimi
OEM'lerin, cihazlarının çözünürlük geçişlerinde uygun istemci çerçeve arabelleği bellek yönetimini test etmeleri önerilir. Bu test şu şekilde açıklanmıştır:
Anında takma etkinlikleri için farklı çözünürlüklere sahip iki farklı ekranı çıkarıp yeniden bağlayın.
Mod geçişleri için, çerçeve arabelleği bellek davranışını test etmek üzere mod geçişi başlatmak üzere
ModeSwitchingTestActivityCTS Verifier testini kullanın. Bu test, programatik olarak tespit edilmesi zor olan sorunları görsel olarak belirleyebilir.