¿Cómo lidiar con D3DX .dll hell?

16

Hay una gran cantidad de versiones de D3DX dll, de cada actualización de SDK, cada versión tiene un nombre único ( lista de nombres de d3DX dll ).

Con demasiada frecuencia, a las personas les faltan versiones. Entonces, a pesar de que tienen una versión compatible de DirectX, su proyecto basado en D3D no se ejecutará en su máquina.

Quiero poder distribuir juegos (pequeños proyectos de tiempo libre, entradas de juegos, etc.) como un simple archivo zip, sin la necesidad de un instalador. Pero un porcentaje significativo de usuarios se topa con errores de D3DX .dll que faltan. Y sin un instalador, la solución oficial de Microsoft (el instalador / actualizador web DirectX) no es realmente una solución.

Desafortunadamente, Microsoft aún no nos dará la opción de vinculación estática a D3DX (lo que sería una buena solución limpia). Y evitar usar D3DX no es muy práctico, especialmente si está trabajando con sombreadores (y no, no voy a cambiar a OpenGL, al menos por ahora)

¿Alguien tiene soluciones inteligentes para evitar este infierno de DLL?

bluescrn
fuente
2
Podría obtener mejores respuestas de Stack Overflow ( stackoverflow.com ), aunque esto se aplica a sus juegos, realmente es programación. Mientras tanto ... ¿No puede simplemente colocar las DLL en la misma carpeta que su ejecutable?
Ricket
Hmmm ... ¿sería una idea tonta volver a la versión de SDK DX9 más antigua posible que pueda obtener, solo para reducir este problema? Parece una forma loca de hacer las cosas, pero MS realmente ha creado un problema molesto aquí. Otra opción igual de loco sería volver a implementar la funcionalidad D3DX más importante desde el principio, pero no te gusta reinventar el sistema de Efectos ...
bluescrn
En los últimos SDK (a partir de algún tiempo el año pasado creo) el subsistema efecto se trasladó en gran medida fuera del núcleo y D3DX SDK para 10+. Puede compilarlo usted mismo, de hecho, el código está en el SDK y es redistribuible (al igual que los binarios producidos a partir de él). Probablemente sea más fácil hacer una copia de respaldo del sistema para que funcione con 9, y la mayoría del resto de D3DX es bastante fácil de volver a implementar o encontrar alternativas.
2
No uses d3dx. No es tan rápido / bueno / eficiente / genial de todos modos.
Podría transmitir las matemáticas DirectX, la malla, la textura y el material auxiliar general, pero realmente no puedo renunciar al efecto D3DXEffect. Y estoy atrapado con DX9 más o menos para siempre. Y en lo que a mí respecta, DX10 + no existe, porque no existen en XP
bluescrn

Respuestas:

17

Desafortunadamente, no hay una buena solución legal para esto, excepto hacer un instalador, porque sus manos están atadas por los derechos de distribución que le otorga el SDK de DirectX, que proporciona las DLL de D3DX. Según los términos del acuerdo de licencia al que está obligado a utilizar el SDK (que se encuentra en (SDK Install Directory)/Documentation/License Agreements/usted, solo se le permite redistribuir las formas binarias de ciertos subconjuntos del SDK, junto con algunos de los códigos de muestra y utilidad.

A partir del SDK de junio de 2010, usted permitió redistribuir cualquier cosa en el directorio "Redist" y al hacerlo debe incluir ciertos componentes (DSetup32.dll, DSetup.dll, DXSetup.exe, DXupdate.cab y dxdllreg_x86.cab). El directorio Redist incluye los archivos .cab para las DLL D3DX, pero no las DLL en sí, por lo que no tiene suerte.

Afortunadamente, no es terriblemente difícil construir un instalador que solo ejecute el instalador web D3DX apropiado o no, eso es algo que redistribuye. Los instaladores .msi simples son igual de fáciles de usar para un usuario (generalmente, hacer doble clic es todo lo que se necesita) y se pueden configurar para permitir la instalación en directorios arbitrarios, si le preocupa por alguna razón "contaminar" el directorio de Archivos de programa con estos pequeños programas descartables. La sobrecarga en el tamaño de descarga de un instalador configurado adecuadamente también puede ser bastante pequeña, por lo que no debería ser un gran problema.

EDITAR: Aquí hay una buena página sobre cosas de instalación de DX .

EDIT 2: eliminó el bit "web" en respuesta a una corrección en los comentarios.


fuente
3
No se le permite redistribuir el instalador web, solo apúntelos a la página microsoft.com (por lo que no es ideal), y los componentes redistribuibles son un mínimo de 3Mb (insignificante en comparación con el tamaño de un "juego real", pero no para pequeños proyectos de tiempo libre)
bluescrn
Sí, tienes razón, hablo mal sobre el instalador web.
2

Se me ocurren cuatro soluciones principales.

El primero es usar una versión anterior del DirectX SDK. Me parece recordar que las versiones de la rotonda 2004 o anteriores estaban vinculadas estáticamente (pero si un tamaño ejecutable más grande te asusta, eso podría no ser una opción), y también es el caso de que si utilizas una versión de 2006/2007 o anterior, entonces Las DLL de D3DX que necesita tendrán muchas más posibilidades de estar en la máquina. La desventaja de esto es que se perderán las correcciones de errores, las mejoras de rendimiento y la funcionalidad mejorada en los SDK más nuevos (también descarta cualquier versión de D3D que no sea la 9).

La segunda solución es usar LoadLibrary y GetProcAddress en las funciones D3DX. Elige una versión compatible máxima y mínima (por ejemplo, de _42 a _34), luego entra en un ciclo de máximo a mínimo, construye el nombre de la DLL e intenta cargarlo en la biblioteca. Si lo carga bien, entonces hace un montón de llamadas GetProcAddress y usa sus punteros de función en lugar de las funciones D3DX sin procesar. Algo así como las extensiones de OpenGL, si sabes de lo que estoy hablando. Este es potencialmente un poco complicado, y es posible que aún tenga que lidiar con el caso en el que no puede encontrar ninguna DLL en su rango. Pero he usado este en el pasado y funciona bastante bien.

La tercera solución es simplemente no usar D3DX. Puede ser una opción en algunos casos, podría no ser una opción en su caso.

La cuarta y última solución es decirles a sus usuarios que actualicen su Direct 3D. Realmente deberían estar haciendo esto de todos modos, es una descarga pequeña y rápida de Microsoft, y es un solucionador de problemas instantáneo. Es posible que a sus usuarios no les guste tener que hacerlo, y es posible que tenga que lidiar con preguntas como "Ya tengo D3D11, ¿por qué necesito actualizar mi D3D9", pero a fin de cuentas puede resultar más económico en general? en la nariz

Maximus Minimus
fuente