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](https://developer.android.google.cn/static/images/agi/threads-scheduling-images/sample_multithreading.png?authuser=6&hl=de)
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 dem für die jeweilige Arbeitslast am besten geeigneten Kern ausgeführt werden
- Ob Ihre Spiel-Threads häufig zwischen den Kernen wechseln
Moderne Geräte verwenden oft eine Architektur, die als heterogenes Computing bezeichnet wird, bei der die Kerne unterschiedliche Leistungsstufen haben:
- Mindestens ein Kern bietet die beste Spitzenleistung, verbraucht jedoch mehr Strom. Diese werden manchmal als „große“ Kerne bezeichnet.
- Andere Kerne haben eine niedrigere Spitzenleistung, sind aber energieeffizienter. Diese werden manchmal als „kleine Kerne“ bezeichnet.
- Optional: Ein oder mehrere Kerne sorgen für ein ausgewogenes Verhältnis zwischen Leistung und Leistung. Diese werden manchmal als „Mid-Kerne“ bezeichnet.
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 kleinere Kerne kleineren Indexen (z. B. CPUs von 0 bis 3), während größere Kerne höheren Indexen (z. B. CPUs 6 bis 7) entsprechen und ggf. mittlere Kerne dazwischen liegende Indexe belegen (z. B. CPUs 5 bis 6). Dies ist üblich, aber es ist keine Garantie.
Wenn Sie feststellen, dass bestimmte Threads auf CPUs geplant werden, die ihren Leistungs- oder Energieanforderungen nicht entsprechen, sollten Sie die CPU-Affinität für diese Threads manuell festlegen.
![Spiel, bei dem der Haupt- und Renderingthread hauptsächlich auf den großen Kernen (CPU 6–7) ausgeführt wird, dargestellt in hellblau](https://developer.android.google.cn/static/images/agi/threads-scheduling-images/sample_bigcores.png?authuser=6&hl=de)
Sie können auch beobachten, ob Ihre Threads zwischen den Kernen wechseln. Solche Core Switches verursachen einen gewissen Overhead durch den Kontextwechsel und den Zustandsverlust des Cache/Registers eines Kerns.
![Spiel mit Haupt- (Thread-7) und Rendering-Thread (Thread-8), die zwischen Kernen wechseln (in Lila dargestellt)](https://developer.android.google.cn/static/images/agi/threads-scheduling-images/sample_coreswitching.png?authuser=6&hl=de)
Durch Festlegen der CPU-Affinität für einen Thread wird das System angewiesen, diesen auf dem angegebenen Kern zu planen, wenn Ihr Spiel im Vordergrund ausgeführt wird. Dabei sind mehrere Faktoren zu berücksichtigen:
- Die Plattformsoftware kann die Aufgabenplatzierung nicht für Laufzeitfaktoren wie Last und thermische Drosselung dynamisch anpassen.
Leistungstests auf verschiedenen Geräten können sehr unterschiedliche Leistungsmerkmale liefern, insbesondere wenn die Geräte je nach Preispunkt oder Erscheinungsdatum erheblich variieren.
Ein neueres oder teureres Gerät kann eine bestimmte Arbeitslast bequem auf einem kleinen Kern ausführen, aber ein älteres oder günstigeres Gerät benötigt möglicherweise einen größeren Kern, um Fristen für dieselbe Arbeitslast einzuhalten.
Wenn Sie Affinitäten zu großen Kernen erzwingen, können Sie die Akkuentladung und die Wärmebelastung unnötig erhöhen.
Aus diesen Gründen empfiehlt es sich, CPU-Affinitäten nicht manuell festzulegen.