Blogposts

Blogpost: Die DirectX11-Unterstützung für Guild Wars 2 kommt

Nächste Woche startet nicht nur die Beta der nächsten drei Elite-Spezialisierungen. Auch die DirectX11-Unterstützung kommt als Beta in den Client. Was er bewirkt und wie ihr die Beta aktiviert zeigen wir euch.

Die Stadt mit der Wasserreflektion in Löwenstein sind die Rechenintensivsten Szenen in Guild Wars 2.

Die DirectX11-Unterstützung für Guild Wars 2 kommt

Die nächste Woche wird ein Meilenstein in der Guild Wars 2 Geschichte. Seit neun Jahren erfreuen wir uns an der wundervollen Welt von Tyria. Bisher verwendete die Engine von Guild Wars 2 DirectX9 und wird nun aktualisiert, so dass sie DirectX11 unterstützt.

In der Vergangenheit gab es immer wieder kleine grafische Verbesserungen wie etwa zum Release von Heart of Thorns. Um die Performance des Spiels zu verbessern, wurde Ende 2015 der 64-Bit Client eingeführt. Dennoch gab es immer wieder technische Probleme, besonders an Orten, wo sich sehr viele Spieler befinden.

Immer wieder gab es Kritik aus der Community, dass die modernen Prozessoren und Grafikkarten nicht wirklich vollkommen vom Spiel genutzt werden. Aufgrund dessen gab es sogar Mitglieder aus der Community, die sich um die Entwicklung eines Addons bemühten, um DirectX11 Unterstützung für Guild Wars 2 zu realisieren.

Warum DirectX11 und nicht die neue DirectX12 Variante?

In einem neuen Blogpost beantwortet James Fulop, Senior Engine Programmer, einige wichtige Fragen zum DirectX11 Update und erklärt den Vorteil des Updates in ausführlichen Schritten.

Bei der Entscheidung auf welche DirectX-Version man aktualisieren sollte, wenn man es schon macht, scheint für viele leicht zu beantworten. Auf die neuste selbstverständlich. ArenaNet stellte sich ebenfalls diese Frage und kam aus mehreren Gründen zum Entschluss sich für DirectX11 zu entscheiden.

Der erste Grund ist, dass DirectX11 mit seinem Alter von über zehn Jahren (veröffentlicht am 22. Oktober 2009) bereits alle Fehler beseitigt hat, die diese Programmierschnittstelle aufgewiesen hat.

Der zweite Grund ist, dass DirectX11 deutlich mehr Betriebssysteme unterstützt, als es dies DirectX12 tut. Die DirectX11 Variante unterstützt alle Windows-Betriebssysteme seit Windows Vista und neuer. Die DirectX12 Variante hingegen unterstützt lediglich das neue Windows 10.

Eine Alternative wäre hier lediglich ein kompletter Umstieg auf eine komplett neue Schnittstelle wie Vulkan gewesen, die Windows 8 und aktuellere Windows-Version unterstützt. ArenaNet wollte hier möglichst wenig Spieler dazu bewegen sich einen neuen Rechner oder ein neues Betriebssystem kaufen zu müssen, um Guild Wars 2 weiterspielen zu können.

Der dritte und entscheidende Punkt für ArenaNet war allerdings die gute Integrierung von BGFX in der DirectX11-Schnittstelle. Dabei handelt es sich um ein Open-Source-Projekt, an dem ArenaNet sich beteiligen möchte. Die Bibliothek ermöglicht es ArenaNet auf bereits fertige Lösungen zurückzugreifen, ohne alle Probleme selbst lösen zu müssen.

Das spart an Zeit bei der Implementierung, bietet aber auch für die Zukunft deutlich mehr Möglichkeiten der Weiterentwicklung, die sie in Guild Wars 2 einfließen lassen wollen. So können sie über das Projekt auch leicht externe Entwicklungen adaptieren, da dieses Projekt ständig verbessert und erweitert wird

Wie nehme ich an der Beta teil?

Die Beta startet zeitglich mit dem Elite-Spezialisierungs-Beta-Event am 21. September 2021. Ihr könnt euch im Spiel, im Menü „Grafikoptionen“ für die Beta anmelden. Damit die Änderungen aber wirksam wird, müsst ihr das Spiel dann aber noch einmal neu starten.

Was ist nun genau der Vorteil von DirectX11?

Wenn ihr das Spiel mit DirectX11 starten werdet, wird euch optisch erst einmal kein Unterschied auffallen. Der Vorteil der neuen Schnittstelle liegt in der Leistung, die euer Rechner im Hintergrund mit Rechenprozessen verbringt.

Ein Computerspiel funktioniert optisch wie ein Film, euer Monitor gibt einzelne Bilder aus und dadurch das viele Bilder schnell hintereinander abgespielt werden, sieht es für unser Auge wie eine flüssige Bewegung aus. Der Unterschied zu Filmen ist allerdings, dass die Bilder nicht fest vorgegeben sind, sondern dass jedes Bild neu erstellt (gerendert) werden muss abhängig von euren Eingaben durch Maus und Tastatur. Damit euer Rechner diese Bilder schnell berechnen kann, zerlegt er das Bild in viele kleine Teile, welche einzeln berechnet werden müssen und dann wieder zusammengefügt werden.

Und hierbei kommt der Vorteil von DirectX11. Bei der DirectX9-Version wird viel Arbeit vom Hauptprozess erledigt. Dieser läuft auf einem Kern und koordiniert alle Arbeiten und fügt sie zum Schluss zu einem Bild zusammen. Bei der DirectX11-Variante werden die Arbeitsschritte viel besser auf die einzelnen Prozessoren verteilt, wodurch weniger Leerlaufzeiten auf den anderen Kernen entstehen.

Bei den mitgelieferten Bildern aus dem Blogpost kann man sehr gut den Unterschied erkennen. Jeder dunkle Bereich symbolisiert einen dieser Leerläufe. Die Threads sind Prozesse, die auf anderen Kernen laufen. Wie man in der Grafik erkennen kann, wird der Hauptthread entlastet während die anderen Threads mehr Arbeit zu verrichten haben.

Blogpost

Die DirectX11-Unterstützung für Guild Wars 2 kommt

von James Fulop am 16. September 2021

Hier ist James Fulop, Senior Engine Programmer im Guild Wars 2 Team. Bei der DirectX11-Unterstützung handelt es sich um ein Projekt, an dem schon lange gearbeitet wird. In diesem Beitrag gehe ich auf einige der wichtigsten technischen Entscheidungen ein, die getroffen wurden, um die Form dieses Projekts zu bestimmen. Außerdem gebe ich euch einen Überblick über unsere Grafik-Runtime und die Auswirkungen des DirectX11-Renderers auf die Leistung.

Die Beta startet am 21. September 2021. Ihr könnt euch Spiel im Menü „Grafikoptionen“ für die Beta anmelden. Die Änderung wird nach dem Neustart des Spiels wirksam.

Warum haben wir uns überhaupt für ein Upgrade auf DirectX11 entschieden? Die Client-Leistung hat für uns Priorität, und wir möchten, dass jeder mit der höchstmöglichen Bildwiederholrate spielen kann. Wir haben festgestellt, dass das Spiel manchmal ins Stocken gerät, während das Rendering abgeschlossen wird. Guild Wars 2 gibt es nun schon seit neun Jahren und die Implementierung einiger DirectX11-abhängiger Features kann dazu beitragen, dass das Spiel auch in Zukunft schön aussieht.

DirectX11 bietet außerdem einige moderne technologische Möglichkeiten, die in DirectX9 nicht verfügbar sind. Das Upgrade auf DirectX11 ist der erste Schritt, um mehr tolle Dinge verwirklichen zu können.
Nach sorgfältiger Recherche haben wir uns entschieden, die Open-Source-Rendering-Bibliothek BGFX in Guild Wars 2 zu integrieren. BGFX ist gut programmiert, unterstützt verschiedene Grafik-Backends und wird bereits in zahlreichen Spielen in der Branche eingesetzt. Auf der offiziellen Webseite von BGFX erhaltet ihr weitere Informationen.

Da sich die Grafik-Ökosysteme in der Computerindustrie ständig weiterentwickeln, können wir mit BGFX als Gemeinschaft von Rendering-Technikern zusammenarbeiten, anstatt dass in jedem Studio das Rad neu erfunden werden muss. ArenaNet hat und wird weiterhin zur Entwicklung von BGFX beitragen.

Wir haben uns für DirectX11 anstelle von DirectX12 oder Vulkan entschieden, da wir festgestellt haben, dass die Umstellung auf die DirectX11-Implementierung von BGFX eine so große Leistungsverbesserung brachte, dass das Grafik-Backend nicht länger ein einschränkender Faktor für die Client-Leistung war. DirectX11 ist sehr stabil und wird bereits seit fast einem Jahrzehnt von Tausenden von Spielen verwendet. Mit DirectX11 können wir Systeme bis zurück zu Windows Vista unterstützen. Vulkan unterstützt hingegen erst Systeme ab Windows 8 und DirectX12 erst Systeme ab Windows 10. In puncto Grafik eröffnet uns der Sprung von DirectX9 zu DirectX11 in den kommenden Jahren viele Möglichkeiten zur Erweiterung der Engine um interessante Funktionen. Die Unterstützung von mehr als einem dieser Backends würde eine riesige Menge Arbeit für die Qualitätssicherung bedeuten und nur wenige handfeste Vorteile bieten.

Am aktuellen DirectX9-Renderer wurden keine nennenswerten Änderungen vorgenommen. Eine der Philosophien, die ich bei der Entwicklung verfolgte, war, dass der DirectX11-Renderer genauso aussehen sollte wie DirectX9. Wenn ich an beiden gleichzeitig Änderungen vornehmen würde, gäbe es keine Grundlage dafür, wie die Dinge aussehen sollen. Irgendwann wird der DirectX9-Renderer veraltet sein und entfernt werden, sobald der neue Renderer stabil läuft.

Über Frames

Jetzt möchte ich erläutern, wie der DirectX11-Renderer die Leistung des Spiels beeinflusst. Zunächst einmal funktionieren Videospiele genau wie ein Film: Man sieht Standbilder, die schnell gewechselt werden. Diese einzelnen Standbilder nennen wir Frames. Von diesem Prozess stammt der Begriff „Bilder pro Sekunde“ (auf Englisch: Frames per Second, kurz: FPS). Je höher die FPS, also die Bildwiederholrate, desto flüssiger sieht das Geschehen aus, bis die physikalische Grenze eures Anzeigegeräts erreicht ist. Dieser Vorgang, bei dem man ständig auf Eingaben (Tastatur und Maus) reagiert und Bilder produziert, ist die Spielschleife.

Die Stadt mit der Wasserreflektion in Löwenstein sind die Rechenintensivsten Szenen in Guild Wars 2.

Es folgen einige Zeitleisten-Visualisierungen der Spielschleife. Die Daten von der oben genannten Stelle in Löwenstein wurden unter Verwendung der Grafikeinstellung „Beste Qualität“ gewonnen.

Ich habe diese Stelle gewählt, weil es hier viel zu rendern gibt. Da ist die ganze Stadt, und die Technik, die wir für die Echtzeit-Reflexionen verwenden, ist im Grunde ein zweites Rendering der Welt, nur gespiegelt.

Für diesen Test verwende ich eine Intel I7-6700 CPU und eine Nvidia 1080 GPU.

DirectX9 Prozessverteilungen sind auf den Hauptkern ausgerichtet.

Oben seht ihr einen Screenshot eines von uns verwendeten Visualisierungstools namens Telemetry, das von RAD Game Tools entwickelt wurde. Er zeigt, wie die Arbeit des Spiels auf die Kerne eurer CPU verteilt wird. Die Zeit wird waagerecht dargestellt. Hier werden zwei Frames der Spiellogik angezeigt. Für eine bessere Übersichtlichkeit habe ich viele der Bezeichnungen unscharf gemacht.

DirectX9 Prozessverteilungen sind auf den Hauptkern ausgerichtet.

Jede horizontale Reihe steht für einen logischen Thread. Hier könnt ihr sehen, dass ich sechs Arbeitsthreads habe. Wir passen die Anzahl der Arbeitsthreads an, je nachdem, wie viele CPU-Threads eure CPU unterstützt. Ich habe einen Chip, der acht Hardware-Threads unterstützt, also teilt das Spiel sie in einen Spielthread, einen Renderthread und sechs Arbeitsthreads auf. Bei Guild Wars 2 laufen auch andere Threads, die ich hier nicht zeige. Diese Threads sind nicht besonders rechenintensiv und für diesen Beitrag nicht relevant.

Die verschiedenen Blöcke innerhalb der Threadkanäle stellen die Arbeit dar. Wenn der Thread als leer angezeigt wird, bedeutet dies, dass er sich im Leerlauf befindet und keine Arbeit für das Spiel verrichtet. In diesen Bereichen kann der Hardware-Thread Arbeit von anderen Anwendungen auf eurem Rechner übernehmen.

DirectX9 Prozessverteilungen sind auf den Hauptkern ausgerichtet.

Logische Frames sind die Stellen, an denen wir die Spielschleife als neu gestartet betrachten. Vertikale Linien markieren den Anfang logischer Frames. Hardware-Eingaben (wie Tastatur/Maus) werden hier zu Beginn abgefragt.

DirectX9 Prozessverteilungen sind auf den Hauptkern ausgerichtet.

Hier wird aus dem Grafik-Frame eine Schleife. Da am Anfang des Spiel-Frames kein Rendering stattfindet, lassen wir einen Teil der Arbeit des letzten Frames in den nächsten Frame überlaufen, damit wir so viel Arbeit wie möglich parallel erledigen können. Irgendwann muss man jedoch warten, bis der letzte Frame fertig ist, damit man die Arbeit für den nächsten Frame abschicken kann. Hier ist euch vielleicht ein roter Arbeitsblock im Hauptthread aufgefallen, der sich mit einem Teil der Arbeit auf dem Renderthread deckt. Genau das wollen wir beseitigen. Der Spielthread sollte nie auf den Abschluss der Rendering-Arbeiten warten müssen.

Nebenbei bemerkt: Es gibt noch einige andere, viel kleinere rote Blöcke im Hauptthread. Das ist der Hauptthread, der auf den Abschluss der Arbeit des Auftragthreads wartet.

DirectX9 Prozessverteilungen sind auf den Hauptkern ausgerichtet.

Hier erstellen wir detaillierte Listen von Anweisungen, die der Renderthread ausführen soll. Wenn ein Block allgemeiner Rendering-Arbeiten generiert wurde, wird er an den Renderthread weitergegeben.

DirectX9 Prozessverteilungen sind auf den Hauptkern ausgerichtet.

Der Renderthread wandelt die Rendering-Arbeit gemäß der Besonderheiten des jeweiligen Grafik-Backends (OpenGL oder DX9) um.

DX11-Beta-Rendering-Frame

DirectX11 Prozessverteilungen sind deutlich besser in der Arbeitsaufteilung.

So sieht der neue Renderer im Profiler aus.

DirectX11 Prozessverteilungen sind deutlich besser in der Arbeitsaufteilung.

Die Anordnung der Threads ist die gleiche.

DirectX11 Prozessverteilungen sind deutlich besser in der Arbeitsaufteilung.

Der Hauptthread muss nicht mehr warten, bis die Arbeit des Renderthreads abgeschlossen ist. Das ist aufgrund der Architektur von BGFX möglich. Zeichnen-Aufrufe werden im Spielthread gesammelt. (Und auch in den Arbeitsthreads, dazu kommen wir noch). Wenn der Frame dann endet, verarbeitet BGFX diese Befehle in seinem Renderthread. Jetzt haben wir eine Menge Spielraum zum Zeichnen!

DirectX11 Prozessverteilungen sind deutlich besser in der Arbeitsaufteilung.

Die Umwandlung der Rendering-Daten aus der Warteschlange in BGFX-Befehle erfolgt parallel in verschiedenen Auftragthreads.

Das war’s! Für mich war dieses Projekt sehr interessant. Ich bin gespannt auf die technische Zukunft von Guild Wars 2.

Bitte lasst uns in den Foren wissen, wie die DirectX11-Beta bei euch funktioniert.

Wir sehen uns in Tyria!

James Fulop

Guild Wars 2 End of Dragons Logo

Wenn ihr diesen Reflink beim Kauf von End of Dragons verwendet, erhalten wir eine kleine Provision.

Was haltet ihr von der Entscheidung DirectX11 zu wählen? Werdet ihr die neue Engine gleich testen oder bis zum Release warten? Teilt es in den Kommentaren, auf Facebook oder auf Twitter mit uns.

Eyora

Eyora, mein Name kommt aus Fantasy-Romanen, da ich im Fantasy-Bereich stark aktiv bin. Aber als ein Kind der 80er, weiß ich schon gar nicht mehr, aus welchem Roman der Name kam, habe daher aber auch die gesamte Entwicklung der Spiele mit gemacht. GW2 spiele ich seit Release und treibe mich auf Tyria immer im PVE rum, da ich nach wie vor die Geschichten liebe. Für gemeinsame Abenteuer findet ihr mich Ingame unter Eyora.8196.

4 Kommentare

  1. Normalerweise starte ich GW2 mit dem Parameter „-dx9single“, da es damit etwas besser läuft (über wine).
    Weiß jemand, ob ich diesen Parameter für die Beta weglassen muss?
    Überschreibt der Parameter die Einstellung oder umgekehrt?

    1. Laut Wiki läuft Dx9c ja damit im single-threaded mode, wo unter Wine die Performance meist besser sein sollte, mit dem neuen DX11 und der besseren Multi-Thread Unterstützung wäre der Parameter also Kontraproduktiv, (falls er überhaupt funktionieren würde)…

      Um die neue DX11 Beta zu testen, würde ich es weglassen, bis zum finalen Release wirst Du es bestimmt wieder nutzen wollen.
      Falls die DX11 implementierung so gut gelungen ist wie von dem Fanprojekt, bringt es deutlich spürbare Verbesserungen auf Mehrkernprozessoren.

    2. Wissen? Nein, ich habe auch nur die Informationen aus dem Blogpost. Ich würde vermuten, dass der Parameter eine Einstellung im bisherigen DX9-Renderer ist, die der neue DX11-Renderer einfach nicht kennt und der Parameter daher keine Auswirkung haben wird. Das ist aber nur eine Vermutung. Ich würde sagen: probiere es einfach aus.

  2. Der Punkt ist nicht mal so sehr, dass der Hauptthread entlastet wird. Das entscheidende sind die roten Bereiche im Hauptthread. Mit DX9 sieht man einen breiten roten Balken der anzeigt, dass der Hauptthread auf den Renderthread warten muss, bevor er mit seiner Arbeit weitermachen kann. Und der Balken fehlt im DX11/BGFX Diagramm – der Hauptthread kann also schneller mit seiner Arbeit weitermachen und dadurch auch schneller das aktuelle Frame abschließen und (vom Renderthread) ausgeben (lassen).

Schreibe einen Kommentar

Schaltfläche "Zurück zum Anfang"