İstemci çerçeve arabelleği yönetimi

Android 13'ten başlayarak, istemci oluşturma sırasında kullanılan yeni çerçeve arabellekleri, ekran çözünürlüğü değiştiğinde tahsis edilir. Bu tahsis, bir çö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 ara belleği yönetimi

Çözünürlük değişiklikleri aşağıdaki iki senaryodan biri nedeniyle oluşur:

  • Hardware Composer (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ılırken meydana gelen, çalışırken takılabilir bir olay .

    Çalışırken takma olayı sırasında, eski ekran verilerinin yeri kaldırıldığında eski çerçeve arabelleklerine yönelik tanıtıcılar serbest bırakılır.

  • 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 ortaya çıkan, SurfaceFlinger tarafından başlatılan bir görüntüleme modu anahtarı.

    Görüntüleme modu geçişi sırasında, mevcut istemci çerçeve arabelleklerinin tanıtıcıları, setActiveConfig veya setActiveConfigWithConstraints çağrılmadan önce SurfaceFlinger tarafından serbest bırakılır.

Eski ve yeni çerçeve arabellekleri için yeterli bellek ayırmayan cihazlarda bellek parçalanması gibi yıkıcı sorunları önlemek için, HWC'nin eski çerçeve arabelleklerini kullanmayı bırakması ve aşağıdaki durumlarda gösterildiği gibi bu çerçeve arabelleklerine yönelik tüm tanıtıcıları serbest bırakması çok önemlidir:

Tutamaçların serbest bırakılması, SurfaceFlinger'ın bir sonraki geçersiz kılma döngüsü sırasında gerçekleştirdiği yeni çerçeve arabelleklerinin tahsis edilmesinden önce çerçeve arabellek belleğinin tamamen serbest bırakılmasına olanak tanır.

Çerçeve arabelleği yönetimi için öneriler

HWC, eski çerçeve arabelleklerine yönelik tanıtıcıları zamanında serbest bırakmazsa, yeni çerçeve arabelleği tahsisi, eski çerçeve arabelleği serbest bırakılmasından önce gerçekleşir. Parçalanma veya diğer sorunlar nedeniyle yeni tahsis başarısız olduğunda bu durum çok büyük sorunlara neden olabilir. Daha da kötüsü, HWC bu tanıtıcıları hiç serbest bırakmazsa bellek sızıntısı meydana gelebilir.

Felaket yaratan tahsisat hatalarını önlemek için şu önerileri izleyin:

  • HWC'nin, yeni istemci çerçeve arabellekleri sağlanana kadar eski istemci çerçeve arabelleklerini kullanmaya devam etmesi gerekiyorsa, hem eski hem de yeni çerçeve arabellekleri için yeterli belleği ayırmak ve muhtemelen çerçeve arabelleği bellek alanında birleştirme algoritmaları çalıştırmak kritik öneme sahiptir.

  • Çerçeve arabellekleri için, grafik arabellek belleğinin geri kalanından ayrı, ayrılmış bir bellek havuzu ayırın. Bu önemlidir çünkü çerçeve arabelleklerinin serbest bırakılması ve yeniden tahsisi arasında, üçüncü taraf bir işlem grafik belleğini tahsis etmeye çalışabilir. Çerçeve arabelleği tarafından aynı grafik bellek havuzu kullanılıyorsa ve grafik belleği doluysa, üçüncü taraf işlemi, çerçeve arabelleği tarafından daha önce tahsis edilen grafik belleğini işgal edebilir, böylece çerçeve arabelleğinin yeniden tahsisi için yetersiz bellek bırakabilir veya muhtemelen bellek alanını parçalayabilir. .

Çerçeve arabelleği yönetimini test edin

OEM'lerin, cihazları için çözünürlük anahtarları arasında uygun istemci çerçeve arabelleği bellek yönetimini aşağıda açıklandığı şekilde test etmeleri önerilir:

  • Çalışırken takma olayları için, farklı çözünürlüklere sahip iki farklı ekranın fişini çıkarıp yeniden bağlamanız yeterlidir.

  • Mod anahtarları için, çerçeve arabelleği bellek davranışını test etmek amacıyla bir mod anahtarı başlatmak için ModeSwitchingTestActivity CTS Doğrulayıcı testini kullanın. Bu test, programlı olarak tespit edilmesi zor olan sorunları görsel olarak tanımlayabilir.