Analyser la planification des threads

Vous devez prendre en compte plusieurs éléments pour déterminer si vos threads de processus de jeu sont correctement utilisés et planifiés pour obtenir les meilleures performances.

  • Frame Pacing
  • Multithreading et parallélisation de threads
  • Affinité de cœur CPU

Multithreading

De nombreux jeux et moteurs de jeux utilisent le multithreading pour diviser le travail du processeur en tâches logiques, qui peuvent s'exécuter de façon quelque peu indépendante. Une configuration typique est un thread de jeu pour la logique d'entrée et de jeu, un thread de rendu pour préparer et envoyer des objets à dessiner, et des threads de calcul pour d'autres sous-tâches telles que les animations ou l'audio.

Nous vous recommandons d'exécuter des threads en parallèle pour profiter des gains de performances liés au multithreading. Par exemple, les threads de jeu et de rendu s'exécutent partiellement ou entièrement simultanément sur différents cœurs. Cela n'est pas toujours possible, par exemple dans les cas de dépendances de données partagées. Toutefois, lorsque cela est possible, cela peut réduire les temps CPU et, par conséquent, les fréquences d'images potentiellement plus élevées.

Jeu avec un thread principal et de rendu bien parallélisé, ainsi qu'un thread de travail et un thread audio
Figure 1 Jeu avec un thread principal et de rendu bien parallélisé, ainsi qu'un thread de travail et un thread audio

Affinité de cœur CPU

L'un des facteurs qui affecte de manière significative les performances de vos charges de travail de processeur est la manière dont elles sont programmées sur les cœurs. Ce processus peut être divisé en deux:

  • si vos threads de jeu s'exécutent sur le cœur le plus adapté à leur charge de travail.
  • Indique si les threads de votre jeu passent fréquemment d'un cœur à l'autre.

Les appareils modernes utilisent souvent une architecture appelée calcul hétérogène, où les cœurs présentent différents niveaux de performances:

  • Un ou plusieurs cœurs offrent des performances maximales, mais consomment plus d'énergie. On les appelle parfois les "grands cœurs".
  • D'autres cœurs présentent des performances maximales inférieures, mais sont plus économes en énergie. On les appelle parfois les cœurs "petits".
  • En option, un ou plusieurs cœurs permettent d'équilibrer les performances et la puissance. Ils sont parfois appelés cœurs "intermédiaires".

Vous pouvez examiner le comportement du thread du processeur sous Utilisation du processeur en activant le processeur dans la configuration du profil lors de la création d'une trace. En faisant un zoom avant sur une section de votre trace inférieure à 200 ms, vous pouvez afficher les processus individuels en cours d'exécution sur les cœurs de processeur de votre appareil. En règle générale, les cœurs plus petits correspondent à des index plus petits (par exemple, les processeurs de "0" à "3"), tandis que les cœurs plus importants correspondent à des index plus élevés (par exemple, les processeurs "6" à "7") et les cœurs intermédiaires, s'ils sont présents, occupent des index intermédiaires (par exemple, les processeurs "5" à "6"). Il s'agit d'une convention courante, mais ce n'est pas une garantie.

Si vous constatez que certains threads sont planifiés sur des processeurs qui ne répondent pas à leurs besoins en termes de performances ou de puissance, envisagez de définir manuellement l'affinité de processeur pour ces threads.

Jeu avec le thread principal et le thread de rendu s'exécutant principalement sur les grands cœurs (CPU 6-7), affichés en bleu clair
Figure 2 Jeu avec le thread principal et le thread de rendu s'exécutant principalement sur les grands cœurs (CPU 6-7), affichés en bleu clair

Vous pouvez également observer si vos threads changent de cœurs. Ces commutateurs principaux entraînent une surcharge du changement de contexte et la perte d'état avec le cache/les registres d'un cœur.

Jeu avec le thread principal (Thread-7) et le thread de rendu (Thread-8) qui basculent entre les cœurs, présentés en violet
Figure 3. Jeu avec le thread principal (Thread-7) et le thread de rendu (Thread-8) qui basculent entre les cœurs, présentés en violet

Définir l'affinité de processeur pour un thread indique au système de le planifier sur le cœur donné lorsque votre jeu est au premier plan. Pour ce faire, vous devez prendre en compte plusieurs facteurs:

  • Le logiciel de la plate-forme ne peut pas ajuster l'emplacement des tâches de manière dynamique en fonction de facteurs d'exécution tels que la charge et la limitation thermique.
  • Les tests de performances sur différents appareils peuvent générer des caractéristiques de performances très différentes, en particulier si les appareils varient considérablement en fonction de leur prix ou de leur date de sortie.

    Un appareil plus récent ou plus cher peut exécuter facilement une charge de travail donnée sur un petit cœur, tandis qu'un appareil plus ancien ou plus abordable peut nécessiter un cœur plus important pour respecter les délais pour cette même charge de travail.

  • En forçant les affinités avec des cœurs de grande taille, vous risquez d'augmenter inutilement la décharge de la batterie et la charge thermique.

C'est pourquoi il est généralement préférable d'éviter de définir manuellement les affinités de processeur.