Çoklu yenileme hızı

Android 11, birden fazla yenileme hızı olan cihazlar için destek ekler. Bu özelliğin üç ana bileşeni vardır:

  • android.hardware.graphics.composer@2.4 tarihinde yeni HAL API'leri kullanıma sunuldu.
  • Farklı yenileme hızları için cihaz yapılandırmalarını ayrıştırıp istenen yenileme hızını ayarlayan platform kodu
  • Uygulamaların istedikleri kare hızını ayarlamalarına olanak tanıyan yeni SDK ve NDK API'leri

Uygulama

Yenileme hızı geçişi için özel destek android.hardware.graphics.composer@2.4 HAL'e eklendi. composer HAL'ın önceki sürümleri yenileme hızı geçişi için sınırlı destek sunduğundan bu sürümü kullanmanızı önemle tavsiye ederiz.

Yapılandırma grupları

IComposerClient::Attribute alanına, getDisplayAttribute_2_4 API kullanılarak sorgulanabilir yeni bir CONFIG_GROUP özelliği eklendi. Bu özellik, tedarikçilerin ekran yapılandırmalarını gruplandırmasına olanak tanır. Aynı gruptaki yapılandırmalar, çoğu durumda bunlar arasında sorunsuz geçiş yapmanıza olanak tanır. Platform tarafından, yapılandırmanın diğer özelliklerini değil, yenileme hızını değiştirmek için hangi yapılandırmaların arasında geçiş yapılabileceğini ayırt etmek amacıyla yapılandırma grubu kullanılır.

Dört ekran yapılandırmasını destekleyen bir cihazda yapılandırma gruplarının kullanılmasının avantajlarını gösteren aşağıdaki örneği inceleyin:

  • 60 Hz'de 1080p
  • 90 Hz'de 1080p
  • 72 Hz'de 1080i
  • 48 Hz'de 1.080i

Cihaz 48 Hz, 60 Hz, 72 Hz ve 90 Hz yenileme hızlarını desteklese de ekran farklı bir modda çalışır ve 60 Hz'den 72 Hz'e geçmek, ekran yapılandırmasını 1080p'den 1080i'ye değiştirir. Bu, istenen davranış olmayabilir. Bu sorun, yapılandırma grupları kullanılarak çözülür. 60 Hz ve 90 Hz'i bir yapılandırma grubunda, 48 Hz ve 72 Hz'i ise başka bir yapılandırma grubunda gruplandırarak. Platform, 60 Hz ile 90 Hz ve 48 Hz ile 72 Hz arasında geçiş yapabileceğini ancak 60 Hz ile 72 Hz arasında geçiş yapamayacağını bilir. Bunun nedeni, 60 Hz ile 72 Hz arasında geçiş yapılmasının yenileme hızını değiştirmekten ziyade yapılandırma değişikliğine yol açmasıdır.

Composer API güncellemeleri

getDisplayVsyncPeriod
Yenileme hızlarını değiştirirken daha iyi kontrol ve öngörülebilirlik için getDisplayVsyncPeriod eklendi. getDisplayVsyncPeriod, ekranın çalıştığı geçerli yenileme hızını (vsync dönemi Bu özellikle, platformun bir sonraki kareyi ne zaman başlatacağına karar vermek için yenileme hızı ile mevcut yenileme hızı arasında geçiş yaparken yararlıdır.
setActiveConfigWithConstraints
setActiveConfigWithConstraints yöntemi, mevcut setActiveConfig yönteminin yeni bir uzantısıdır ve yapılandırma değişikliği hakkında daha fazla bilgi sağlar. Kısıtlamalar, vsyncPeriodChangeConstraints parametrelerinin bir parçası olarak verilir ve aşağıdaki parametreleri içerir.
    desiredTimeNanos
    CLOCK_MONOTONIC içinde, vsync süresinin değişebileceği zaman (yani vsync süresi bu zamandan önce değişmemelidir). Bu özellik, platformun yenileme hızı değişikliği için önceden plan yapmak istediği ancak sırada gösterilecek bazı arabellekleri olduğunda faydalıdır. Platform, bu tamponları hesaba katmak ve yenileme hızı geçişinin olabildiğince sorunsuz olmasını sağlamak için bu süreyi de buna göre ayarlar.
    sorunsuzGerekli
    Doğruysa vsync dönemi değişikliğinin belirgin bir görsel kusur olmadan sorunsuz bir şekilde gerçekleşmesini gerektirir. Bu işaret, içerik değişikliğinin sonucu olarak yenileme hızı değişikliği gerektiğinde (örneğin, cihaz boşta kaldığında ve animasyon başladığında) platform tarafından kullanılır. Bu, tedarikçi firmanın belirgin bir görsel yapıyla sonuçlanabilecek olan belirli yapılandırma değişikliklerine izin vermeme fırsatı sunar. Yapılandırmalar sorunsuz bir şekilde değiştirilemiyorsa ve seamlessRequired true olarak ayarlanmışsa uygulamanın, döndürülen kod olarak SEAMLESS_NOT_POSSIBLE döndürmesi ve aynı yapılandırma değişikliği sorunsuz bir şekilde yapılabildiğinde yeni onSeamlessPossible geri çağırma işlevini çağırması beklenir.

Başarı sonrasında uygulama, platforma yenileme hızı değişikliğinin ne zaman gerçekleşeceğini bildiren bir VsyncPeriodChangeTimeline döndürür. newVsyncAppliedTimeNanos parametrelerinin, yeni ekranın yeni vsync döneminde yenilenmeye başlayacağı CLOCK_MONOTONIC zamanına ayarlanması gerekir. Bu, desiredTimeNanos ile birlikte platformun yenileme hızı geçişini önceden planlamasına ve uygulamaları yeni yenileme hızı için önceden işaretlemeye başlamasına olanak tanır. Bu, yenileme hızının sorunsuz bir şekilde geçiş yapmasını sağlar.

Bazı uygulamalarda, yenileme hızının gönderilebilmesi için bir yenileme çerçevesinin gönderilmesi gerekir. Bunun için HAL'de, yenileme çerçevesine ihtiyaç duyulduğunu belirten refreshRequiredparametresi ve yenileme çerçevesinin gönderilmesi gereken ilk vsync'i belirten refreshTimeNanos parametresi bulunur.

onVsyncPeriodTimingChanged [callback]
HAL tarafından, zaman çizelgesindeki bazı parametrelerin değiştirildiğini ve platformun zaman çizelgesini ayarlaması gerektiğini platforma bildirmek için çağrılabilecek yeni bir geri çağırma. HAL'de uzun işleme süresi veya geç yenileme çerçevesi nedeniyle herhangi bir nedenle eski zaman çizelgesine erişilemediğinde bu geri çağırmanın çağrılması beklenir.

Platform, yenileme hızını nasıl değiştirmeye karar verir?

Yenileme hızı seçimi aşağıdaki iki sistem hizmetinde gerçekleşir:

DisplayManager
DisplayManager, yenileme hızı ile ilgili üst düzey politikayı belirler. Besteci HAL yapılandırmasıyla aynı olan varsayılan bir görüntüleme yapılandırması belirler. Ayrıca, SurfaceFlinger için yenileme hızı olarak seçebileceği minimum ve maksimum bir değer aralığı belirler.
Yüzey Fırlatıcı
Varsayılan yapılandırmayla aynı yapılandırma grubunda bulunan ve minimum/maksimum aralıktaki bir yenileme hızı içeren bir yapılandırma ayarlayarak yenileme hızını belirler.

Görüntülü Reklam Yöneticisi, politikayı belirlemek için aşağıdaki adımları uygular:

  • SurfaceFlinger kaynağından etkin yapılandırmayı sorgulayarak varsayılan yapılandırma kimliğini bulur
  • Sistem koşullarını iterleyerek minimum ve maksimum değer aralığını kısıtlama
    • Varsayılan yenileme hızı ayarı: Varsayılan yenileme hızı değeri R.integer.config_defaultRefreshRate yapılandırma yer paylaşımında ayarlanır. Bu değer, animasyonlar ve dokunma etkileşimleri için standart cihaz yenileme hızını belirlemek amacıyla kullanılır.
    • En yüksek yenileme hızı ayarı: En yüksek yenileme hızı değeri Settings.System.PEAK_REFRESH_RATE tarihinden itibaren okunur. Bu değer, mevcut cihaz ayarını yansıtacak şekilde çalışma zamanında değiştirilir (ör. bir menü seçeneğinde). Varsayılan değer, R.integer.config_defaultPeakRefreshRate yapılandırma yer paylaşımında ayarlanır.
    • Minimum yenileme hızı ayarı: Minimum yenileme hızı değeri Settings.System.MIN_REFRESH_RATE'den okunur. Bu değer, çalışma zamanında mevcut cihaz ayarını yansıtacak şekilde değiştirilebilir (ör. bir menü seçeneğinden). Varsayılan değer 0 olduğundan varsayılan minimum değer yoktur.
    • Uygulama tarafından istenen ModeId: Uygulamalar, WindowManager.LayoutParams.preferredDisplayModeId değerini ekranın çalışması gereken tercih edilen yapılandırmayı yansıtacak şekilde ayarlayabilir. Çoğu durumda DisplayManager, varsayılan yapılandırma kimliğini buna göre ayarlar ve minimum ile maksimum yenileme hızını, yapılandırmanın yenileme hızıyla eşleşecek şekilde ayarlar.
    • Pil Tasarrufu: Cihaz düşük güç modundayken yenileme hızı 60 Hz veya daha düşük bir değerle sınırlandırılır. Bu durum Settings.Global.LOW_POWER_MODE. simgesiyle gösterilir.

DisplayManager politikayı belirledikten sonra SurfaceFlinger, etkin katmanlara (kare güncellemelerini sıraya ekleyen katmanlar) göre yenileme hızını belirler. Katmanın sahibi bir kare hızı ayarlarsa SurfaceFlinger, yenileme hızını bu hızın çarpanı olan bir değere ayarlamayı dener. Örneğin, iki etkin katman kare hızını 24 ve 60 olarak ayarlarsa SurfaceFlinger, mevcutsa 120 Hz'i seçer. SurfaceFlinger bu tür bir yenileme hızını kullanamıyorsa kare hızı için en az hataya sahip yenileme hızını seçmeye çalışır. Daha fazla bilgi için developer.android.com adresindeki geliştirici belgelerine bakın.

SurfaceFlinger, yenileme hızının nasıl belirleneceğini kontrol etmek için aşağıdaki işaretçileri korur:

  • ro.surface_flinger.use_content_detection_for_refresh_rate: Ayarlanırsa kare hızı ayarlanmasa bile yenileme hızına etkin katmanlara göre karar verilir. SurfaceFlinger, arabelleğe eklenen sunma zaman damgasına bakarak katmanın yayınladığı arabellekleri ortalama kare hızını bulduğu bir sezgisel yöntem kullanır.
  • ro.surface_flinger.set_touch_timer_ms: Değer 0'dan büyükse kullanıcı, yapılandırılan zaman aşımı için ekrana dokunduğunda varsayılan yenileme hızı kullanılır. Bu sezgisel yaklaşım, animasyonlar için varsayılan yenileme hızıyla hazır olmak amacıyla yapılır.
  • ro.surface_flinger.set_idle_timer_ms: > 0 ise yapılandırılmış zaman aşımı için ekran güncellemesi olmadığında minimum yenileme hızı kullanılır.
  • ro.surface_flinger.set_display_power_timer_ms: > 0 ise ekran açıldığında (veya AOD'den çıktığınızda) yapılandırılmış zaman aşımı için varsayılan yenileme hızı kullanılır.

Frame Rate API

Kare hızı API'si, uygulamaların Android platformunu hedefledikleri kare hızıyla ilgili bilgilendirmesine olanak tanır ve Android 11'i hedefleyen uygulamalarda kullanılabilir. Kare hızı API'si hakkında daha fazla bilgi edinmek için developer.android.com adresindeki geliştirici belgelerine göz atın.

Geliştirici seçenekleri

Menüye, ekranda mevcut yenileme hızıyla bir yer paylaşımını açan yeni bir geliştirici seçeneği eklendi. Yeni seçenek, Ayarlar > Sistem > Geliştirici seçenekleri > Yenileme hızını göster bölümünde yer alır.