Wie mit D3DX .dll Hölle umgehen?

16

Es gibt eine große Anzahl von Versionen der D3DX-DLL, von jedem SDK-Update, wobei jede Version einen eindeutigen Namen hat ( Liste der D3DX-DLL-Namen ).

Nur allzu oft fehlen Versionen. Obwohl sie eine kompatible Version von DirectX haben, kann Ihr D3D-basiertes Projekt nicht auf ihrem Computer ausgeführt werden.

Ich möchte Spiele (kleine Freizeitprojekte, Spiele-Jam-Einträge usw.) als einfache Zip-Datei verteilen können, ohne dass ein Installer erforderlich ist. Bei einem erheblichen Prozentsatz der Benutzer fehlen jedoch die DLL-Fehler für D3DX. Und ohne einen Installer ist die offizielle Lösung von Microsoft (der DirectX-Web-Installer / Updater) keine wirkliche Lösung.

Leider gibt uns Microsoft immer noch nicht die Möglichkeit, statisch auf D3DX zu verlinken (was eine schöne, saubere Lösung wäre). Das Vermeiden von D3DX ist nicht sehr praktisch, besonders wenn Sie mit Shadern arbeiten (und nein, ich wechsle zumindest vorerst nicht zu OpenGL).

Hat jemand clevere Lösungen, um diese DLL-Hölle zu vermeiden?

Bluescrn
quelle
2
Möglicherweise erhalten Sie bessere Antworten von Stack Overflow ( stackoverflow.com ) - obwohl dies für Ihre Spiele gilt, ist es wirklich programmiert. In der Zwischenzeit ... Können Sie die DLLs nicht einfach im selben Ordner wie Ihre ausführbare Datei ablegen?
Ricket
Hmmm ... wäre es eine blöde Idee, zur ältesten möglichen DX9 SDK-Version zurückzukehren, die ich bekommen kann, nur um dieses Problem zu reduzieren? Scheint eine verrückte Art, Dinge zu tun, aber MS hat hier wirklich ein ärgerliches Problem geschaffen. Eine andere ebenso verrückte Option wäre, die wichtigsten D3DX-Funktionen von Grund auf neu zu implementieren, aber ich hätte keine Lust, das
Effektsystem
In den jüngsten SDKs ( meines Erachtens seit einiger Zeit im letzten Jahr) wurde das Effekt-Subsystem für 10+ weitgehend aus den Kern- und D3DX-SDKs herausgenommen. Sie können es sogar selbst kompilieren - der Code befindet sich im SDK und ist weitervertreibbar (ebenso wie die daraus erstellten Binärdateien). Es ist wahrscheinlich einfacher, das System für die Arbeit mit 9 zurückzuspielen, und der Rest von D3DX ist ziemlich einfach zu reimplementieren oder Alternativen zu finden.
2
Benutze kein d3dx. Es ist sowieso nicht annähernd so schnell / gut / effizient / cool.
Ich könnte DirectX-Mathematik, Mesh, Textur und allgemeine Hilfsmittel weitergeben, kann aber D3DXEffect nicht wirklich aufgeben. Und ich bin mehr oder weniger ewig mit DX9 beschäftigt. Und meiner Meinung nach gibt es DX10 + nicht, weil es sie auf XP nicht gibt
Bluescrn 30.01.11

Antworten:

17

Leider gibt es keine gute legale Lösung dafür, außer ein Installationsprogramm zu erstellen, da Ihre Hände von den Distributionsrechten gebunden sind, die Ihnen vom DirectX SDK gewährt werden, das die D3DX-DLLs bereitstellt. Gemäß den Bedingungen der Lizenzvereinbarung sind Sie an die Verwendung des SDK gebunden (das sich in (SDK Install Directory)/Documentation/License Agreements/Ihnen befindet, darf nur die binären Formen bestimmter Teilmengen des SDK zusammen mit einem Teil des Beispiel- und Dienstprogrammcodes weitergeben.

Seit dem SDK vom Juni 2010 dürfen Sie alles im Verzeichnis "Redist" neu verteilen und müssen dabei bestimmte Komponenten (DSetup32.dll, DSetup.dll, DXSetup.exe, DXupdate.cab und dxdllreg_x86.cab) einbeziehen. Das Redist-Verzeichnis enthält die CAB-Dateien für die D3DX-DLLs, jedoch nicht die DLLs selbst, sodass Sie Pech haben.

Es ist zum Glück nicht allzu schwer, ein Installationsprogramm zu erstellen, das nur das entsprechende D3DX - Webinstallationsprogramm ausführt, oder etwas, das Sie weitergeben. Einfache MSI-Installationsprogramme sind für einen Benutzer genauso einfach zu verwenden (Doppelklicken ist im Allgemeinen alles, was erforderlich ist) und können so konfiguriert werden, dass sie die Installation in beliebigen Verzeichnissen ermöglichen, wenn Sie aus irgendeinem Grund Bedenken haben, das Programmdateiverzeichnis mit zu "verschmutzen" diese kleinen Wegwerfprogramme. Der Overhead bei der Download-Größe eines entsprechend konfigurierten Installationsprogramms kann ebenfalls recht gering sein, sodass dies kein allzu großes Problem darstellen sollte.

BEARBEITEN: Hier ist eine gute Seite über DX-Installationsmaterial .

EDIT 2: Das "Web" -Bit wurde als Reaktion auf eine Korrektur in den Kommentaren durchgestrichen.


quelle
3
Sie dürfen das Web-Installationsprogramm nicht weitergeben, sondern nur auf die microsoft.com-Seite verweisen (nicht ideal). Die weiterverteilbaren Komponenten müssen mindestens 3 MB groß sein (im Vergleich zur Größe eines "echten Spiels" unbedeutend) für kleine Freizeitprojekte)
Bluescrn
Ähm, ja, du hast recht, ich habe mich über den Web-Installer vertippt.
2

Es fallen mir vier Hauptlösungen ein.

Zunächst muss eine ältere Version des DirectX-SDK verwendet werden. Ich scheine mich zu erinnern, dass Versionen von Roundabout 2004 oder früher statisch verknüpft waren (aber wenn eine größere ausführbare Datei Sie erschreckt, ist dies möglicherweise keine Option), und es ist auch der Fall, dass Sie eine Version von 2006/2007 oder früher als die verwenden Benötigte D3DX-DLLs haben eine viel höhere Chance, auf dem Computer zu sein. Dies hat den Nachteil, dass Sie Bugfixes, Leistungsverbesserungen und verbesserte Funktionen in den neueren SDKs verpassen werden (dies schließt auch jede andere Version von D3D als 9 aus).

Die zweite Lösung besteht darin, LoadLibrary und GetProcAddress für die D3DX-Funktionen zu verwenden. Sie wählen eine maximal und minimal unterstützte Version aus (z. B. von _42 bis _34), gehen dann in eine Schleife von max nach min, konstruieren den DLL-Namen und versuchen, ihn mit LoadLibrary zu laden. Wenn Sie es in Ordnung laden, führen Sie eine Reihe von GetProcAddress-Aufrufen durch und verwenden Ihre Funktionszeiger anstelle der unformatierten D3DX-Funktionen. Ein bisschen wie OpenGL-Erweiterungen, wenn Sie wissen, wovon ich spreche. Dies ist möglicherweise ein wenig haarig, und Sie müssen sich möglicherweise noch mit dem Fall befassen, in dem Sie keine DLL in Ihrem Bereich finden können. Aber ich habe dieses in der Vergangenheit benutzt und es funktioniert gut genug.

Die dritte Lösung ist, D3DX einfach nicht zu verwenden. Könnte in einigen Fällen eine Option sein, in Ihrem Fall möglicherweise keine Option.

Die vierte und letzte Lösung besteht darin, Ihre Benutzer anzuweisen, ihr Direct 3D-System zu aktualisieren. Sie sollten das auf jeden Fall tun, es ist ein kleiner und schneller Download von Microsoft und es ist ein sofortiger Problemlöser. Ihre Benutzer möchten dies möglicherweise nicht tun, und Sie müssen sich möglicherweise mit Fragen wie "Ich habe bereits D3D11, warum muss ich mein D3D9 aktualisieren" befassen, aber unter dem Strich kann es insgesamt wirtschaftlicher sein es auf der Nase.

Maximus Minimus
quelle