Analizza la pianificazione dei thread

Ci sono alcuni aspetti da considerare per stabilire se i thread del processo di gioco vengono utilizzati e programmati in modo appropriato per ottenere le prestazioni migliori.

  • Pacing frame
  • Multi-threading e parallelizzazione dei thread
  • Affinità core della CPU

Multi-threading

Molti giochi e motori di gioco utilizzano il multithreading per suddividere il lavoro della CPU in attività logiche, che possono essere eseguite in modo indipendente. Una configurazione tipica è un thread di gioco per la logica di input e di gioco, un thread di rendering per la preparazione e l'invio di oggetti da disegnare e thread di lavoro per altre attività secondarie come animazioni o audio.

Consigliamo di eseguire il caricamento in contemporanea dei thread per sfruttare i miglioramenti delle prestazioni del multithreading. Un esempio è uno scenario in cui i thread di gioco e rendering vengono eseguiti contemporaneamente parzialmente o completamente su core diversi. Ciò non sempre sarà possibile, ad esempio in casi con dipendenze dati condivise; tuttavia, quando possibile, ciò potrebbe comportare tempi di CPU inferiori e quindi frequenze fotogrammi potenzialmente più elevate.

Gioco con un thread principale e di rendering ben parallelizzati, oltre a un thread di lavoro e un thread audio
Figura 1. Gioco con un thread principale e di rendering ben parallelizzati, oltre a un thread di lavoro e un thread audio

Affinità core della CPU

Un fattore che influisce in modo significativo sulle prestazioni dei carichi di lavoro della CPU è il modo in cui vengono pianificati sui core. Questa sezione può essere suddivisa in due componenti:

  • Se i thread del tuo gioco vengono eseguiti sui core migliori per migliorare le prestazioni
  • Se i thread di gioco passano spesso da un core all'altro

Puoi esaminare il comportamento del thread di CPU in Utilizzo CPU attivando la CPU nella configurazione del profilo quando esegui un'analisi. Aumentando lo zoom su una sezione della traccia inferiore a 200 ms, puoi visualizzare i singoli processi in esecuzione sui core della CPU del tuo dispositivo. In genere, i core di piccole dimensioni corrispondono a indici più piccoli (ad esempio, CPU 0-3), mentre i core di grandi dimensioni corrispondono a indici più elevati (ad esempio, CPU 6-7).

In genere, quando il gioco è in primo piano, i thread permanenti come il thread del gioco e il thread di rendering dovrebbero essere eseguiti su core di grandi dimensioni ad alte prestazioni, mentre altri thread di processi e worker potrebbero essere pianificati su core più piccoli.

Gioco con il thread principale e di rendering in esecuzione principalmente sui grandi core (CPU 6-7), mostrati in azzurro
Figura 2. Gioco con thread principale e di rendering in esecuzione principalmente sui core di grandi dimensioni (CPU 6-7), mostrati in azzurro

Puoi anche osservare se i thread di gioco passano frequentemente da un core all'altro, nel caso in cui il thread principale e quello di rendering cambino i core all'interno di un singolo frame della CPU o tra due frame della CPU consecutivi. È probabile che questo comportamento della CPU indichi che i thread di gioco non sono affiniti correttamente. Queste switch core comportano un overhead dovuto alla modifica di contesto e la perdita di stato con i registri o la cache di un core, con un conseguente aumento della lunghezza del frame della CPU.

Gioco con il thread principale (Thread-7) e di rendering (Thread-8) che passa da un core all'altro, mostrato in viola
Figura 3. Gioco con thread principale (Thread-7) e di rendering (Thread-8) che passa da un core all'altro, mostrati in viola