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

Android 13'ten itibaren sistem, ekran çözünürlüğü her değiştiğinde 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 Composer (HWC) tarafından başlatılan bir hotplug etkinliği, 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 ve kullanıcı ayarlarını kullanarak çözünürlüğü değiştirdiğinizde veya bir uygulama preferredDisplayModeId kullanarak çözünürlüğü değiştirdiğinde gerçekleşen bir ekran modu anahtarı.

    Ekran modu değiştirilirken SurfaceFlinger, setActiveConfig veya setActiveConfigWithConstraints iş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 kritik öneme sahiptir:

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 arabelleklerin serbest bırakılmasından önce yeni arabellek ayırma işlemi 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 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 grafik belleği ayırmaya çalışabileceğinden bu önemlidir. Çerçeve arabelleği aynı grafik bellek havuzunu kullanıyorsa ve grafik belleği doluysa üçüncü taraf işlemi, daha önce çerçeve arabelleği 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çıklanı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 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.