Android 11, birden fazla yenileme hızına sahip cihazlar için destek ekler. Bu özellik üç ana bileşenden oluşur:
[email protected]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 eklendi. …composer HAL'in önceki sürümleri, yenileme hızı değiştirme için sınırlı destek sunduğundan bu sürümü kullanmanızı önemle tavsiye ederiz.
Yapılandırma grupları
CONFIG_GROUP adlı yeni bir özellik, getDisplayAttribute_2_4 API kullanılarak sorgulanabilen IComposerClient::Attribute'ye eklendi. Bu özellik, satıcıların 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ızı sağlar. Platform, hangi yapılandırmalar arasında geçiş yapılabileceğini ayırt etmek için yapılandırma grubunu kullanır. Böylece, bir yapılandırmanın yenileme hızı değiştirilir ancak diğer özellikler değiştirilmez.
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. 60 Hz'den 72 Hz'ye geçiş, ekran yapılandırmasını 1080p'den 1080i'ye değiştirir. Bu durum istenen davranış olmayabilir. Yapılandırma grupları bu sorunu çözer. 60 Hz ve 90 Hz'i tek 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ı anlar. Bunun nedeni, bu durumda yenileme hızının değiştirilmesinden ziyade yapılandırmada değişiklik yapılmasıdır.
Composer API güncellemeleri
- getDisplayVsyncPeriod
- Yenileme hızlarını değiştirirken daha iyi kontrol ve öngörülebilirlik için
getDisplayVsyncPeriodeklendi.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 yararlıdır. Platformun bir sonraki kareye ne zaman başlayacağına karar vermek için mevcut yenileme hızına ihtiyacı vardır. - setActiveConfigWithConstraints
setActiveConfigWithConstraintsyöntemi, mevcutsetActiveConfigyö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,vsyncPeriodChangeConstraintsparametrelerinin bir parçası olarak verilir ve aşağıdaki parametreleri içerir.- desiredTimeNanos
- Dikey senkronizasyon döneminin değişebileceği
CLOCK_MONOTONICzaman (yani dikey senkronizasyon dönemi bu zamandan ö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. Platform, içerik değişikliği sonucunda (ör. cihaz boşta ve animasyon başlıyor) yenileme hızı değişikliği gerektiğinde bu işareti kullanı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,trueolarak ayarlanmışsa uygulamanın dönüş kodu olarakSEAMLESS_NOT_POSSIBLEdeğerini döndürmesi ve aynı yapılandırma değişikliği sorunsuz bir şekilde yapılabildiğinde yenionSeamlessPossiblegeri çağırma işlevini çağırması beklenir. İşlem başarılı olduğunda, platforma yenileme hızı değişikliğinin ne zaman gerçekleşeceğini bildiren bir
VsyncPeriodChangeTimelinedöndürülür.newVsyncAppliedTimeNanosparametreleri, yeni ekranın yeni dikey senkronizasyon döneminde yenilenmeye başlayacağıCLOCK_MONOTONICsaatine ayarlanmalıdır. Bu,desiredTimeNanosile 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 üzere
refreshRequired, yenileme karesinin gönderilmesi gereken ilk dikey senkronizasyonu belirtmek üzererefreshTimeNanosparametresine sahiptir.- onVsyncPeriodTimingChanged [callback]
- HAL'ın, zaman çizelgesinin bazı parametrelerinin değiştiğini ve platformun zaman çizelgesini ayarlaması gerektiğini belirtmek için çağırabileceği 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çilecekSurfaceFlingeriç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ı
SurfaceFlingeradresinden sorgulayarak varsayılan yapılandırma kimliğini bulur. - Sistem koşulları üzerinde yineleme yaparak 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_defaultRefreshRateyapı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, çalışma zamanında mevcut cihaz ayarını (ör. bir menü seçeneğinden) yansıtacak şekilde değiştirilir. Varsayılan değer,R.integer.config_defaultPeakRefreshRateyapı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.preferredDisplayModeIddeğerini 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 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:Ayarlanırsa kare hızı ayarlanmamış olsa bile yenileme hızı 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.