Wie abstrahiert man eine 3d Engine von der Grafik API?
-
Wie muss man sich das vorstellen?
Gibt es für jede Funktion der Grafik API in der Engine eine Wrapperfunktion oder wie wird das gemacht?
-
jup, kannst du so machen. oder du hast eine "DrawMesh" function die du pro platform implementierst. je nachdem wie flexibel du sein moechtest und wieviel arbeit du dir machst.
-
Hm, zwei Fragen:
1. ist so eine Wrappersache nicht langsam?
2. Warum macht man sich überhaupt die Arbeit? Wäre es nicht sinnvoller einfach nur für OpenGL zu entwickeln? OpenGL gibt's doch sicher auch für die XBox & Co.
-
1. Nein, weil es vom Compiler weg optimiert wird, aber selbst wenn man alles virtual macht etc. so, dass es nicht weg optimiert werden kann, ist es mehr oder weniger irrelevant, weil die Funktionen der Grafik-API 100 mal langsamer sind. Insbesondere wenn man eh alles in batches macht, heißt, man ruft nicht 42 mal die "draw_tree()" Funktion auf, sondern man sagt der API einfach sie soll 42 Bäume malen.
2. Die reine Abstraktion ist jetzt nicht so viel Arbeit, wenn man seinen Code hübsch aufzieht passiert das eh mehr oder weniger automatisch, und man ist ja nicht gezwungen die anderen Render-Paths sofort mit zu implementieren wenn man sie nicht braucht, man hält sich nur die Option offen.
-
Abstraktion schrieb:
2. Warum macht man sich überhaupt die Arbeit? Wäre es nicht sinnvoller einfach nur für OpenGL zu entwickeln? OpenGL gibt's doch sicher auch für die XBox & Co.
Nein, XBOX verwendet eine Art DirectX, die aber vom PC sehr unterschiedlich ist. Man kann auf den Konsolen viel näher an der GPU arbeiten als auf dem PC. Deswegen hat AMD ja Mantle entwickelt und DX12 wird genauso sein. Der Overhead von DirectX ist übrigens um ein Xfaches größer als der von OpenGL und während OpenGL mehr reine calls hat, sind die aber auch um einiges effizienter als die von DX.
Warum man sich die Arbeit macht? Weil es am Ende weniger Arbeit ist das ganze auf eine andere Platform zu porten, wenn man den Renderer nach belieben austauschen kann. Vom Speed her macht sich das kaum einen Unterschied.
-
Scorcher24 schrieb:
Der Overhead von DirectX ist übrigens um ein Xfaches größer als der von OpenGL und während OpenGL mehr reine calls hat, sind die aber auch um einiges effizienter als die von DX.
So etwas kannst du gar nicht allgemein sagen. Nur weil mehr Drawcalls möglich sind lässt sich nicht auf den gesamten Overhead schließen. Updaten von Buffern z.B. ist unter DirectX schneller. Quelle: Folie 19
Nvidia zeigt dort zwar auch das man mit Extensions deutlich schneller sein kann, aber Extensions haben nichts mit Standard OpenGL zu tun und sind nicht überall verfügbar.floorball