Pacing frame

La libreria Android Frame Pacing, nota anche come Swappy, fa parte di Android Game SDK . Aiuta i giochi OpenGL e Vulkan a ottenere un rendering fluido e un corretto ritmo dei fotogrammi su Android.

La stimolazione dei fotogrammi è la sincronizzazione della logica di un gioco e del ciclo di rendering con il sottosistema di visualizzazione di un sistema operativo e l'hardware di visualizzazione sottostante. Il sottosistema di visualizzazione di Android è stato progettato per evitare alcuni artefatti visivi, come lo strappo. Il sottosistema di visualizzazione evita lo strappo effettuando le seguenti operazioni:

  • Buffering interno dei frame passati
  • Rilevamento degli invii di frame tardivi
  • Continuando a visualizzare il fotogramma corrente quando viene rilevato un fotogramma in ritardo

I tempi di visualizzazione dei fotogrammi incoerenti sono causati dal ciclo di rendering di un gioco che viene eseguito a una velocità diversa da quella supportata dall'hardware di visualizzazione nativo. I problemi sorgono quando il ciclo di rendering di un gioco viene eseguito troppo lentamente per l'hardware di visualizzazione sottostante, portando a tempi di visualizzazione incoerenti. Ad esempio, quando un gioco in esecuzione a 30 fps tenta di eseguire il rendering su un dispositivo che supporta nativamente 60 fps, il ciclo di rendering del gioco fa sì che un fotogramma ripetuto rimanga sullo schermo per altri 16 ms. Questo tipo di disconnessione crea sostanziali incoerenze nei tempi dei frame come 33 ms, 16 ms, 49 ms e così via. Scene eccessivamente complesse aggravano ulteriormente questo problema perché causano la perdita di fotogrammi.

La libreria Frame Pacing esegue queste attività:

  • Compensa la balbuzie dovuta ai brevi frame di gioco.
  • Utilizza recinzioni di sincronizzazione per fotogrammi lunghi che portano a balbuzie e latenza.
    • Inserisce le attese nell'app. Ciò consente alla pipeline del display di recuperare il ritardo, anziché consentire l'accumulo di contropressione.
    • Utilizza recinzioni di sincronizzazione ( EGL_KHR_fence_sync e VkFence ).
  • Sceglie una frequenza di aggiornamento per fornire flessibilità e una presentazione fluida, se il tuo dispositivo supporta più frequenze di aggiornamento.
  • Fornisce statistiche per il debug e la profilazione utilizzando le statistiche dei frame .

Per informazioni su come configurare la libreria per funzionare in diverse modalità in base alle proprie esigenze, vedere Modalità operative supportate .

Per implementare l'utilizzo del renderer OpenGL o del renderer Vulkan, vedere

Per ulteriori informazioni, consulta Ottenere un corretto ritmo dei fotogrammi .

Intervento di throttling dei fotogrammi al secondo

L'intervento di limitazione dei fotogrammi al secondo (FPS) consente ai giochi di procedere a un FPS appropriato utilizzando solo le modifiche lato piattaforma e senza richiedere alcuna azione da parte degli sviluppatori.

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

GameManagerService

Il componente GameManagerService conserva tutte le informazioni per utente e per gioco relative alla modalità di gioco e all'intervento nel gioco. Le informazioni FPS vengono archiviate nel GameManagerService con altre informazioni sull'intervento, come il fattore di riduzione della risoluzione, in una mappatura <PACKAGE_NAME, Interventions> per ciascun profilo utente. Si accede alle informazioni FPS quando si cambia la modalità di gioco o si aggiorna l'intervento. Un UID è univoco per ciascun PACKAGE_NAME e utente e può essere ulteriormente tradotto in una coppia <UID, Frame Rate> da inviare a SurfaceFlinger.

SurfaceFlinger

Il componente SurfaceFlinger supporta già la limitazione degli FPS di un'applicazione purché la frequenza dei fotogrammi sia un divisore della frequenza di aggiornamento del display. In caso di vsync, SurfaceFlinger controlla la validità del vsync per l'applicazione limitata verificando se il timestamp vsync è in fase con il frame rate dell'applicazione. Se il frame rate non è in fase con il vsync, SurfaceFlinger mantiene il frame finché il frame rate e il vsync non sono in fase.

La figura seguente descrive l'interazione tra GameManagerService e SurfaceFlinger:

Interazione tra GameManagerService e SurfaceFlinger

Figura 1. Interazione tra GameServiceManager e SurfaceFlinger

SurfaceFinger mantiene una mappatura della coppia <UID, Frame Rate> per impostare una nuova priorità di limitazione della frequenza dei fotogrammi. L' UID è univoco tra utenti e giochi, in modo che ciascun utente su un singolo dispositivo possa avere impostazioni diverse di frame rate sullo stesso gioco. Per limitare la frequenza fotogrammi di un gioco, GameServiceManager chiama SurfaceFlinger per sovrascrivere la frequenza fotogrammi per un UID. Con questo meccanismo, SurfaceFlinger aggiorna la mappatura ogni volta che si cambia la modalità di gioco o si aggiorna l'intervento. SurfaceFlinger gestisce la modifica FPS bloccando i buffer di conseguenza.

Per ulteriori informazioni sulla limitazione degli FPS, vedere Introduzione alla limitazione degli FPS .