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

Android 13'ten itibaren, istemci kompozisyonu sırasında kullanılan yeni çerçeve arabellekleri, ekran çözünürlüğü her değiştiğinde ayrılır. Bu ayırma, çözünürlük değişikliğinden sonraki geçersiz kılma döngüsünde SurfaceFlinger tarafından gerçekleştirilir.

Çö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, bir harici ekrandan farklı bir varsayılan çözünürlüğe sahip başka bir harici ekrana geçiş yapıldığında gerçekleşir.

    Hotplug etkinliği sırasında, eski ekran verilerinin tahsisi kaldırıldığında eski arabelleklerin tutamaçları serbest bırakılır.

  • SurfaceFlinger tarafından başlatılan bir ekran modu geçişi. Bu geçiş, kullanıcı kullanıcı ayarları ile çö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 arabelleklerinin tutma yerleri, setActiveConfig veya setActiveConfigWithConstraints çağrılmadan önce SurfaceFlinger tarafından serbest bırakılır.

Eski ve yeni arabellekler için yeterli bellek ayırmayan cihazlarda bellek parçalanması gibi ciddi sorunları önlemek için HWC'nin eski arabellekleri kullanmayı bırakması ve aşağıdaki durumlarda gösterildiği gibi bu arabelleklerin tüm tutmaçlarını serbest bırakması kritik önem taşır:

Tutma yerlerinin serbest bırakılması, SurfaceFlinger'ın bir sonraki invalidate döngüsü sırasında gerçekleştirdiği yeni arabelleklerin ayrılmasından önce arabellek çerçevesi belleğinin tamamen serbest bırakılmasını sağlar.

Framebuffer yönetimiyle ilgili öneriler

HWC, eski çerçeve arabelleklerine yönelik tutma yerlerini zamanında serbest bırakmazsa yeni çerçeve arabelleği ayırma işlemi, eski çerçeve arabelleği ayırma işleminden önce gerçekleşir. 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 tutma yerlerini 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. Bu önemlidir, çünkü çerçeve arabelleklerinin serbest bırakılması ve yeniden tahsis edilmesi arasında üçüncü taraf bir işlem, grafik belleği tahsis etmeye çalışabilir. Aynı grafik belleği havuzu çerçeve arabelleği tarafından kullanılıyorsa ve grafik belleği doluysa üçüncü taraf işlemi, daha önce çerçeve arabelleği tarafından ayrılan grafik belleğini işgal edebilir. Bu durumda, çerçeve arabelleğinin yeniden ayrılması için yeterli bellek kalmaz veya bellek alanı parçalanabilir.

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çıklanır:

  • Hotplug etkinlikleri için iki farklı ekranı farklı çözünürlüklerde çıkarıp yeniden bağlamanız yeterlidir.

  • Mod geçişleri için, çerçeve arabelleği bellek davranışını test etmek üzere bir mod geçişi başlatmak üzere ModeSwitchingTestActivity CTS Verifier testini kullanın. Bu test, programatik olarak tespit edilmesi zor olan sorunları görsel olarak belirleyebilir.