Du bist nicht angemeldet.

Werbeanzeige

Julién

Alter Hase

  • »Julién« ist der Autor dieses Themas

Beiträge: 720

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 321

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: 524

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 907

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: 524

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 143

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: 720

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)

JaielSoft

Alter Hase

Beiträge: 1 164

Wohnort: Berlin

Beruf: Student Ang. Informatik

  • Private Nachricht senden

9

25.10.2015, 23:57

Ich glaube so eine Überlegung ob Virtuell oder nciht wegen der Performance wäre vllt anfang 1990 ok gewesen aber heutzutage macht man sich um sowas gar keinen Kopf...

Julién

Alter Hase

  • »Julién« ist der Autor dieses Themas

Beiträge: 720

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

10

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

Werbeanzeige