Skip to content

Instantly share code, notes, and snippets.

@Mystler
Last active October 26, 2023 08:18
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Mystler/3b6ef587bc0440959e4fee6d9c69c062 to your computer and use it in GitHub Desktop.
Save Mystler/3b6ef587bc0440959e4fee6d9c69c062 to your computer and use it in GitHub Desktop.
Mystler's WoW Performance Guide

Hilfe, ich hab Daumenkino im Raid!

Woher FPS Probleme in WoW kommen und was man versuchen kann dagegen zu tun.

Was ist das Problem?

WoW hat sich über die Jahre stark entwickelt, sowohl die Anforderungen des Spiels selbst als auch die Komplexität an Interface-Personalisierung mit AddOns sind umfangreicher geworden. Bei den Spielwelten ging der Fortschritt bei den Assets (Modelle, Leveldesign, Animationen etc.) schneller mit der Zeit als die Optimierung der Engine. Das sieht man an starken Unterschieden in der Frame Rate zwischen alten Gebieten wie Mulgore im Vergleich zu neuen, umfangreichen Gebieten wie Suramar.

(Einfaches Beispiel: Sichtweite auf maximum und in Legion Dalaran beim Flugmeister nach Suramar gucken. Frame Rate im Auge behalten und dann wegdrehen. Je nach PC sieht man wie sich die Frame Rate möglicherweise verdoppelt.)

Aber mein Rechner ist doch voll gut! Nur 25% Auslastung!

Zuerst einmal ist WoW kein GPU-lastiges Spiel. Ein Fehler der häufig gemacht wird ist sofort die Grafikkarte aufzurüsten, dabei läuft WoW auch auf ziemlich alten Karten oder sogar Onboard-Grafik ordentlich. Der Flaschenhals ist ganz klar der Prozessor, weil WoW primär einen Prozessorkern beansprucht. 25% CPU Auslastung bei 4 Kernen bedeutet Quasi WoW läuft am Limit. Schnellere und neuere CPUs mit überzeugender Single-Thread Leitung sind hier beste die Stellschraube in Punkto Hardware.

Aber seit 8.1 ist doch alles Multithreaded!

Falsch, bzw. nicht richtig gelesen. Mit 8.1 kamen in der Tat Optimierungen. Diese betreffen aber nicht alles und sind bei weitem kein Allheilmittel. Worum es hier tatsächlich geht sind Renderer-Verbesserungen, die hauptsächlich den Prozess der Kommunikation mit der Grafikkarte verbessern und dabei auf Multithreading setzen. Aufgaben werden dabei auf mehrere Kerne/Threads der CPU verteilt. Diese Änderungen betreffen aussschließlich DirectX 12 (d.h. diese Schnittstelle muss in den WoW-Settings ausgewählt sein und die Grafikkarte muss es unterstützen).

Die 8.1 Änderungen haben Potential und dürften beispielsweise die Last von Spelleffekten und Partikeln verringern. Jedoch läuft sämtlicher Code der Spiellogik und das Interface weiterhin nur auf einem Thread.

Also ist die WoW-Engine voll kacke programmiert!

Jein. Die Entwicklung der WoW-Engine begann bereits 1999. Blizzards Erfolg basiert schon lange auf Casual-freundlichen Spielen die auch auf mittelmäßiger Hardware flüssig läuft. So auch WoW, das zu Release als Spiel mit unfassbar performanter Grafik galt.

Der Fortschritt mit der Zeit sorgte jedoch dafür, dass die Engine inzwischen ein paar Alterserscheinungen zeigt. Sie entstand nicht zuletzt auch in einer Zeit wo an Multikern-Prozessoren noch nicht wirklich zu denken war und jede Engine synchron (auf einem Thread) lief.

Multithreading ist noch eine relativ "neue" und nicht ganz triviale Wissenschaft die eigene Herausforderungen an Programmierer stellt. Dass WoW mit 8.1 überhaupt Schritte in die Richtung macht ist auf jeden Fall ein gutes Zeichen.

Das Problem ist jedoch nicht nur, vllt. sogar am wenigsten, ein Problem der Engine. Wie schon angedeutet ist ein Teil der Flaschenhalskette das Interface - insbesondere Addons.

LUA-Programmierung von WoW Addons ist ein absolutes Optimization-Minigame, wenn man es richtig machen will. Leider haben einige Addonentwickler eine "einfache" Einstellung: Wenns funzt und gut aussieht ist es ok. Das führt zwar zu Erfolg, macht aber Nutzern auf älterer Hardware oder in vollen Raids unter Umständen das Leben schwer.

Ein Fehler, der bei Addons auch häufig gemacht wird ist auf den Speicherverbrauch zu schauen. "AAh, Addon X verbraucht sehr viel RAM". Speicherverbrauch sollte zwar nicht größer sein als nötig jedoch ist die Einstellung "lieber mehr RAM nutzen als CPU belasten" eine sehr gute. Addonspeicher bremst keinen PC aus. Lediglich die "Garbage Colletion", ein automatischer Speicher-Aufräum-Prozess der LUA-Schnittstelle für Addons, verbraucht in unregelmäßigen Abständen ganz kurz etwas CPU-Leistung. Dinge im Speicher zu cachen statt jedes Mal neu abzufragen oder zu berechnen kann Wunder bewirken.

This is how we take action in Uganda!

Hör auf Geschichte zu faseln! Was kann ich denn nun machen, wenn ich will dass mein Spiel etwas besser läuft!?

Ich hab meine Settings doch schon runter gedreht!

Mit Settings kann man versuchen ein wenig nachzubessern, dabei kann ich aber nur ein paar Tipps geben, experimentieren ist empfohlen.

Viele Optionen im Menü beeinflussen hauptsächlich die Grafikkarte und sie zu verringern macht das Spiel nur unmerklich schneller, wenn die CPU der Flaschenhals ist.

Settings

  1. Die Environment/Umgebungs-Optionen sind die Einstellungen die tatsächlich hauptsächlich die CPU betreffen. Diese zu reduzieren dürfte ein wenig helfen und hat zudem nur einen geringen Einfluss auf die "Schönheit" der Welt.
  2. Projizierte Texturen sollten immer an sein, egal was, weil ohne diese Option sieht man Erfahrungsgemäß manche Bodeneffekte in Raids/Dungeons nicht. Das hilft bei "Ich seh die Mechanik gar nicht", wenn man auf niedrigsten Einstellungen spielt.
  3. Sunshafts im Raid-Profil auf aus zu setzen empfehle ich hier weil die Wohl der Hauptfaktor sind warum Rastakhan so stark laggt. Irgendwas muss mit den Sonnenstrahlen die durch das Fenster im Bossraum kommen falsch sein. Abschalten hilft.
  4. Partikeldichte zu reduzieren kann vorallem Melees helfen die bei drölf Spelleffekten von Frostmages und Warlocks nichts mehr sehen.
  5. Tiefeneffekte Siehe 4. Insbesondere bei Vectis waren Überlagerungen von Effekten krass. Z.B. hat die Orb von Frostmagiern bei höheren Settings eine starke Brechung gehabt die es schwer machte noch gefährliche Bodeneffekte zu sehen.

Ansonsten kenn ich leider kein Wundermittel was die Settings angeht. Haupt-Problem ab hier sind also AddOns.

Fuck, welches AddOn ist denn jetzt bitte schuld?

Gute Frage! Kommen wir zum Stichwort "Profiling", d.h. Messen wie viel Zeit der CPU bestimmte Code-Abschnitte benötigen. Es gibt diverse AddOns um AddOns zu profilen. Ich persönlich verwende dafür AddOns CPU Usage und will kurz erklären wie man damit umgeht.

Ist das Addon installiert lässt es sich u.a. via Minimap-Button öffnen. Das Fenster ist leer und eine Hilfe gibt es bei Mouseover über das Fragezeichen.

ACUHelp

WoW muss zunächst explizit in den Profiling-Modus gebracht werden. Bei Klick auf "Start Profiler" wird das Interface kurz neu geladen.

ACUWindow

Die Empfehlung ist das jetzt bei einem Raidboss laufen zu lassen. Dort gibt es ja vorraussichtlich auch die größten Probleme. Spielt man einen Encounter sollte jetzt nach Ende des Kampfes automatisch ein Auswertungsfenster auf gehen.

In meinem Beispiel hab ich es jedoch am Dummy angeschaltet. Das geht via /cpu realtime Befehl zu starten und zu stoppen.

Als Ergebnis kommt zunächst eine Liste an Addons und deren Verbrauch.

ACUExList

  1. Average: Die durchschnittliche Zeit die alle Addons zusammen benötigen.
  2. Cpu Score: Eine Kennzahl für die Performance der CPU. Je höher desto besser.
  3. Milliseconds: Die durschnittliche Zeit die ein Addon benötigt.
  4. Peak: Die maximale Zeit die ein Addon für einen Frame während der Messung benötigte.
  5. Show Graphic: Schaltet in ein Diagramm für die ausgewählten AddOns um.

Bei mir tauchen 2 Addons als stärkere Verbraucher auf, Aurora und WeakAuras. Bei Aurora trügt der Schein leicht, weil es nur einmal vor Beginn des Dummy-Kampfes meiner Messung einen hohen Peak hatte der den Schnitt etwas anhebt, selbiges bei AdiBags. (Sieht man im Graph, habe aber keinen Screenshot davon.) Bei WeakAuras ist der Graph konstanter und Peak liegt dichter am Durchschnitt, d.h. WeakAuras verbrauchen durchgehend etwas mehr.

ACUExGraph

Hier als weiteres Beispiel die Liste von Cusacki:

ACUExCusacki

Bei ihm fallen auch WeakAuras auf (mit deutlich höherem Schnitt als bei mir obwohl er viel weniger WeakAuras hat). Dazu noch krasser ElvUI (was bekannt ist nicht sonderlich optimal programmiert worden zu sein, sorry an alle ElvUI Nutzer). Diese beiden Addons alleine verbrauchen bei ihm 80% der gesamten Addon-Leistung.

Hat man solche Ergbenisse, kann man nun also überlegen wie man damit umgeht. Lohnt es sich z.B. von Addons wie ElvUI, Plater, TidyPlates, Bartender, u.a. auf bessere Lightweight-Alternativen umzusteigen? Ist es einem das Wert?

WeakAuras sind natürlich ein Spezialfall. Das Addon einfach zu löschen macht einen definitiv nicht glücklich und das Prinzip von WAs sind ja einzelne Auren bzw. Gruppen. Leider hat WeakAuras ein paar grundlegende "Problemchen" die hoffentlich auch noch verbessert werden. Vielmehr gibt es jedoch "schlechte" Auren mit Custom Code, die einfach ohne Rücksicht auf Performance entwickelt wurden.

Also alle WeakAuras löschen?

Good news! Auch WeakAuren lassen sich profilen und man kann schauen ob es hier auffällige Offender gibt, die einem die Frame Rate angreifen.

Dazu einfach vor Kampfbeginn (am besten auch im Raid und für ein paar Minuten, aber technisch egal wo) den WA-Profiler mit /wa pstart starten. Nach Messung dann mit /wa pstop anhalten.

Jetzt kann man ein Ergebnisfenster mit /wa pprint öffnen (und mit Esc wieder schließen). Das zeigt zunächst Messungsdaten wie gemessener Zeitabschnitt und wie viel davon für WeakAuras drauf ging, danach den Verbrauch von bestimmten WA Mechanismen.

WAProf1

Scrollt man etwas weiter runter kommt eine Liste der tatsächlichen Auren.

WAProf2

Pro WA sieht man hier die verbrauchte Zeit der Aura (von der Gesamtzeit, d.h. mehr je länger die Messung geht) und der Anteil in Prozent.

Meine Werte sind verhältnismäßig ausgeglichen mit einem leichten Ausreißer nach oben, eine WA die ich schon stark optimiert habe. Die "STT Animate" dinger sind für das was sie bei mir tun auch grenzwertig und ich sollte da wahrscheinlich mal dran tweaken oder deren Gruppe ersetzen.

Im Vergleich dazu bei ähnlicher Messlänge am Dummy ein Auszug von Cusacki:

Auras:
Total time attributed to auras:
GotO_Value 2 934.30ms, 24.09%
Absorb 836.72ms, 21.57%
RJW Bar 382.49ms, 9.86%
Stagger 2 294.17ms, 7.58%
Hp percent 2 262.77ms, 6.77%
Dodge Chance 2 235.27ms, 6.07%
Brew Charges 210.64ms, 5.43%
Energy Bar 2 192.69ms, 4.97%
Ironskin Brew 3 114.46ms, 2.95%
RJW Buff Tracker 2 85.20ms, 2.20%
[...]

Hier sind 2 seiner Auren alleine deutlich vorweg und bei über 40% aller WAs. Ich hab sie mir angesehen und beide sind Custom-Code auren die jeden Frame (also bei 30fps 30 mal pro Sekunde) die gleichen aufwändigen Abfragen und Berechnungen machen. Sowas ist häufig unnötiges gebremse. Hier lohnt es sich wohl nach alternativen zu schauen.

Generell können Custom-Code WAs mit "Every Frame" setting, wenn nicht gut durchdacht, problematisch sein. Solch Profiling kann helfen sie zu bewerten und auszusortieren.

Es gibt auch WA-Basismechaniken die nicht optimal sind. Energie-Text Auren sind auffällig belastend, leider auch in der Regel nichts worauf man verzichen möchte. Ein Problem das man jedoch angehen kann ist Bar Smoothing. Bei Progress Bars oder Progress Textures gibt es bei Display das Setting "Smooth Progress" das bei Änderungen die Bar flüssiger animiert. Diese Option abzuschalten macht die Annzeige je nach ansicht vllt ein bisschen weniger "hübsch", hilft aber auch.

Fazit

Ich hoffe ich konnte ein paar Fragen klären und Missverständnisse beseitigen. Vielleicht helfen meine Beispiele beim Erkennen von Schwachstellen im Interface, sodass man abschätzen und versuchen kann sie zu beseitigen. Es muss wie gesagt kein Allheilmittel sein, aber je nach System lassen sich vielleicht doch ein paar FPS für 30-Mann Raids herauskitzeln.

Bonus: "Approved Addon List"

TC-Kollege Koji hat in nem Privatchat eine Liste mit getesteten und für gut befundenen Addons gepinnt, die ich durchaus anhängen kann.

ApprovedAddons

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment