Android 11, birden fazla yenileme hızına sahip cihazlar için destek ekler. Bu özelliğin üç ana bileşeni vardır:
android.hardware.graphics.composer@2.4
sürümünde yeni HAL API'leri kullanıma sunuldu.- Farklı yenileme hızları için cihaz yapılandırmalarını ayrıştıracak ve istenen yenileme hızını ayarlayacak platform kodu
- Uygulamaların istediği kare hızını ayarlamasına olanak tanıyan yeni SDK ve NDK API'leri
Uygulama
Yenileme hızı değiştirme için özel destek android.hardware.graphics.composer@2.4 HAL
'ya eklendi.
composer HAL'in önceki sürümleri yenileme hızı geçişini sınırlı olarak desteklediğinden bu sürümü kullanmanızı önemle tavsiye ederiz.
Yapılandırma grupları
CONFIG_GROUP
adlı yeni bir özellik, getDisplayAttribute_2_4
API'si kullanılarak sorgulanabilen IComposerClient::Attribute
'ye eklendi. Bu özellik, tedarikçilerin ekran yapılandırmalarını birlikte gruplandırmasına olanak tanır. Aynı gruptaki yapılandırmalar çoğu durumda bunlar arasında sorunsuz geçiş yapmanızı sağlar. Yapılandırma grubu, yenileme hızını değiştirmek için platform tarafından kullanılır. Bu sayede, yapılandırmanın diğer özelliklerini değiştirmeden hangi yapılandırmalar arasında geçiş yapılabileceği belirlenir.
Dört ekran yapılandırmasını destekleyen bir cihazda yapılandırma gruplarını kullanmanın avantajlarını gösteren aşağıdaki örneği inceleyin:
- 1080p@60Hz
- 1080p@90Hz
- 1080i@72Hz
- 1080i@48Hz
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'ye geçiş yapıldığında ekran yapılandırması 1080p'den 1080i'ye değişir. Bu, istenen bir 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 toplayarak. Platform, 60 Hz ile 90 Hz arasında 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, bu durumda yenileme hızını değiştirmek yerine yapılandırmanın değiştirilmesi gerekmesidir.


Composer API güncellemeleri
- getDisplayVsyncPeriod
- Yenileme hızları değiştirilirken daha iyi kontrol ve öngörülebilirlik için
getDisplayVsyncPeriod
eklendi.getDisplayVsyncPeriod
, ekranın çalıştığı mevcut yenileme hızını (dikey senkronizasyon dönemi açısından) döndürür. Bu özellik, özellikle yenileme hızı arasında geçiş yaparken kullanışlıdır. Platformun bir sonraki kareye ne zaman başlayacağına karar vermesi için mevcut yenileme hızı gerekir. - 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
- vsync döneminin değişebileceği
CLOCK_MONOTONIC
süresi (yani vsync dönemi bu süreden önce değişmemelidir). Bu, platformun yenileme hızı değişikliği için önceden plan yapmak istediği ancak kuyrukta sunulacak bazı arabelleklerin olduğu durumlarda kullanışlıdır. Platform, bu aralıkları hesaba katmak ve yenileme hızı geçişinin olabildiğince sorunsuz olmasını sağlamak için bu süreyi buna göre ayarlar. - seamlessRequired
- Doğruysa vsync dönemi değişikliğinin fark edilebilir görsel öğe olmadan sorunsuz bir şekilde gerçekleşmesi gerekir. Bu işaret, içerik değişikliği (ör. cihaz boşta ve animasyon başlıyor) sonucunda yenileme hızı değişikliği gerektiğinde platform tarafından kullanılır. Bu sayede, satıcılar belirli yapılandırma değişikliklerinin belirgin görsel hatalara yol açabileceği durumlarda bu değişikliklere izin vermeyebilir. Yapılandırmalar sorunsuz bir şekilde değiştirilemiyorsa ve
seamlessRequired
,true
olarak ayarlanmışsa uygulamanın dönüş kodu olarakSEAMLESS_NOT_POSSIBLE
değerini 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. Uygulama başarılı olduğunda, yenileme hızı değişikliğinin ne zaman gerçekleşeceğini platforma bildiren bir
VsyncPeriodChangeTimeline
döndürür.newVsyncAppliedTimeNanos
parametreleri, yeni ekranın yeni dikey senkronizasyon döneminde yenilenmeye başlayacağıCLOCK_MONOTONIC
saatine ayarlanmalıdır. Bu,desiredTimeNanos
ile birlikte platformun yenileme hızı geçişini önceden planlamasına ve yeni yenileme hızı için uygulamaları önceden işaretlemeye başlamasına olanak tanır. Bu sayede yenileme hızı sorunsuz bir şekilde değiştirilebilir.Bazı uygulamalarda yenileme hızının gönderilebilmesi için yenileme karesinin gönderilmesi gerekir. Bunun için HAL, yenileme karesinin gerekli olduğunu belirtmek için
refreshRequired
, yenileme karesinin gönderilmesi gereken ilk dikey senkronizasyonu belirtmek için iserefreshTimeNanos
parametresine sahiptir.- onVsyncPeriodTimingChanged [callback]
- HAL tarafından, zaman çizelgesinin bazı parametrelerinin değiştiğini ve platformun zaman çizelgesini ayarlaması gerektiğini belirtmek için çağrılabilen yeni bir geri çağırma. Bu geri çağırma, HAL'deki uzun işleme süresi veya geç yenileme çerçevesi nedeniyle eski zaman çizelgesi kaçırılırsa çağrılır.
Platform, yenileme hızını değiştirmeye nasıl karar veriyor?
Yenileme hızı seçimi aşağıdaki iki sistem hizmetinde gerçekleşir:
- DisplayManager
- , yenileme hızıyla ilgili
DisplayManager
üst düzey politikasını belirler. Varsayılan bir ekran yapılandırması ayarlar. Bu yapılandırma, Composer HAL yapılandırmasıyla aynıdır. Ayrıca, yenileme hızı olarak seçilecekSurfaceFlinger
için minimum ve maksimum değer aralığı belirler. - SurfaceFlinger
- Varsayılan yapılandırmayla aynı yapılandırma grubunda olan ve minimum/maksimum aralığında bir yenileme hızına sahip bir yapılandırma ayarlayarak yenileme hızını belirler.
Görüntüleme Yöneticisi, politikayı belirlemek için aşağıdaki adımları uygular:
- Etkin yapılandırmayı
SurfaceFlinger
adresinden sorgulayarak varsayılan yapılandırma kimliğini bulur. - Sistem koşullarını yineleyerek 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 katmanında ayarlanır. Bu değer, animasyonlar ve dokunma etkileşimleri için standart cihaz yenileme hızını belirlemek üzere kullanılır. - Yoğun yenileme hızı ayarı: Yoğun yenileme hızı değeri
Settings.System.PEAK_REFRESH_RATE
'dan okunur. Bu değer, mevcut cihaz ayarını yansıtmak için çalışma zamanında (ör. bir menü seçeneğinden) değiştirilir. Varsayılan değer,R.integer.config_defaultPeakRefreshRate
yapılandırma katmanında ayarlanır. - Minimum yenileme hızı ayarı: Minimum yenileme hızı değeri
Settings.System.MIN_REFRESH_RATE
'den okunur. Bu değer, mevcut cihaz ayarını yansıtacak şekilde çalışma zamanında (ör. bir menü seçeneğinden) değiştirilebilir. Varsayılan değer 0 olduğundan varsayılan minimum değer yoktur. - Uygulama tarafından istenen ModeId: Uygulamalar, ekranın çalışması gereken tercih edilen yapılandırmayı yansıtmak için
WindowManager.LayoutParams.preferredDisplayModeId
değerini 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 belirler. - 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ı ayarladıktan sonra,
SurfaceFlinger
yenileme hızını etkin katmanlara (kare güncellemelerini sıraya alan katmanlar) göre ayarlar. Katmanın sahibi bir kare hızı belirlerse SurfaceFlinger, yenileme hızını bu hızın katı olan bir değere ayarlamaya çalışır.
Örneğin, iki etkin katman kare hızını 24 ve 60 olarak ayarlarsa SurfaceFlinger, 120 Hz kullanılabilirse bu hızı seçer. SurfaceFlinger için böyle bir yenileme hızı mevcut değilse 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şaretleri kullanır:
ro.surface_flinger.use_content_detection_for_refresh_rate:
Yenileme hızı ayarlanmamış olsa bile etkin katmanlara göre belirlenir. SurfaceFlinger, katmanın arabellekleri yayınladığı ortalama FPS'yi, arabelleğe eklenen sunum zaman damgasına bakarak bulduğu bir sezgisel yöntem kullanır.ro.surface_flinger.set_touch_timer_ms
: > 0 ise kullanıcı, yapılandırılan zaman aşımı süresince ekrana dokunduğunda varsayılan yenileme hızı kullanılır. Bu sezgisel yöntem, animasyonlar için varsayılan yenileme hızına hazır olmak amacıyla uygulanır.ro.surface_flinger.set_idle_timer_ms
: > 0 ise yapılandırılan 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 yapılandırılan zaman aşımı için ekran açıldığında (veya AOD'den çıkıldığında) varsayılan yenileme hızı kullanılır.
Frame Rate API
Kare hızı API'si, uygulamaların amaçladıkları kare hızını Android platformuna bildirmesine 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, mevcut yenileme hızıyla ekranda bir yer paylaşımını açıp kapatan 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.