Come affrontare l'inferno D3DX .dll?


16

Esiste un gran numero di versioni della DLL D3DX, da ogni aggiornamento SDK, ogni versione con un nome univoco ( elenco di nomi DLL D3DX ).

Troppo spesso alle persone mancano le versioni. Quindi, anche se hanno una versione compatibile di DirectX, il tuo progetto basato su D3D non verrà eseguito sul loro computer.

Voglio essere in grado di distribuire i giochi (piccoli progetti per il tempo libero, voci di inceppamento dei giochi, ecc.) Come un semplice file zip, senza la necessità di un programma di installazione. Ma una percentuale significativa di utenti si imbatte in errori D3DX .dll mancanti. E senza un programma di installazione, la soluzione ufficiale di Microsoft (il programma di installazione / aggiornamento Web di DirectX) non è proprio una soluzione.

Sfortunatamente, Microsoft non ci darà ancora l'opzione di collegamento statico a D3DX (che sarebbe una bella soluzione pulita). E evitare di usare D3DX non è molto pratico, specialmente se stai lavorando con shader (e no, non sto passando a OpenGL, almeno per ora)

Qualcuno ha soluzioni intelligenti per evitare questo inferno DLL?


2
Potrebbe ottenere risposte migliori da Stack Overflow ( stackoverflow.com ) - anche se questo vale per i tuoi giochi è davvero programmazione. Nel frattempo ... Non puoi semplicemente mettere le DLL nella stessa cartella del tuo eseguibile?
Ricket,

Hmmm ... sarebbe una stupida idea tornare alla più vecchia versione possibile dell'SDK DX9 che posso ottenere, solo per ridurre questo problema? Sembra un modo folle di fare le cose, ma MS ha davvero creato un fastidioso problema qui. Un'altra opzione altrettanto folle sarebbe quella di reimplementare da zero la più importante funzionalità D3DX, ma non mi piace reinventare il sistema di effetti ...
bluescrn,

Nei recenti SDK (da qualche tempo lo scorso anno penso) il sottosistema effetto è stato in gran parte spostato dal core e dagli SDK D3DX per 10+. Puoi compilarlo da solo, infatti - il codice si trova nell'SDK ed è ridistribuibile (così come i binari prodotti da esso). Probabilmente è più facile eseguire il back port del sistema per funzionare con 9, e la maggior parte del resto di D3DX è abbastanza facile da implementare o trovare alternative per.

2
Non usare d3dx. Non è altrettanto veloce / buono / efficiente / freddo comunque.

Potrei trasmettere la matematica di DirectX, mesh, texture e cose generali di supporto, ma non posso davvero rinunciare a D3DXEffect. E sono bloccato con DX9 più o meno per sempre. E per quanto mi riguarda, DX10 + non esiste, perché non esistono su XP
bluescrn

Risposte:


17

Sfortunatamente, non esiste una buona soluzione legale per questo se non quella di creare un programma di installazione, perché le tue mani sono legate dai diritti di distribuzione concessi dall'SDK di DirectX, che fornisce le DLL D3DX. In base ai termini dell'accordo di licenza, l'utente è tenuto a utilizzare l'SDK (che si trova in(SDK Install Directory)/Documentation/License Agreements/ te è autorizzato a ridistribuire solo le forme binarie di alcuni sottoinsiemi dell'SDK, insieme ad alcuni dei codici di esempio e di utilità.

A partire dall'SDK di giugno 2010, hai permesso di ridistribuire qualsiasi cosa nella directory "Redist" e, nel farlo, devi includere alcuni componenti (DSetup32.dll, DSetup.dll, DXSetup.exe, DXupdate.cab e dxdllreg_x86.cab). La directory Redist include i file .cab per le DLL D3DX, ma non le DLL stesse, quindi sei sfortunato.

Non è terribilmente difficile per costruire un programma di installazione, per fortuna, che esegue semplicemente il D3DX appropriata web installer o roba del genere, che è qualcosa che ridistribuisci. I semplici programmi di installazione .msi sono altrettanto facili da usare per un utente (il doppio clic è generalmente tutto ciò che è necessario) e può essere configurato per consentire l'installazione in directory arbitrarie, se si è preoccupati per qualche motivo di "inquinare" la directory dei file di programma con questi piccoli programmi usa e getta. Anche l'overhead nella dimensione del download di un programma di installazione configurato in modo appropriato può essere piuttosto piccolo, quindi non dovrebbe essere un problema.

EDIT: Ecco una buona pagina su cose di installazione DX .

EDIT 2: barrato il bit "web" in risposta a una correzione nei commenti.


3
Non ti è permesso ridistribuire il programma di installazione web, basta puntarli alla pagina microsoft.com (quindi non ideale), E i componenti ridistribuibili sono un minimo di 3 Mb (insignificanti rispetto alle dimensioni di un "gioco reale", ma non per piccoli progetti per il tempo libero)
bluescrn,

Ehm, sì, hai ragione, ho sbagliato a parlare dell'installatore web.

2

Mi vengono in mente quattro soluzioni principali.

Il primo è utilizzare una versione precedente di DirectX SDK. Mi sembra di ricordare che le versioni della rotonda 2004 o precedenti erano collegate staticamente (ma se una dimensione eseguibile più grande ti spaventa che potrebbe non essere un'opzione), ed è anche il caso che se usi una versione del 2006/2007 o precedente, allora il Le DLL D3DX di cui hai bisogno avranno molte più probabilità di essere sulla macchina. L'aspetto negativo di questo è che ti perderai bugfix, miglioramenti delle prestazioni e funzionalità migliorata nei nuovi SDK (esclude anche qualsiasi versione di D3D diversa da 9).

La seconda soluzione è utilizzare LoadLibrary e GetProcAddress sulle funzioni D3DX. Scegli una versione supportata massima e minima (ad esempio, da _42 a _34), quindi vai in un ciclo da massimo a minimo, costruisci il nome DLL e tenti di caricarlo. Se lo carichi OK, esegui un sacco di chiamate GetProcAddress e usi i puntatori a funzione anziché le funzioni D3DX non elaborate. Un po 'come le estensioni di OpenGL, se sai di cosa sto parlando. Questo è potenzialmente un po 'peloso e potresti ancora avere a che fare con il caso in cui non riesci a trovare alcuna DLL nel tuo intervallo. Ma l'ho usato in passato e funziona abbastanza bene.

La terza soluzione è semplicemente non usare D3DX. Potrebbe essere un'opzione in alcuni casi, potrebbe non essere un'opzione nel tuo caso.

La quarta e ultima soluzione è semplicemente dire ai tuoi utenti di aggiornare il loro Direct 3D. Dovrebbero davvero farlo comunque, è un download piccolo e veloce da Microsoft ed è un risolutore di problemi istantaneo. Ai tuoi utenti potrebbe non piacere dover farlo, e potresti dover affrontare domande come "Ho già D3D11, perché devo aggiornare il mio D3D9", ma a conti fatti potrebbe risultare complessivamente più economico da prendere sul naso.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.