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

1

15.09.2008, 15:56

Plattform Unabhängigkeit

Viele Engines greifen auf OpenGL und DirectX zurück, wobei man auswählen kann, was man von beidem nun zum rendern verwenden möchte. Ebendfalls kann man sich aussuchen, ob man WinAPI oder sonstige APIs zum erstellen eines Fensters verwenden will. Doch wie sage ich dem Programm, das ich nur OpenGL verwenden will, damit auf Linux Betiebssystemen keine konflikte auftreten, weil DirectX fehlt? macht man das ganze einfach das die Dateien die DX verwenden, nur includiert werden wenn der User sagt ich will DX verwenden, sodass der include Befehl in einer if Abfrage steht. Oder macht man das ganze einfach mit #ifdef? Genauere Details würden mir sehr weiter helfen.

2

15.09.2008, 16:01

Hm also im Falle Ogre3D würde ich eine separate Plugins.cfg für Linux anlegen, in der das D3D-RenderSystem nicht enthalten ist. Im Code kannst du dann per Präprozessor testen, für welches OS gerade kompiliert wird:

C-/C++-Quelltext

1
2
3
4
5
#if defined (_WIN32)
Ogre::String pluginsFilename = "plugins_win32.cfg";
#elif defined (unix)
Ogre::String pluginsFilename = "plugins_linux.cfg";
#endif


Ich weiß jetzt nicht, wie andere Engines das mit mehreren APIs intern handlen, aber da kann hilft sicherlich auch #if defined.
Mein Projekt: Rise of the Sylvan

3

15.09.2008, 18:43

Danke für deine Antwort. Ist das jetzt um mit Ogre eines der beiden APIs zu verwenden, oder wie ich selber in einer eigenen Engine zwischen OpenGL und DirectX aussuchen kann? Ich kenne mich mit den cfg Dateien überhaupt nicht aus ... Es sollte so sein, das man das Programm Kompiliert, und man dann bei aufruf des Programms aussuchen kann was man verwenden möchte.

Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

4

15.09.2008, 18:56

Im Normalfall sollte deine Engine intern überprüfen, welches betriebssystem installiert ist und dann je nach Betriebssystem entsprechende Funktionen aufrufen.
Was du halt machen solltest ist zwischen Linux und Windows bei der Main zu unterscheiden:

C-/C++-Quelltext

1
2
3
4
5
6
7
#ifdef WIN32
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR lpCmdLine, int nShowCmd)
#else
int main(int argc,char* argv[])
#endif
{
}

5

15.09.2008, 19:12

Die main ist momentan eigentlich egal, ich Frage mich halt wie ich es selber hinbkomme, das man mit meiner kleinen Engine aussuchen kann was man nun verwenden will. Also mir wurde da jetzt eine möglichkeit genannt, leider gefällt mir diese nicht. Ich habe mir mal den Quelltext der Irrlicht Engine angesehen, um zu schauen wie diese das gemacht haben. Irrlicht überprüft einfach ob nun etwas definiert wurde, ala #ifdef, und in dieser if anweisung steckt dann der ganze code zum rendern mit OpenGL oder DirectX. Leider finde ich nicht die definition der Funktion "createDeviceEx()" ...

Ich weiß un leider nicht wie ich das mit #ifdef machen soll, da die headerdateien bereits eingebunden werden und bevor ich es definiere schon überprüft wird ob es nun schon definiert wurde, darum will dies bei mir nicht funktionieren :(

EDIT:::

Kurze verständnisfrage. Kann ich Code, der auf Linux nicht funktioniert mit kompilieren, und das Programm funktioniert dann einwandfrei solange ich auf diese Funktionen nicht zugreife? Also, ich kann ganz normal die DX header includieren, und das Programm leuft auf Linux, slange ich keine DX funktionen benutze?

6

15.09.2008, 19:33

Zitat von »"Dustin Braun"«

EDIT:::

Kurze verständnisfrage. Kann ich Code, der auf Linux nicht funktioniert mit kompilieren, und das Programm funktioniert dann einwandfrei solange ich auf diese Funktionen nicht zugreife? Also, ich kann ganz normal die DX header includieren, und das Programm leuft auf Linux, slange ich keine DX funktionen benutze?

Nein, weil du dann ja auch automatisch die DX DLLs linkst, und die gibts unter Linux net, was beim Start eine Fehlermeldung gibt. Du brauchst zwingend zwei verschiedene Progrmme für windows und Linux, wenn du mit C++ arbeitest, die können allerdings auf demselben Quellcode basieren, solange du den Platformspezifischen Code über #ifdef jeweils in abhängigkeit von den Makros ausschließt, z.B.:

C-/C++-Quelltext

1
2
3
4
5
#ifdef WIN32
#include <D3D9.h> //für Windows

#else
#include <openGL.h> //für Linux

#endif

Anmerkung: die Header sind vermutlich falsch, soll nur als Beispiel für die Konstruktion dienen ;)

Anonymous

unregistriert

7

15.09.2008, 19:38

Einfache Frage: Warum Direct3D? OpenGL gibts auch unter Windows ;)

Doppelte Arbeit ist recht ineffektiv.

8

15.09.2008, 19:45

Ja, nur möchte ich, das man beides verwenden kann, da manche Grafikkarten einfach DX anwenungen schneller rendern können als OGL, und manche können OGL anwendungen schneller rendern. Bei mir ist DX doppelt so schnell als OpenGL, und auf meinem anderen rechner ist beides fast gleich schnell ...

Zwei exen zu kompilieren ist kein Problem, es soll nur möglichsein mit dem selben code, ohne großartig was zu verändern, für Linux und Windows zu kompilieren. Unter Windows soll man jedoch aussuchen können, ob man OpenGL oder DirectX verwenden will. Nun soll aber das aussuchen ob ich openGL oder DX verwenden will so aussehen:

DerDevice d = createDatDevice(USE_OPENGL, USE_WIN32API, ...);

als Beispiel ... Das Problem ist nun, das erst nachdem die Header eingebunden sind entschieden wird, ob man nun OpenGL oder DX verwenden will!

Anonymous

unregistriert

10

15.09.2008, 19:50

Dustin Braun
Auf das Schicksal einzelner Individuen kann die Gemeinschaft keinerlei Rücksicht nehmen - solltest du dir merken.

Implementiere OpenGL richtig und du hast keine Sorgen und wenn? Das ist ein Schicksal einiger Wenigen.

Werbeanzeige