Steam verbessert Shader-Performance durch Pre-Cache unter Proton
Saturday, 15. June 2019
Steam hat schon vor Jahren einen P2P Shader-Cache für OpenGL und Vulkan eingeführt. Kürzlich ist er auch für Proton/DXVK aktiviert worden, jetzt auch auf meinem Linux-Rechner in der stabilen Version von Steam.
Worum geht es hier? Was sind Shader?
DXVK wandelt Aufrufe von DirectX, der unter Windows genutzten Grafik-API, nach Vulkan um. Zusammen mit wine können damit Windows-Spiele besonders gut unter Linux laufen. Aber es werden eben auch die Shader umgewandelt, das konnte bisher einen Moment dauern.
Shader sind nicht das Level, auf dem ich programmiere und Ahnung habe. Aber sie sind meinem Verständnis nach Grafikeffekte als Code, hier ein Beispiel. Sie müssen kompiliert werden, umgewandelt werden von Code in etwas, was direkt von OpenGL bzw Vulkan nutzbar ist. Siehe auch diese Erklärung, warum das unter Linux derzeit besonders problematisch ist.
Auf jeden Fall kann es einen Moment dauern und das ist natürlich potentiell schlecht, denn dann stockt das Spiel. Für die meisten Spiele geht es hier nur um die ersten Sekunden nach dem ersten Start, aber bei anderen passiert das kontinuierlich während des Spielens.
Wie funktioniert der Cache?
Es ist geteilter Cache aller Steam-Nutzer. Nach dem Spielen analysiert Steam, welche Shader kompiliert wurden. Die werden dann hochgeladen und an die anderen Nutzer verteilt. Die sparen sich dann den Kompilierungsschritt, wodurch ihr Spiel flüssiger läuft. Und Steam kann sich jetzt auf der Ebene bewegen, auf der das Spiel lebt: Ein DirectX-Spiel, das per Proton/DXVK unter Vulkan läuft, produziert auf dem Linuxrechner Vulkan-Shader. Steam kann genau die Cachen, nicht die vorgelagerten DX-Shader (die wahrscheinlich sowieso vom Entwickler vorkompiliert wurden), die durch die Grafik-Pipeline dann nochmal umgewandelt werden müssten.
Die von Valve dafür genutzte Software heißt wohl Fossilize. Das besonders nette ist: Der Entwickler des Spiels muss dafür nichts tun.
Wenn ich das richtig verstehe landen übrigens nicht die Shader selbst im Cache, die wären grafikkartenspezifisch. Sondern eine Zwischenrepräsentation, die dann immer noch einmal kompiliert bzw von Vulkan/OpenGL interpretiert werden muss. Ich bitte um Korrektur, falls das nicht stimmt.
Welche Spiele betrifft es?
Unter Linux im Grunde alle, denn entweder nutzen sie OpenGL oder Vulkan direkt oder indirekt per DXVK. Leider zeigt Steam in der Oberfläche nicht an, welche Spiele bereits Shader-Cachedateien heruntergeladen haben. Aber es betrifft jetzt eben auch Proton-Spiele, also Windows-Spiele, die unter Linux mit Steams Kompatibilitätshelfer laufen. Ich habe Downloads für Witcher 3 und Path of Exile gesehen, Downloads der Shader werden nämlich doch angezeigt.
Funktioniert es?
Vielleicht. Ich habe gestern zum ersten mal Dark Souls 2 gestartet, da war der Cache gerade eingeführt. Ich beobachtete tatsächlich keine Ruckler, auch nicht beim ersten Laden des Hauptmenüs. Und normalerweise konnte man an dieser Stelle bei diesen Protonspielen schon bemerken, dass sie nicht nativ unter Windows laufen, durch ein Ruckeln am Anfang. Das ist jetzt wohl weg.
Es gibt da aber ein Problem: Normalerweise wird ein solcher Shader-Cache wenige MB groß sein. Aber manche Spiele wie Path of Exile benutzen sehr viele Shader und Kombinationen derselben, die (schon durch den DXVK-Zwischenschritt) auch nicht bei Spielstart, sondern während des Spielens geladen werden. Das führte bisher zu Rucklern. Und auch mit dem neuen Cache stottert es noch, mehr sogar als bei meinem ersten Spieldurchlauf – was aber eher an den Änderungen im letzten Spielupdate liegen dürfte, den neuen Gegner in den Startgebieten mit mehr grafischen Effekten. Oder da geht etwas anderes schief. Auf jeden Fall half der Cache bisher nicht. Was eben auch an seiner Größe liegen dürfte: Gestern hat Steam alleine für PoE mal eben 700MB an Shader-Cacheinhalten heruntergeladen. Jetzt gerade läuft der nächste 1,1 GB große Download. Ich bin gespannt, ob sich irgendwann der Cache auf eine finale Größe einpendelt und ob er dann die kleinen Ruckler des Spiels beseitigt.
Er könnte ja auch selbst zum Problem werden. Wenn er nicht für so große Datenmengen gebaut wurde führen bei diesem Spiel vielleicht die Cache-Abfragen selbst zu Rucklern.
Auf jeden Fall ist es grundsätzlich eine gute Sache. Es zeigt: Auch wenn Steam proprietäre Software ist, ist es eben der eine Spieleshop, der an Linuxspieler denkt. GOG, die eigentlich bessere DRM-freie Alternative, könnte so etwas gar nicht umsetzen, da ihr Linux-Client nicht existiert.