Pacing frame

La libreria Android Frame Pacing, nota anche come CHANGEpy, fa parte dell'Android Game SDK. Consente ai giochi OpenGL e Vulkan di ottenere un rendering fluido e il pacing dei frame corretto su Android.

Il pacing dei frame è la sincronizzazione della logica di un gioco e del ciclo di rendering con il sottosistema di un sistema operativo e l'hardware display sottostante. Display Android è stato progettato per evitare alcuni artefatti visivi, come lo strappo. La il sottosistema display evita lo strappo procedendo nel seguente modo:

  • Buffering dei frame precedenti internamente
  • Rilevamento di invii tardivi di frame
  • Il frame corrente continua a essere visualizzato quando viene rilevato un frame finale.

I tempi di visualizzazione dei frame non coerenti sono causati dal loop di rendering di un gioco in esecuzione alle una velocità diversa da quella supportata dall'hardware display nativo. Si presentano dei problemi quando il ciclo di rendering di un gioco è troppo lento per l'hardware del display sottostante, causando tempi di visualizzazione incoerenti. Ad esempio, quando un gioco viene eseguito Il rendering a 30 f/s viene tentato di eseguire il rendering su un dispositivo che supporta in modo nativo la frequenza di 60 f/s. il ciclo di rendering del gioco fa sì che sullo schermo rimanga un frame ripetuto per 16 ms in più. Questo tipo di disconnessione crea notevoli incoerenze nelle durate frame ad esempio 33 ms, 16 ms, 49 ms e così via. Scene eccessivamente complesse ulteriormente questo problema perché causano la perdita di frame.

La libreria di pacing del frame esegue le seguenti attività:

  • Compensa lo stuttering dovuto ai frame di gioco brevi.
  • Utilizza le barriere di sincronizzazione per i frame lunghi che causano stuttering e latenza.
    • Inserisce tempi di attesa nell'app. Consentono alla pipeline display di rilevare piuttosto che aumentare la pressione negativa.
    • Utilizza le barriere di sincronizzazione (EGL_KHR_fence_sync e VkFence).
  • Sceglie una frequenza di aggiornamento per offrire flessibilità e una presentazione fluida, se il dispositivo supporta più frequenze di aggiornamento.
  • Fornisce statistiche per il debug e la profilazione utilizzando frame statistiche.

Per scoprire come configurare la libreria in modo che funzioni in modalità diverse a seconda in base alle tue esigenze, vedi Modalità operative supportate.

Per eseguire l'implementazione utilizzando il renderer OpenGL o il renderer Vulkan, consulta:

Per saperne di più, consulta Ottenere un pacing corretto dei frame.

Intervento di limitazione di frame al secondo

L'intervento di limitazione di frame al secondo (f/s) consente ai giochi di regolare il ritmo a un FPS appropriato usando solo il lato piattaforma modifiche e senza richiedere alcuna azione da parte degli sviluppatori parte.

L'implementazione dell'intervento di limitazione degli FPS utilizza i seguenti componenti:

Servizio GameManager

Lo Il componente GameManagerService gestisce tutte le risorse per utente Informazioni sulla modalità di gioco e sull'intervento del gioco per ogni partita. Le informazioni sui valori f/s vengono memorizzate nel GameManagerService con altre informazioni di intervento, ad esempio il fattore di downscaling della risoluzione, in una mappatura <PACKAGE_NAME, Interventions> per ogni profilo utente. Puoi accedere alle informazioni sugli FPS quando la modalità di gioco viene modificata o l'intervento viene aggiornato. R UID è univoco per ogni PACKAGE_NAME e utente e può essere tradotto ulteriormente in una coppia di <UID, Frame Rate> da inviare a SurfaceFlinger.

SurfaceFlinger

Il componente SurfaceFlinger supporta già Limitando l'FPS di un'applicazione purché la frequenza fotogrammi sia un divisore della frequenza di aggiornamento del display. Nel caso di una vsync, il SurfaceFlinger controlla la validità della vsync per la limitazione verificando se il timestamp vsync è in fase con la frequenza frame del un'applicazione. Se la frequenza fotogrammi non è in fase con la vsync, il SurfaceFlinger contiene il parametro frame fino a quando la frequenza frame e la modalità vsync sono in fase.

Nella figura seguente viene descritta l'interazione tra GameManagerService e SurfaceFlinger:

Interazione tra GameManagerService e SurfaceFlinger

Figura 1. Interazione tra GameServiceManager e SurfaceFlinger

SurfaceFinger mantiene una mappatura di coppia <UID, Frame Rate> per impostare una nuova la priorità della limitazione della frequenza fotogrammi. Il valore UID è univoco tra gli utenti e i giochi, quindi ogni un utente su un singolo dispositivo può avere diverse impostazioni della frequenza fotogrammi sullo stesso gioco. Per limitare frame rate di un gioco, GameServiceManager chiama SurfaceFlinger per sostituire la frequenza frame per un UID. Con questo meccanismo, SurfaceFlinger aggiorna il mapping ogni volta che cambia la modalità di gioco o l'intervento viene aggiornato. SurfaceFlinger gestisce la modifica del FPS bloccando i buffer di conseguenza.

Per saperne di più sulla limitazione f/s, consulta: Introduzione alla limitazione degli FPS.