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

  • »Johannes Schneider« ist der Autor dieses Themas

Beiträge: 103

Beruf: Chemiestudent

  • Private Nachricht senden

1

12.10.2012, 15:16

Sollte man DirectX nicht generell über DLL initialisieren?

Hallo zusammen.
Linkt man ein Programm, welches Abhängigkeiten aus einer LIB enthält von der man nicht wissen kann ob sie auf dem Zielsystem vorhanden sind, kann es sein dass es bereits beim Start meines Spiels zu Fehlermeldungen kommt, weil irgendeine DLL fehlt:


(Link)

(Bereits vor dem Start von Metro2033 schlägt alles fehl)

Hierfür gibt es ja bekannterweise den Microsoft DirectX Installer, der die für das System aktuellste Version von DirectX und alle Komponenten herunterlädt und dafür zu sorgen hat, dass alle Abhängigkeiten die es gibt aus dem Zielsystem vorhanden sind: http://www.microsoft.com/de-de/download/details.aspx?id=35
Doch auf den ist nicht immer Verlass behaupte ich...

Sollte man nicht ALLE Funktionen von DirectX dynamisch aus der dazugehörigen DLL (-> wenn vorhanden) laden?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// DirectX Version intelligent auslesen
        void ReadDXVersion(void) {
            // Bibliothek laden
            HMODULE hDll=LoadLibrary(TEXT("dsetup.dll"));
            // Fehlgeschlagen?
            if(hDll==NULL) {
                cout << "\nDX:  Version query not possible: dsetup.dll load failed!\n   LoadLibrary(...); and GetProcAddress(...); not possible" << endl;
                return;
            }

            // Funktionspointer erstellen
            INT (__stdcall* pFunc)(DWORD *, DWORD *);
            pFunc = (INT (__stdcall*)(DWORD *, DWORD *))(GetProcAddress(hDll,"DirectXSetupGetVersion"));
            // Daten
            DWORD m_dwDirectXVersion, m_dwDirectXRevision;

            // Nun die Werte abfragen
            if(nullptr!=pFunc) {
                pFunc(&m_dwDirectXVersion,&m_dwDirectXRevision);
            }

            // Bibliothek freigeben
            FreeLibrary(hDll);
            // DirectX-Version und Revision
            cout << "\nDX:  Version " << HIWORD(m_dwDirectXVersion) << "." << LOWORD(m_dwDirectXVersion) << "." << HIWORD(m_dwDirectXRevision) << "." << LOWORD(m_dwDirectXRevision) << endl;
        }


Der Vorteil ist, dass man während dem Ausführen feststellen kann ob Abhängigkeiten die man braucht vorhanden sind oder nicht.
Bei modernen Engines sehe ich immer Vergleiche zwischen Direct3D 8/9.0c/10/11 usw.. Ich denke ich sollte auch mit verschiedenen Versionen umgehen können.
Soviel ich weiss ist der "Performanceverlust" bei Verwendung von DLLs fast Null, also:

-Sollte ich alle DirectX Funktionen aus DLLs laden? (vgl. Scherfgens Buch, Seite 782: "Übrigens ist es tatsächlich möglich, Direct3D auf diese Weise zu initialisieren [...]")
-Sollte ich bei DirectX 9.0c bleiben? Bald kommt ja DX 11.1, aber sowas wie "Aufwärtskompatibilität" ist ja noch nicht erfunden :D
"Das Glück des Forschers besteht nicht darin, die Wahrheit zu besitzen, sondern eine Wahrheit zu erringen. Und in diesem fortschreitendem, erfolgreichen Suchen nach der Wahrheit - darin liegt die
eigentliche Befriedigung." Max Planck

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

12.10.2012, 15:31

Der Vorteil ist, dass man während dem Ausführen feststellen kann ob Abhängigkeiten die man braucht vorhanden sind oder nicht.

Und was machst du dann, wenn sie es nicht sind?

-Sollte ich alle DirectX Funktionen aus DLLs laden? (vgl. Scherfgens Buch, Seite 782: "Übrigens ist es tatsächlich möglich, Direct3D auf diese Weise zu initialisieren [...]")

Nein, davon würde ich stark abraten. Verwend die Create* Methoden aus den entsprechenden libs, um deine initialen Objekte zu erzeugen. Das ist der dokumentierte und offiziell supportete Weg. Unter der Oberfläche dieser Funktionen können sich viele Details verbergen. Allein wenn es um die Frage geht, wie COM nun genau initialisiert werden muss, damit DirectX in deinem Prozess überhaupt erstmal laufen kann, gibts schon so viele Möglichkeiten etwas falsch zu machen...

Auch seh ich grad nicht, wo genau Run Time Dynamic Linking in diesem Zusammenhang irgendeinen echten Vorteil haben sollte...

-Sollte ich bei DirectX 9.0c bleiben? Bald kommt ja DX 11.1, aber sowas wie "Aufwärtskompatibilität" ist ja noch nicht erfunden :D

Wenn du D3D9 bereits beherrscht und Zeit und Lust hast, würd ich dir raten, auf D3D11 umzusteigen. Wenn du mit Shadern fit bist, sollte der Umstieg sehr leicht fallen, in dem Fall wird D3D11 sich einfach nur wie die logische Weiterentwicklung von D3D9 anfühlen, im Prinzip ist es dann genau das, was du dir schon immer gewünscht hast.

Wenn du schon ein bisschen mit D3D9 rumgespielt hast, aber Shadern noch Neuland für dich sind, dann würd ich dir raten, erstmal in D3D9 dem Umgang mit Shadern zu lernen und dann nach D3D11 zu wechseln.


Btw: http://de.wikipedia.org/wiki/Kompatibili…atibilit.C3.A4t ;)

Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von »dot« (12.10.2012, 15:43)


  • »Johannes Schneider« ist der Autor dieses Themas

Beiträge: 103

Beruf: Chemiestudent

  • Private Nachricht senden

3

12.10.2012, 15:46

Ok Danke :D

-DirectX Web Installer mit Installationsdatei mitliefern
-Einfach auf DirectX 9.0c "hoffen", also statisch.

Zitat


Ok, Das hat micht wirklich erstaunt!
"Das Glück des Forschers besteht nicht darin, die Wahrheit zu besitzen, sondern eine Wahrheit zu erringen. Und in diesem fortschreitendem, erfolgreichen Suchen nach der Wahrheit - darin liegt die
eigentliche Befriedigung." Max Planck

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Johannes Schneider« (12.10.2012, 15:51)


Werbeanzeige