Analizza la pianificazione dei thread

Ci sono alcuni aspetti da considerare per determinare se i thread del tuo processo di gioco sono utilizzati in modo appropriato e pianificati per le prestazioni migliori.

  • Pacing del frame
  • Multi-threading e caricamento in contemporanea dei thread
  • Affinità core della CPU

Multi-threading

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

Consigliamo di caricare in contemporanea i thread per sfruttare al meglio le prestazioni del multithreading. Un esempio è uno scenario in cui i thread di gioco e rendering vengono eseguiti parzialmente o completamente contemporaneamente su core diversi. Questo non sarà sempre possibile, ad esempio nei casi con dipendenze di dati condivise; tuttavia, quando possibile, ciò potrebbe ridurre i tempi di CPU e, di conseguenza, le frequenze fotogrammi più alte.

Gioco con un thread principale e di rendering ben parallelizzati, nonché un thread worker e un thread audio
Figura 1. Gioco con un thread principale e di rendering ben parallelo, nonché un thread worker e un thread audio

Affinità core della CPU

Un fattore che influisce notevolmente sulle prestazioni dei carichi di lavoro della CPU è il modo in cui vengono pianificati sui core. Può essere suddiviso in due componenti:

  • Se i thread di gioco vengono eseguiti sul core più adatto al loro carico di lavoro.
  • Indica se i thread del gioco passano frequentemente da un core all'altro.

I dispositivi moderni spesso utilizzano un'architettura chiamata computing eterogeneo, in cui i core hanno diversi livelli di prestazioni:

  • Uno o più core offrono alti picchi di prestazioni, ma consumano più energia. Questi sono a volte chiamati core "grandi".
  • Altri core hanno prestazioni di picco inferiori, ma sono più efficienti dal punto di vista energetico. Questi sono a volte chiamati core "piccoli".
  • Facoltativamente: uno o più core offrono un equilibrio tra prestazioni e potenza. Questi sono a volte chiamati core "medi".

Puoi esaminare il comportamento del thread della CPU in Utilizzo CPU abilitando la CPU nella configurazione del profilo quando esegui una traccia. Aumentando lo zoom di una sezione della traccia inferiore a 200 ms, puoi visualizzare i singoli processi in esecuzione sui core della CPU del dispositivo. In genere, i core più piccoli corrispondono a indici più piccoli (ad esempio, CPU "0"-"3"), mentre i core più grandi corrispondono a indici più elevati (ad esempio, CPU "6"-"7") e i core centrali, se presenti, occuperanno indici intermedi (ad esempio, CPU "5"-"6"). È una convenzione comune, ma non è una garanzia.

Se noti che determinati thread vengono pianificati su CPU che non soddisfano le loro esigenze di prestazioni o potenza, valuta la possibilità di impostare manualmente l'affinità della CPU per questi thread.

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

Puoi anche osservare se i thread passano da un core all'altro. Questi switch di core comportano un certo overhead dovuto al cambio di contesto e la perdita di stato con la cache/i registri di un core.

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

L'impostazione dell'affinità CPU per un thread indica al sistema di pianificarlo sul core specificato quando il gioco è in primo piano. Per farlo, ci sono diversi fattori da considerare:

  • Il software della piattaforma non è in grado di regolare dinamicamente il posizionamento delle attività per fattori di runtime come il carico e la limitazione termica.
  • I test delle prestazioni su dispositivi diversi possono produrre caratteristiche prestazionali molto diverse, soprattutto se i dispositivi variano notevolmente in base al prezzo consigliato o alla data di uscita.

    Un dispositivo più recente o più costoso potrebbe eseguire un determinato carico di lavoro comodamente su un piccolo core, ma un dispositivo meno recente o più economico potrebbe richiedere un core più grande per rispettare le scadenze relative allo stesso carico di lavoro.

  • Forzando le affinità in grandi core, potresti aumentare inutilmente il consumo della batteria e il carico termico.

Per questi motivi, in genere è meglio evitare di impostare manualmente le affinità della CPU.