Analizza la pianificazione dei thread

Per determinare se i thread del processo di gioco vengono utilizzati e pianificati in modo appropriato per ottenere le migliori prestazioni, devi tenere presenti alcuni aspetti.

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

Multi-threading

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

Ti consigliamo di parallelizzare i thread per sfruttare i miglioramenti delle prestazioni del multithreading. Un esempio è uno scenario in cui i thread di gioco e rendering vengono eseguiti parzialmente o completamente in parallelo su core diversi. Ciò non sarà sempre possibile, ad esempio nei casi con dipendenze di dati condivisi; tuttavia, quando possibile, ciò potrebbe comportare tempi di CPU inferiori e quindi potenzialmente frame rate più elevati.

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

Affinità del core della CPU

Un fattore che influisce in modo significativo sulle prestazioni dei carichi di lavoro della CPU è la loro pianificazione sui core. Questo può essere suddiviso in due componenti:

  • Se i thread di gioco vengono eseguiti sul core più adatto al loro carico di lavoro.
  • Se i thread di gioco cambiano spesso core.

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

  • Uno o pochi core offrono prestazioni di picco elevate, ma consumano più energia. A volte vengono chiamati core "grandi".
  • Gli altri core hanno prestazioni di picco inferiori, ma sono più efficienti dal punto di vista energetico. A volte vengono chiamati core "piccoli".
  • (Facoltativo) Uno o più core offrono un equilibrio tra prestazioni e potenza. A volte vengono chiamati core "medi".

Puoi esaminare il comportamento dei thread della CPU in Utilizzo CPU attivando CPU nella configurazione del profilo durante l'acquisizione di una traccia. Se ingrandisci una sezione della traccia <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ù alti (ad esempio, CPU "6"-"7") e i core intermedi, se presenti, occupano indici intermedi (ad esempio, CPU "5"-"6"). Si tratta di una convenzione comune, ma non di una garanzia.

Se noti che alcuni 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 sui core grandi (CPU 6-7), mostrato 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

Potresti anche notare se i tuoi thread passano da un core all'altro. Questi cambi di core comportano un sovraccarico dovuto al cambio di contesto e alla perdita di stato con la cache/i registri di un core.

Gioco con thread principale (Thread-7) e thread di rendering (Thread-8) che passano da un core all&#39;altro, mostrato in viola
Figura 3. Gioco con thread principale (Thread-7) e thread di rendering (Thread-8) che passano da un core all'altro, mostrato in viola

L'impostazione dell'affinità della CPU per un thread indica al sistema di pianificarlo sul core specificato quando il gioco è in primo piano. Quando lo fai, devi considerare diversi fattori:

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

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

  • Se forzi le affinità con i core grandi, 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.