(Nvidia)DX12 für ein DX 11 Spiel zu erzwingen?

Thanok

Vice Admiral
Registriert
Feb. 2009
Beiträge
6.553
Hallo,

die Frage steht im Grunde ja schon im Titel, aber ich denke das ganze braucht ein wenig Erklärung.
tl;dr: Ich möchte Planet Coaster, ein DX 11 Spiel mit DX 12 laufen lassen - ähnlich wie Intel das mit den Arc Karten macht. Mir ist bewusst dass die maximale Framerate dadurch massiv reduziert wird.

System:
Ryzen 5950X
64GB DDR4 3600
2080Ti
Patriot Viper VPN 100 2TB M.2 als Laufwerk für Windows und meine üblichen Programme.

Ganze Geschichte:
Ich arbeite gemeinsam mit einem Freund an einem Großprojekt im Spiel Planet Coaster. Im Rahmen unserer Bauarbeiten hat sich die Framerate von Anfangs >140 im GPU-Limit mittlerweile auf <40 im CPU-Limit reduziert. Allerdings liegt das CPU-Limit nicht am Spiel. PlanCo selbst unterstützt laut einem Entwickler 16 Threads, laut einem anderen "so viele Kerne wie man draufschmeißt"; Da die CPU-Last bei dem Projekt unter 20% liegt, ist klar, dass hier (wenigstens) ein einzelner Kern limitiert.
Lasse ich nun Gäste in den Park, reduziert sich die Framerate weiter - obwohl die CPU-Last signifikant steigt.

Mittlerweile bin ich mir ziemlich sicher dass der Übeltäter DirectX 11 ist. Da DX 11 die Drawcalls über einen CPU-Thread abhandelt, ist es nur logisch dass bei zusätzlichen Objekten (seien es nun unsere über 400.000 Bauteile oder Gäste) dieser eine Thread mehr und mehr den Flaschenhals darstellt.
Daher mein Gedanke, ob es wie bei Arc möglich ist, DirectX 12 für ein DirectX 11 Spiel zu erzwingen, da die Drawcalls so auf mehrere Threads verteilt werden sollten.
Mir ist klar, dass die maximale Framerate dadurch massiv reduziert wird - aber in diesem Falle wäre die reduzierte Framerate wahrscheinlich immer noch eine massive Steigerung gegenüber der jetzigen Performance.

Und wenn es nichts bringt, dann kann ich wenigstens dem Entwickler die Schuld zuschieben :D

Vielen Dank schon mal fürs Lesen und für euren Input!
 
Eine Möglichkeit DX12 zu erzwingen ist mir nicht bekannt (würde mich auch etwas wundern). Was mir aber einfällt wäre DXVK also DirectX - Vulkan.
 
  • Gefällt mir
Reaktionen: Thanok, Ja_Ge, Alexander2 und eine weitere Person
Wie kommst du darauf, das Intels Arc das so macht? Die haben eine native Unterstützung für DX11, einzig DX9 können die Karten nicht, können aber über einen Wrapper DX9 auf DX12 quasi emulieren - allerdings unter wirklich massiven FPS-Einbrüchen.
 
  • Gefällt mir
Reaktionen: Thanok und CyrionX
So wie die Arc das macht kannst du das nicht in Windows „portieren“. Das sind 2 verschiedene Arten von Emulation.

EDIT: Ich vermute du meinst die DX9 Emulation?
 
  • Gefällt mir
Reaktionen: Thanok
Wie @Cebo schon schrieb, probiers mal mit DXVK. Nutze das selbst für ältere Spiele mittlerweile regelmäßig, da hier das CPU Limit deutlich später einsetzt.
 
  • Gefällt mir
Reaktionen: Thanok
Aber Achtung, wenn ein Spiel Anticheat irgendeiner art nutzt, dann wirst du damit (dxvk und ähnlichem) als cheater abgestempelt! Mit allem was zu dem status in dem Spiel dazu gehört.
 
  • Gefällt mir
Reaktionen: Knaecketoast und Sgt_Stieglitz
Soweit ich weiß kann man nur abwärts Emulieren. Also von DX12 auf DX9 (mit entsprechenden Verlusten). Darum kümmert sich, wenn nötig, der Grafikkartenentwickler. Aufwärts geht nichts zu emulieren, der Entwickler muss erst die höhere API ins Spiel einbauen. Das ist im nachhinein auch nicht ganz so einfach.
Es kann höchstens sein, das der Spieleentwickler eine neue Grafik-API schon im Spiel implementiert hat, diese aber nicht über das normale Konfigurationsmenu freigegeben hat. Das lässt sich dann häufig über Debug-Umgebungen, Startparameter oder manuelles Konfigurationsdatei-editieren einstellen.
Bei Planet Coaster scheint es nach meinen googeln nicht zu gehen.

Edit nach Kommentar von @Alexander2 :)
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Thanok
@Hellyeah da bist du nicht ganz auf dem laufenden, vond eine DX9 Spiel auf DX12 geht, wenn jemand dafür nen Bibliothek macht. was du aber typischerweise antriffst ist DX9 auf Vulkan, bzw. überhaupt alles DX auf Vulkan → Weils bedarf seitens Linux Systemen gibt.

Im grunde gobts für "jede" DX version ne Übersetzung (nicht emulation) zu Vulkan
naja mindestens dx9 aufwärts bin ich mir sicher, dx8 müsste ich nachschlagen.

Edit:
Schau mal da:
https://github.com/doitsujin/dxvk
Man bekommt auch fertige DLLs da ist auch ne Anleitung, wenn nicht auf der Seite, schaue da mal alles an (die Links, unter release builds findeste fertige dlls zum herunterladen.)

Mag sein, das die Performance etwas besser wird, aber auf Grund der Art wie das Spiel programmiert ist würde ich halt auch keine Wunder erwarten..
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Thanok und Hellyeah
Das geht schlicht nicht da die Spieleengine das können muss Einfach die api dxd3 12.dll zu wechseln geht da nicht
 
@syfsyn klares Jaein :-)
Die Spieleengine gibt natürlich weiterhin DX11 befehle raus, wenn es denneine solche ist. mit einer der DXVK Bibliotheken wird das dann aber umgesetzt auf Vulkan, das hier und da auch mal schneller ist als wenn es nativ per DX11 weiter geht.
 
dxvk wurde extra entwickelt für linux zum übersetzen aber einfach dx12 umwrappen gent nicht
 
Brauchst halt auch nicht auf DX12 umwrappen, Vulkan hat auch unter Windows jeder nur im ansatz Moderne Graka mit im Treiber. Und Vulkan ist genauso Low Level wie DX12, Beide sind "Kinder" von Mantle, genau der selbe Krams nur unterschiedlich umgesetzt und von verschiedenen Entwicklern.
 
Danke erstmal für eure Antworten, auch für die Aufklärung dass ich bei Arc DX9 und 11 verwechselt habe.

DXVK klingt erstmal nach einer spannenden Methode, ich werde mich mal daran versuchen.
Probleme mit AntiCheat wird es zum Glück nicht geben, Planet Coaster ist ein Offlinespiel im Geiste von Roller Coaster Tycoon.
Ich berichte von meinen Ergebnissen!
 
Wenn unbedingt jemand D3D11 auf 12 übersetzen will: https://github.com/doitsujin/elf-auf-zwoelf

Relativ triviale DLL, die einfach ein D3D12-Device erstellt und der Anwendung ein D3D11on12-Device gibt, der eigentliche Wrapper ist von Microsoft und bei Windows mit dabei.

Nur sollte man sich davon keine höhere Performance erwarten als mit nativem D3D11, schon gar nicht mit einer Nvidia-Karte. Gleiches gilt für DXVK, ist zwar in der Regel performanter als der Microsoft-Wrapper, aber Nvidia ist im CPU-Limit teilweise mal eben doppelt so schnell.
 
  • Gefällt mir
Reaktionen: Thanok
Schade, aber leider bringt keine der Methoden das erhoffte Ergebnis - nicht, dass ich etwas anderes erwartet hätte.
Mit DXVK startet das Spiel erst gar nicht, die .exe hängt mit 100MB RAM einfach im Hintergrund herum.
Elf auf Zwölf funktioniert tatsächlich, kostet aber nochmal ca. 20% Performance gegenüber DX11 nativ.

Trotzdem vielen Dank für eure Hilfe, einen Versuch war es in jedem Fall wert. Dann muss ein CPU-Kern wohl weiter die Schwerstarbeit erledigen :)
 
Planet Coaster sollte eigentlich laufen, zumindest tut es das unter Linux... aber eben auch nicht besonders toll.
 
Ja, ich hatte auch schon gesehen dass das Spiel Gold-Status hat. Aber unter Linux ist das ja auch nochmal was anderes als unter Windows direkt, zumal es wohl Spiele gibt, die nicht alle Dateien von DXVK nutzen, sondern dann mit dlls aus System32 mischen - das kann dann natürlich nicht funktionieren.

Naja, einen Versuch war es wert, und ich habe immerhin wieder was gelernt 🙂
 
Zurück
Oben