Thread-Planung analysieren

Es gibt einige Dinge, die Sie beachten sollten, um festzustellen, ob Ihre Spielprozess-Threads angemessen genutzt und geplant werden, um die beste Leistung zu erzielen.

  • Frame-Taktung
  • Multithreading und Thread-Parallelisierung
  • CPU-Kernaffinität

Multithreading

Viele Spiele und Spiel-Engines verwenden Multithreading, um die CPU-Arbeit in logische Aufgaben zu unterteilen, die möglicherweise unabhängig voneinander ausgeführt werden. Eine typische Konfiguration ist ein Spiele-Thread für Eingabe- und Spielelogik, ein Rendering-Thread zum Vorbereiten und Einreichen von zu zeichnenden Objekten sowie Worker-Threads für andere Unteraufgaben wie Animationen oder Audio.

Wir empfehlen, Threads zu parallelisieren, um von den Leistungssteigerungen des Multithreading zu profitieren. Ein Beispiel hierfür ist ein Szenario, in dem Spiel und Renderingthreads teilweise oder vollständig gleichzeitig auf verschiedenen Kernen ausgeführt werden. Dies ist nicht immer möglich, z. B. bei gemeinsamen Datenabhängigkeiten. Wenn möglich, kann dies jedoch zu niedrigeren CPU-Zeiten und damit potenziell höheren Framerates führen.

Spiel mit einem gut parallelisierten Haupt- und Renderingthread sowie einem Worker-Thread und Audiothread
Abbildung 1. Spielen mit einem gut parallelisierten Haupt- und Renderingthread sowie einem Worker-Thread und Audiothread

CPU-Kernaffinität

Einer der Faktoren, die sich erheblich auf die Leistung Ihrer CPU-Arbeitslasten auswirken, ist die Planung auf den Kernen. Dies kann in zwei Komponenten aufgeteilt werden:

  • Ob Ihre Spiel-Threads auf den besten Kernen für die Leistung ausgeführt werden
  • Ob Ihre Spiel-Threads häufig zwischen den Kernen wechseln

Sie können das Verhalten von CPU-Threads unter CPU-Nutzung untersuchen. Aktivieren Sie dazu beim Erstellen eines Trace in der Profilkonfiguration CPU. Wenn Sie einen Abschnitt des Trace auf weniger als 200 ms vergrößern, können Sie die einzelnen Prozesse sehen, die auf den CPU-Kernen Ihres Geräts ausgeführt werden. In der Regel entsprechen kleine Kerne kleineren Indexen (z. B. CPU 03), während große Kerne höheren Indizes entsprechen (z. B. CPU 67).

Wenn das Spiel im Vordergrund ausgeführt wird, sollten persistente Threads wie der Spielethread und der Rendering-Thread im Allgemeinen auf den leistungsstarken großen Kernen ausgeführt werden, während andere Prozess- und Worker-Threads möglicherweise auf kleineren Kernen geplant werden.

Spiel, bei dem der Haupt- und Renderingthread hauptsächlich auf den großen Kernen (CPU 6–7) ausgeführt wird, dargestellt in hellblau
Abbildung 2. Spiel, bei dem der Haupt- und Renderingthread hauptsächlich auf den großen Kernen (CPU 6–7) ausgeführt wird, dargestellt in hellblau

Sie können auch beobachten, ob Ihre Spiel-Threads häufig zwischen den Kernen wechseln, wenn Ihr Haupt- und Rendering-Thread die Kerne innerhalb eines einzelnen CPU-Frames oder zwischen zwei aufeinanderfolgenden CPU-Frames ändert. Dieses CPU-Verhalten ist wahrscheinlich ein Hinweis darauf, dass die Spiele-Threads nicht richtig verbunden sind. Solche Core Switches verursachen einen gewissen Overhead durch den Kontextwechsel und den Zustandsverlust im Cache/Register eines Kerns, was zu einer längeren Länge Ihres CPU-Frames führt.

Spiel mit Haupt- (Thread-7) und Rendering-Thread (Thread-8), die zwischen Kernen wechseln (in Lila dargestellt)
Abbildung 3. Spiel mit Haupt- (Thread-7) und Rendering-Thread (Thread-8), die zwischen Kernen wechseln, dargestellt in Lila