Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Schrompf

Alter Hase

  • »Schrompf« ist der Autor dieses Themas

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

1

29.03.2022, 19:01

Welche 3D-API nehme ich?

(Crosspost ausm ZFX, weil hier ja auch einige alte Hasen mit Erfahrung mitlesen)

Moin.

Ich habe ein Framework. Das ist >20 Jahre alt, wird immer noch aktiv gepflegt, ich mag es. Ich weigere mich, die Sinnlosigkeit meines Handelns einzusehen, und will weiter meine Grafik selbst programmieren.

Das Problem: der Grafikteil des Frameworks basiert auf DirectX9. Langsam sterben die Tools dafür aus: NSight verweigert seit einigen Jahren die Zusammenarbeit, PIX hab ich noch ne Uralt-Install, weil es das offiziell nicht mehr gibt. Und mir fehlen halt alle coolen Sachen, die moderne GPUs so können. Ich hätte die ganzen Bindless-Geschichten gut gebrauchen können, hätte Verwendung für GeometryShader oder gar MeshShader - das ist mir aber noch zu jung und nicht omnipräsent genug - und ich könnte Compute Shader gut gebrauchen. Asynchrone Transfers wären ein Gewinn, DX9 hackt und ruckt gerne mal, wenn man dynamisch streamen will, egal was man an Flags und Tricks zaubert. Also muss ich jetzt irgendwann mal in den sauren Apfel beissen und auf eine andere 3D-API umschreiben. Aber auf welche?

Mein Ursprungsplan war Vulkan: schnell, direkt, ziemlich gesunde Baseline-Funktionalität, alle spannenden Plattformen abgedeckt: Windows, Linux, Android. Einzig die dämlichen RenderPasses brauchen ne Extension, aber soweit ich das verstehe, ist das nur API-Design und demzufolge ne Selbstverständlichkeit und nicht an irgendwelche Hardware-Generationen gebunden.

Aber mit der Direktheit kommt halt eine massive Verantwortung und Komplexität, und ich bin nicht sicher, ob ich das in meiner Freizeit hinkriege. Kein IOS/OSX ist dagegen zwar schade, aber dem Drecksverein wünsche ich eh die Pest und auf IOS muss man sowieso irgendne API benutzen, die's nirgends sonst gibt, also ist das jetzt erstmal kein Problem. Meine Sorge bleibt die heftige Asynchronizität mit Vorhalten von Transfers, Barriers und Semaphores, Nachhalten von gelöschten Ressourcen usw. Und ist Vulkan wirklich schon überall verfügbar? Oder renne ich z.b. mit dem Wurmspiel, was ja reichlich casual ist, dann in tausendundein Treiber-Probleme?

Außerdem kenne ich genau eine Person, die Vulkan macht, und die macht nur aller Monate mal ein bissl Fortschritt, so dass ich jetzt *echte* Angst vor der Arbeitsmenge habe, die anscheinend für Selbstverständlichkeiten notwendig ist.

Dann gibt's da DirectX12, aber das schließe ich aus, weil's quasi wie Vulkan ist, aber mich zusätzlich auf einer Plattform einsperren würde. Ok, zwei, wenn man XBoxOne einberechnet, und irgendwann will ich ja mal auf die Konsolen. Aber das ist so ferne Zukunftsmusik, die hört man eh nur bei günstigem Wind, das ist kein Argument für die nächsten zehn Jahre.

Der Kumpel aus dem gleichen Kaff DirectX11 ist da schon ein anderes Kaliber. Ich könnte damit (fast) alles machen, was auf meiner Liste steht, und die API ist grundsätzlich noch wie DX9 und kümmert sich um Allocations und Synchronisation selbst. Dafür könnte ich die Einschränkung auf Windows eventuell in Kauf nehmen - Linux krieg ich ja mit Valves Bemühungen dann irgendwie dazu, schade um Android, fick Apple, Konsolen brauchen eh Custom-Liebe. Aber wenn ich dann doch für ne Linux-Version einen Layer einziehen muss, würde ich das mit...

...OpenGL machen. Mit OpenGL krieg ich auch alles, was ich mit DX11 kriege, und wahrscheinlich mit irgendnem wüsten Gewitter aus Extensions auch asynchrone Transfers. Aber OpenGL ist halt ne KATASTROPHE, so als API. Tausend kleine Inseln aus API-Methoden, teilweise überlappende Zuständigkeiten und unsichtbare Konflikte im Hintergrund, der Shader-Compiler ist eine treiberabhängige Sauerei aus dem dritten Kreis der Maintenance-Hölle, und jederzeit könnte Dir an irgendner Stelle ein DrawCall aus jedem zweiten Frame rausflackern und Du hättest keine verdammte Ahnung, wo Du überhaupt suchen sollst. OpenGL ist der Wartungshass in Tüten, und ich spreche da aus zugegebenermaßen >5 Jahre alten Erfahrungen.

Was also nehme ich? Habt ihr Erfahrungen, die ihr mit mir teilen könnt? Sollte ich meinen GameDev.net-Account mal reaktivieren und dort fragen?
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

29.03.2022, 19:32

Wenn ich du wäre, würde ich einen Versuch mit Vulkan und dem offiziellen C++-Wrapper wagen. Ich kann zwar nicht aus eigener Erfahrung sprechen, aber darüber habe ich viel Gutes gelesen.

Ergebnisse meiner kurzen Recherche: NVIDIA-Hardware ist ab 2014 (Maxwell 1) und AMD-Hardware ist ab 2012 (Graphics Core Next) Vulkan-kompatibel. Bei Intel-GPUs wird Vulkan ab 2015 (Skylake) unterstützt.

Vulkan dürfte auf jeden Fall die API der Zukunft sein.

Schrompf

Alter Hase

  • »Schrompf« ist der Autor dieses Themas

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

3

29.03.2022, 19:54

Ja, was die Zukunftsfähigkeit angeht, stimme ich Dir zu. Aber die Asynchronizität? Ist das für Privatmenschen beherrschbar oder braucht man dazu ne Anstellung, um sich Vollzeit kümmern zu können?
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

31.03.2022, 01:13

Ich denke, dass man das Thema Asynchronizität nicht voll ausreizen muss, solange man "nur" Casual Games entwickelt, bei denen es kein großes Problem darstellt, dass man sein Frame in 1/60 Sekunde gerendert kriegt.

Schrompf

Alter Hase

  • »Schrompf« ist der Autor dieses Themas

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

5

31.03.2022, 13:12

Ja, ich meinte eher die ganzen Barriers und Semaphores, mit denen man jede Transaktion garnieren muss. Oder die Lebenszeit von API-Objekten, die man ja anscheinend nicht löschen darf, bevor die GPU damit fertig ist. Hm.

Nuja, im ZFX gab's dazu ne kleine Diskussion, und dort fiel der Name WebGPU. Wikipedia und der Standard selbst reden die ganze Zeit nur von JavaScript, aber Google gibt sich wohl viel Mühe, dass es native sauber ist. Benutzt dann Vulkan oder DX12 oder Metal drunter, ich schau mal, was es mir abnimmt. Ich werde berichten, wenn ich mal dazu komme
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

stef

Treue Seele

Beiträge: 246

Wohnort: Kassel

Beruf: Softwareentwickler

  • Private Nachricht senden

6

31.03.2022, 16:49

Vulkan ist meine dritte API die ich gelernt habe bzw. lerne und bis jetzt habe ich es nicht bereut.
Ich war echt überrascht wie schnell die eingeschlagen ist und um wieviel schneller sie rendert.
Doom 2016 OpenGL rendert ca. 25% langsamer bei mir als die Vulkan Variante.
Meine Renderloop ist nach wie vor im Hauptthread, nur das Movement habe ich in einem separaten Thread abgekoppelt.
Die API zwingt dich also nicht mit 50+ Threads zu operieren :D .
Was den support angeht kann ich den Vulkan Discord empfehlen.
Da sind echt kompetente Leute schnell erreichbar.
Sascha Willems zum Beispiel. Der hat die Offiziellen Khronos Vulkan Examples entwickelt die du auf khronos.org runter laden kannst.
Literatur (in Papierform :) ) ist extrem dürftig und auch qualitativ nicht besonders.
Da bist du für den Einstieg also eher aufs Netz angewiesen. Tutorials gibt es da einige.
"In C++ it's harder to shoot yourself in the foot, but when you do, you blow off your whole leg." — Bjarne Stroustrup.

Schrompf

Alter Hase

  • »Schrompf« ist der Autor dieses Themas

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

7

01.04.2022, 12:17

Ok, Danke. Vulkan direkt hab ich auch auf der Liste, ein Layer weniger zu debuggen wär für's Reinkommen förderlich. Will noch den offiziellen Loader rausschmeißen und durch volk ersetzen, und ich brauch anscheinend für irgendwas jenseits von Tutorials nen Allocator. Aber ich habe langsam ein Bild von der Gesamtsituation, und das macht mich irgendwie zufrieden.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

stef

Treue Seele

Beiträge: 246

Wohnort: Kassel

Beruf: Softwareentwickler

  • Private Nachricht senden

8

05.04.2022, 13:43

Nur mal so aus Interesse ... warum willst du den Loader im Lunar SDK nicht verwenden ?
"In C++ it's harder to shoot yourself in the foot, but when you do, you blow off your whole leg." — Bjarne Stroustrup.

Schrompf

Alter Hase

  • »Schrompf« ist der Autor dieses Themas

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

9

05.04.2022, 14:42

Weil man den global installieren muss. Damit kann ich ihn nicht mehr in meinen semi-autarken Build integrieren und mit einchecken.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

LukasBanana

Alter Hase

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

10

13.04.2022, 06:32

Hallo Schrompf,

also deine Hingabe zu deinem Framework, dass du ueber so lange Zeit pflegst, beeindruckt mich, dass ich jetzt nach ca. 6 Jahren mal wieder etwas in diesem Forum zum Besten geben moechte :)

Ich selbst war ja immer ein Fan davon, bei einem Spiel alles von Grund auf selbst zu entwickeln, daher kann ich deine Leidenschaft denke ich gut nachvollziehen.
Mit meinem mittlerweile auf Eis gelegten Projekt LLGL hatte ich 2015 versucht, mir eine neue Grundlage in Form eines Abstraktionsleyers zu schaffen, damit ein Umstieg auf neue 3D APIs etwas einfacherer werden soll.
Aber alleine so ein Abstraktionslayer, oder RHI (Render Hardware Interface), wie er bei der Unreal Engine heisst, ist ein grosses Unterfangen.

Sofern du aber nur eine neue API anbinden willst, empfehle ich dir, dir die Zeit zu nehmen um dich in Vulkan einzuarbeiten.
Jedoch gleich vorab, und das ist natuerlich nur meine persoenliche Meinung: da laeuft leider vieles aehnlich schief wie mit OpenGL, vor allem was das Extension Chaos angeht.
Alles in allem ist es aber Zukunftssicher, bietet praktisch alle Features wie auch Metal und D3D12 (wobei die Khronos Group hier mal wieder Microsoft hinterher hinkt), aber vor allem kann man mit deutlich weniger Code sein Ziel erreichen!
Das mag erstmal nicht so aussehen, weil man zu Beginn sehr viel aufgeblasenen Code benoetigt, um ueberhaupt ein farbiges Dreieck auf den Bildschirm zu bekommen.
Hat man aber erst mal seinen Grafik Kontext usw. erstellt und seine Helferfunktionen und eigenen Abstraktionen zur Verfuegung, kommt man insgesamt mit deutlich weniger Code ans Ziel.
Es stimmt, die Barrier, Semaphores, Fences und Events sind eine grosse Umstellung von OpenGL und auch die RenderPasses aber allem voran die Pipeline State Objects (PSO) erfordern ein Umdenken gegenueber den alten APIs.
Mich persoenlich hatte zu Beginn gestoert, dass weder Vulkan noch D3D12 eine Funktion zum MIP-Map Generieren anbieten, wie z.B. `glGenerateMipmap()`, bis ich gelernt habe, dass das in modernen Engines ohnehin kaum in der Form genutzt wird.
Entweder werden die MIP-Maps schon beim Laden bereit gestellt und komprimierte Texturformate unterstuetzen ohnehin keine automatische MIP-Map Generierung (auch nicht in D3D11 oder OpenGL) oder die MIP-Maps werden in einer Spezialform generiert, z.B. Hi-Z maps, also keine konventionellen MIPs mit durchschnittswerten.
Lange Rede kurzer Sinn, es hat mich persoenlich zunaechst viel Zeit gekostet, um hier an vielen Stellen umzudenken, auch was das Binding von Ressourcen angeht, was primaer mit den PSOs und ResourceHeaps ablaeuft (nicht limitiert darauf, aber das scheint mir zumindest eine der Kernfunktionen zu sein).

Ich wuensche dir mit deinem Projekt weiterhin viel Erfolg!
Mit dem, was ich von dir auf den Devmanias vor einigen Jahren gesehen habe, habe ich keinen Zweifel daran, dass du diese API rocken wirst :)

Herzliche Gruesse aus den USA - jetzt wisst ihr warum die schoenen Umlaute fehlen ;-)
Lukas

Werbeanzeige