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

Julién

Alter Hase

  • »Julién« ist der Autor dieses Themas

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

1

25.10.2015, 16:02

C++ | Renderer austauschen

Hi,
für meine Engine war geplant, dass diese auf OpenGL 4.0 zurückfällt, wenn DirectX 11 keine Option ist (s. das Hamsterrad meiner Mom, das sie PC nennt).
Ich weis jedoch nicht wie ich dies umsetzen soll.

Natürlich könnte man jetzt (was ziemlich naheliegend ist) überall virtuelle Klassen einführen oder eine virtuelle "Backend"-Klasse einführen.
Jedoch bekomme ich schon ein mulmiges Gefühl, wenn ich Performance und virtuelle Klassen in einem Satz höre.

Bei mir sind die beiden Module jeweils für OpenGL und DirectX getrennt, aber definieren die gleichen Funktionalitäten.
Ist es möglich eines dieser Module (.DLL/.SO) durch das andere zu ersetzten? (Hot Binary Swapping?)
Oder soll ich meine Spiele dann einfach zweimal linken und dann soll ein Launcher entscheiden welches gestartet wird?
Was ist denn heutzutage gängig?

LG Julien
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Julién« (25.10.2015, 16:10)


Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

2

25.10.2015, 17:15

Virtuelle Funktionen sind mehr oder weniger dasselbe wie dynamisches Linken - in beiden Fällen wird aus einer Tabelle ein Funktionszeiger gelesen, anstatt die Funktion direkt anspringen zu können. Und Du machst Dir da definitiv zuviele Gedanken. Virtuell oder Nicht-Virtuell macht erst ab vielen dutzend Millionen Aufrufen pro Sekunde einen messbaren Unterschied.

Hotswapping finde ich aber aus verschiedenen Gründen Quatsch. Dafür spricht eigentlich nur "weil's geht". Dagegen spricht der doppelte Pflegeaufwand, der vor allem bei OpenGL und wechselnder Treiber-Qualität amtlich werden kann. Und wenn der Rechner Deiner Mutter so alt ist, dass er kein DX11 kann, dann wird der OpenGL-Support für 4.0 oder höher auch ein wackeliges Ding sein. Beide APIs gleichzeitig zu unterstützen bedeutet außerdem fröhliches Shader-Crosscompilen und diverse konzeptionelle Änderungen wie z.B. abweichenden Texturkoordinaten-Ursprung, den wegzuabstrahieren eine spannende Herausforderung ist.
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.

cojo2015

Alter Hase

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

3

25.10.2015, 17:20

Was ist denn heutzutage gängig?
Ich kenne bis jetzt nur ein Spiel, bei dem man beim Start des Spiels auswählen kann (Bild im Anhang). Das Spiel läuft auf DirectX 11 genau so flüssig wie mit OpenGL.
»cojo2015« hat folgendes Bild angehängt:
  • Unbenannt.PNG

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

4

25.10.2015, 17:38

Es gibt nicht gerade wenig Spiel-Engines die zwei oder mehr Grafik-APIs anbieten: https://de.wikipedia.org/wiki/Liste_von_Spiel-Engines
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

cojo2015

Alter Hase

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

5

25.10.2015, 17:54

https://de.wikipedia.org/wiki/Liste_von_Spiel-Engines


Na sieh mal einer an ;)

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

6

25.10.2015, 17:57

Quellcode

1
[quote='Julién','index.php?page=Thread&postID=315334#post315334']Jedoch bekomme ich schon ein mulmiges Gefühl, wenn ich Performance und virtuelle Klassen in einem Satz höre.[/quote]


Ich bekomme ein mulmiges Gefühl, weil du ein mulmiges Gefühl über Performance von virtuellen Klassen bekommst. Die Performance wird garantiert nicht deswegen, sondern wegen schlechter optimierung langsam laufen. Ein if-else an Stelle von Vererbung macht es auch in keinerlei hinsicht besser.
Also ganz klar Backend-Implementierung. Wenn ich mir Fetze's Duality anschaue, was genau das macht, und sogar diese "superlangsamen".NET Umgebung + Wrapper-Libs zu OpenGL verwendet, brauchst du da meiner Meinung nach nicht weiter nachdenken :-)

Julién

Alter Hase

  • »Julién« ist der Autor dieses Themas

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

7

25.10.2015, 18:11

Dann bleibe ich wohl bei dem:

C-/C++-Quelltext

1
2
3
4
5
6
class Backend{

    virtual ~Backend() = 0;
    virtual void Clear(Buffer buffer) = 0;
    ...
};
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

8

25.10.2015, 18:32

Falls virtuelle Klassen von dir so verteufelt werden, kannst du ja beide Engines in einer Klasse mit identischer Signatur (gleiche .h Datei) implementieren und mit Hilfe eines Präprozessormakros entscheiden, welche Implementierung gewählt werden soll. Das Ergebnis wären halt 2 exe-Dateien, zwischen denen sich der Spieler entscheiden muss. (z.B. Assasins Creed hat 2 exe-Dateien, eine mit DirectX 9 und eine mit DirectX 10)

Julién

Alter Hase

  • »Julién« ist der Autor dieses Themas

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

9

07.11.2015, 23:37

Ich habe mich jetzt entschieden, den "Renderer" bzw. "Backend" auf einem höherem Level zu abstrahieren. -> Backend nicht abstrahieren, aber ein paar andere Sachen.
Das macht Sinn, wenn man bedenkt, dass ich einen "Submission based" Renderer erstellen möchte.
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

10

08.11.2015, 11:02

Die Engines, mit denen ich bisher gearbeitet habe, hatten ganz unterschiedliche Ansätze dafür. Gemeinsam hatten so ziemlich alle, das der Aufwand für Pflege/Implementierung möglichst gering bleiben sollte. Das macht insofern Sinn, als das Mehraufwand immer mit größern Kosten verbunden ist. DirectX und OpenGL? Wenn das Spiel nur für Windows erscheint wird Letzteres außen vor gelassen. Es geht da auch um die potentielle Zielgruppe. Auch deshalb haben die meisten Engines ihre Dx9 Backends komplett rausgeschmissen. Ab einem gewissen Punkt ist der Aufwand alles zu pflegen zu groß und mitschleifen alter APIs verhindert effektiv ein modernes Design für Highlevelrendersysteme. Aus der Überlegung ergeben sich dann die Implementierungen für Backends, z.B. Dx11/12 für Win, ein Backend für PS4 eins für XB1. (Mantle für Marketing ;)) Kein hotswapping/runtime switchen notwendig. Also keine Notwendigkeiten für virtuelle Interfaces (und den damit verbundenen Overhead).

Falls du das wirklich brauchst dann ist ein abstraktes Interface schon ok. Aber vermutlich lässt sich der Aufwand sparen oder garnicht erste rechtfertigen.

Mal aus Interesse: was ist denn für dich ein "submission based" renderer?
@D13_Dreinig

Werbeanzeige