Thread-Planung analysieren

Es gibt einige Dinge, die Sie berücksichtigen müssen, um festzustellen, ob die Threads Ihres Spielprozesses angemessen genutzt und für die beste Leistung geplant werden.

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

Multithreading

Viele Spiele und Spiele-Engines verwenden Multithreading, um die CPU-Arbeit in logische Aufgaben aufzuteilen, die relativ unabhängig voneinander ausgeführt werden können. Eine typische Konfiguration besteht aus einem Game-Thread für Eingabe und Spiellogik, einem Render-Thread zum Vorbereiten und Übergeben von zu zeichnenden Objekten sowie Worker-Threads für andere untergeordnete Aufgaben wie Animationen oder Audio.

Wir empfehlen, Threads zu parallelisieren, um die Leistungssteigerungen durch Multithreading zu nutzen. Ein Beispiel hierfür ist ein Szenario, in dem die Spiel- und Render-Threads teilweise oder vollständig gleichzeitig auf verschiedenen Kernen ausgeführt werden. Das ist nicht immer möglich, z. B. bei gemeinsamen Datenabhängigkeiten. Wenn es jedoch möglich ist, kann dies zu geringeren CPU-Zeiten und damit potenziell zu höheren Frameraten führen.

Spiel mit einem gut parallelisierten Haupt- und Render-Thread sowie einem Worker-Thread und einem Audio-Thread
Abbildung 1. Spiel mit einem gut parallelisierten Haupt- und Render-Thread sowie einem Worker- und Audio-Thread

CPU-Kernaffinität

Ein Faktor, der die Leistung Ihrer CPU-Arbeitslasten erheblich beeinflusst, ist die Art und Weise, wie sie auf den Kernen geplant werden. Dies kann in zwei Komponenten unterteilt werden:

  • Ob Ihre Spiel-Threads auf dem für ihre Arbeitslast am besten geeigneten Kern ausgeführt werden.
  • Ob die Threads Ihres Spiels häufig zwischen den Kernen wechseln.

Moderne Geräte verwenden häufig eine Architektur, die als heterogenes Computing bezeichnet wird. Dabei haben die Kerne unterschiedliche Leistungsstufen:

  • Ein oder wenige Kerne bieten eine hohe Spitzenleistung, verbrauchen aber mehr Strom. Diese werden manchmal auch als „große“ Kerne bezeichnet.
  • Andere Kerne haben eine geringere Spitzenleistung, sind aber energieeffizienter. Diese werden manchmal auch als „kleine“ Kerne bezeichnet.
  • Optional: Ein oder mehrere Kerne bieten ein ausgewogenes Verhältnis zwischen Leistung und Energieverbrauch. Diese werden manchmal auch als „Mid“-Cores bezeichnet.

Sie können das Verhalten von CPU-Threads unter CPU-Auslastung untersuchen, indem Sie CPU in der Profilkonfiguration aktivieren, wenn Sie einen Trace erstellen. Wenn Sie in einen Abschnitt Ihres Traces mit einer Dauer von unter 200 ms hineinzoomen, können Sie die einzelnen Prozesse sehen, die auf den CPU-Kernen Ihres Geräts ausgeführt werden. In der Regel entsprechen kleinere Kerne kleineren Indexen (z. B. CPUs 0–3), während größere Kerne höheren Indexen entsprechen (z. B. CPUs 6–7). Mittlere Kerne, sofern vorhanden, belegen Indexe dazwischen (z. B. CPUs 5–6). Das ist zwar die gängige Konvention, aber es gibt keine Garantie dafür.

Wenn Sie feststellen, dass bestimmte Threads auf CPUs geplant werden, die nicht ihren Anforderungen an Leistung oder Stromverbrauch entsprechen, sollten Sie die CPU-Affinität für diese Threads manuell festlegen.

Spiel, bei dem der Haupt- und der Render-Thread hauptsächlich auf den großen Kernen (CPU 6–7) ausgeführt werden, dargestellt in Hellblau
Abbildung 2. Spiel, bei dem der Haupt- und der Rendering-Thread hauptsächlich auf den großen Kernen (CPU 6–7) ausgeführt werden, dargestellt in Hellblau

Sie können auch beobachten, ob Ihre Threads zwischen den Kernen wechseln. Solche Kernwechsel verursachen einen gewissen Overhead durch den Kontextwechsel und den Verlust des Status mit dem Cache/den Registern eines Kerns.

Spiel mit Haupt- (Thread 7) und Render-Thread (Thread 8), die zwischen Kernen wechseln (lila dargestellt)
Abbildung 3. Spiel mit Haupt- (Thread 7) und Render-Thread (Thread 8), die zwischen Kernen wechseln (lila dargestellt)

Wenn Sie die CPU-Affinität für einen Thread festlegen, wird das System angewiesen, ihn auf dem angegebenen Kern zu planen, wenn Ihr Spiel im Vordergrund ist. Dabei sind mehrere Faktoren zu berücksichtigen:

  • Die Plattformsoftware kann die Platzierung von Aufgaben nicht dynamisch an Laufzeitfaktoren wie Last und thermisches Drosseln anpassen.
  • Leistungstests auf verschiedenen Geräten können sehr unterschiedliche Leistungsmerkmale ergeben, insbesondere wenn sich die Geräte in Bezug auf Preis oder Erscheinungsdatum erheblich unterscheiden.

    Ein neueres oder teureres Gerät kann eine bestimmte Arbeitslast problemlos auf einem kleinen Kern ausführen, während ein älteres oder günstigeres Gerät möglicherweise einen größeren Kern benötigt, um die Fristen für dieselbe Arbeitslast einzuhalten.

  • Wenn Sie Affinitäten zu großen Kernen erzwingen, kann dies den Akku unnötig entladen und die thermische Belastung erhöhen.

Aus diesen Gründen ist es im Allgemeinen am besten, die CPU-Affinität nicht manuell festzulegen.