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, mevcutsetActiveConfig
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 olarakSEAMLESS_NOT_POSSIBLE
döndürmesi ve aynı yapılandırma değişikliği sorunsuz bir şekilde yapılabildiğinde yenionSeamlessPossible
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
refreshRequired
parametresi ve yenileme çerçevesinin gönderilmesi gereken ilk vsync'i belirtenrefreshTimeNanos
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 durumdaDisplayManager
, 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.
- Varsayılan yenileme hızı ayarı: Varsayılan yenileme hızı değeri
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.