Comment faire face à l'enfer D3DX .dll?


16

Il existe un grand nombre de versions de la DLL D3DX, à partir de chaque mise à jour du SDK, chaque version ayant un nom unique ( liste des noms de DLL D3DX ).

Trop souvent, les gens ont des versions manquantes. Ainsi, même s'ils disposent d'une version compatible de DirectX, votre projet basé sur D3D ne fonctionnera pas sur leur machine.

Je veux pouvoir distribuer des jeux (petits projets de loisirs, entrées de jam de jeu, etc.) sous la forme d'un simple fichier zip, sans avoir besoin d'un installateur. Mais un pourcentage important d'utilisateurs se heurtent à des erreurs D3DX .dll manquantes. Et sans programme d'installation, la solution officielle de Microsoft (le programme d'installation / mise à jour Web DirectX) n'est pas vraiment une solution.

Malheureusement, Microsoft ne nous donnera toujours pas la possibilité de créer des liens statiques vers D3DX (ce qui serait une bonne solution propre). Et éviter d'utiliser D3DX n'est pas très pratique, surtout si vous travaillez avec des shaders (et non, je ne passe pas à OpenGL, du moins pour l'instant)

Quelqu'un a-t-il des solutions intelligentes pour éviter cet enfer de DLL?


2
Pourrait obtenir de meilleures réponses de Stack Overflow ( stackoverflow.com ) - même si cela s'applique à vos jeux, c'est vraiment de la programmation. En attendant ... Ne pouvez-vous pas simplement mettre les DLL dans le même dossier que votre exécutable?
Ricket

Hmmm ... serait-ce une idée idiote de revenir à la plus ancienne version possible du SDK DX9 que je puisse obtenir, juste pour réduire ce problème? Semble une façon folle de faire les choses, mais MS a vraiment créé un problème ennuyeux ici. Une autre option tout aussi folle serait de réimplémenter la fonctionnalité D3DX la plus importante à partir de zéro, mais je n'ai pas envie de réinventer le système d'effets ...
bluescrn

Dans les SDKs récents (au temps de l' année dernière , je pense) le sous - système effet a été largement déplacé hors du noyau et D3DX pour SDKs 10+. Vous pouvez le compiler vous-même, en fait - le code est dans le SDK et est redistribuable (tout comme les binaires produits à partir de celui-ci). Il est probablement plus facile de sauvegarder le système pour fonctionner avec 9, et la plupart du reste de D3DX est assez facile à réimplémenter ou à trouver des alternatives.

2
N'utilisez pas d3dx. Ce n'est pas aussi rapide / bon / efficace / cool de toute façon.

Je pourrais transmettre les mathématiques DirectX, le maillage, la texture et les trucs d'aide générale - mais je ne peux pas vraiment abandonner D3DXEffect. Et je suis coincé avec DX9 plus ou moins pour toujours. Et en ce qui me concerne, les DX10 + n'existent pas, car ils n'existent pas sur XP
bluescrn

Réponses:


17

Malheureusement, il n'y a pas de bonne solution légale pour cela, sauf pour faire un programme d'installation, car vos mains sont liées par les droits de distribution qui vous sont accordés par le SDK DirectX, qui fournit les DLL D3DX. Selon les termes du contrat de licence auquel vous êtes lié en utilisant le SDK (qui se trouve dans (SDK Install Directory)/Documentation/License Agreements/vous, vous êtes uniquement autorisé à redistribuer les formes binaires de certains sous-ensembles du SDK, ainsi qu'une partie de l'exemple et du code utilitaire.

Depuis le SDK de juin 2010, vous avez autorisé à redistribuer quoi que ce soit dans le répertoire "Redist" et, ce faisant, vous devez inclure certains composants (DSetup32.dll, DSetup.dll, DXSetup.exe, DXupdate.cab et dxdllreg_x86.cab). Le répertoire Redist inclut les fichiers .cab pour les DLL D3DX, mais pas les DLL elles-mêmes , vous n'avez donc pas de chance.

Il n'est pas très difficile de construire un programme d'installation, heureusement, qui exécute simplement le programme d' installation Web D3DX approprié ou quoi que ce soit quelque chose que vous redistribuez. Les programmes d'installation simples .msi sont tout aussi faciles à utiliser pour un utilisateur (un double-clic est généralement tout ce qui est nécessaire) et peuvent être configurés pour autoriser l'installation dans des répertoires arbitraires, si vous avez des raisons de "polluer" le répertoire Program Files avec ces petits programmes à jeter. La surcharge de la taille de téléchargement d'un programme d'installation correctement configuré peut également être assez petite, de sorte que cela ne devrait pas poser trop de problème.

EDIT: Voici une bonne page sur les choses d'installation DX .

EDIT 2: rayé le bit "web" en réponse à une correction dans les commentaires.


3
Vous n'êtes pas autorisé à redistribuer le programme d'installation Web, pointez-le simplement vers la page microsoft.com (donc pas idéal), et les composants redistribuables sont au minimum de 3 Mo (insignifiants par rapport à la taille d'un `` vrai jeu '', mais pas pour les petits projets de loisirs)
bluescrn

Euh, oui, vous avez raison, j'ai mal parlé du programme d'installation Web.

2

Quatre solutions principales me viennent à l'esprit.

La première consiste à utiliser une ancienne version du SDK DirectX. Je semble me souvenir que les versions du rond-point 2004 ou antérieur étaient liées statiquement (mais si une taille exécutable plus grande vous fait peur, ce ne serait peut-être pas une option), et c'est également le cas que si vous utilisez une version de 2006/2007 ou antérieure, alors la Les DLL D3DX dont vous avez besoin auront beaucoup plus de chances d'être sur la machine. L'inconvénient est que vous manquerez des corrections de bogues, des améliorations de performances et des fonctionnalités améliorées dans les nouveaux SDK (cela exclut également toute version de D3D autre que 9).

La deuxième solution consiste à utiliser LoadLibrary et GetProcAddress sur les fonctions D3DX. Vous choisissez une version prise en charge maximale et minimale (par exemple, de _42 à _34), puis entrez dans une boucle de max à min, construisez le nom de la DLL et essayez de la charger dans la bibliothèque de bibliothèque. Si vous le chargez correctement, vous effectuez ensuite un tas d'appels GetProcAddress et utilisez vos pointeurs de fonction au lieu des fonctions D3DX brutes. Un peu comme les extensions OpenGL, si vous savez de quoi je parle. Celui-ci est potentiellement un peu poilu, et vous devrez peut-être encore faire face au cas où vous ne trouverez aucune DLL dans votre gamme. Mais j'ai utilisé celui-ci dans le passé et cela fonctionne assez bien.

La troisième solution consiste simplement à ne pas utiliser D3DX. Peut être une option dans certains cas, peut-être pas une option dans votre cas.

La quatrième et dernière solution consiste simplement à dire à vos utilisateurs de mettre à niveau leur Direct 3D. Ils devraient vraiment le faire de toute façon, c'est un téléchargement petit et rapide de Microsoft, et c'est un solutionneur de problème instantané. Vos utilisateurs peuvent ne pas aimer avoir à le faire, et vous devrez peut-être répondre à des questions telles que "J'ai déjà le D3D11, pourquoi dois-je mettre à niveau mon D3D9", mais dans l'ensemble, cela peut être plus économique dans l'ensemble à prendre sur le nez.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.