Como lidar com D3DX .dll inferno?

16

Há um grande número de versões da DLL do D3DX, de cada atualização do SDK, cada versão com um nome exclusivo ( lista de nomes de DLL do D3DX ).

Com muita freqüência, as pessoas têm versões ausentes. Portanto, mesmo que eles tenham uma versão compatível do DirectX, seu projeto baseado em D3D não será executado na máquina.

Quero poder distribuir jogos (pequenos projetos de tempo livre, entradas de congestionamento de jogos, etc.) como um arquivo zip simples, sem a necessidade de um instalador. Mas uma porcentagem significativa de usuários encontra erros .dll ausentes do D3DX. E sem um instalador, a solução oficial da Microsoft (o instalador / atualizador de web DirectX) não é realmente uma solução.

Infelizmente, a Microsoft ainda não nos oferece a opção de vincular estática ao D3DX (o que seria uma boa solução limpa). E evitar o uso do D3DX não é muito prático, especialmente se você estiver trabalhando com shaders (e não, não vou mudar para o OpenGL, pelo menos por enquanto)

Alguém tem soluções inteligentes para evitar esse inferno DLL?

bluescrn
fonte
2
Pode obter melhores respostas do Stack Overflow ( stackoverflow.com ) - mesmo que isso se aplique aos seus jogos, é realmente uma programação. Enquanto isso ... Você não pode simplesmente colocar as DLLs na mesma pasta do seu executável?
Ricket 29/01
Hmmm ... seria uma idéia tola reverter para a versão mais antiga possível do DX9 SDK da qual posso me apossar, apenas para reduzir esse problema? Parece uma maneira louca de fazer as coisas, mas a MS realmente criou um problema irritante aqui. Outra opção igualmente louco seria para voltar a implementar a funcionalidade D3DX mais importante a partir do zero, mas eu não gosta de re-inventar o sistema Effects ...
bluescrn
Nos SDKs recentes (acho que há algum tempo no ano passado), o subsistema de efeitos foi largamente retirado do núcleo e os SDKs do D3DX para 10+. De fato, você pode compilar - o código está no SDK e é redistribuível (assim como os binários produzidos a partir dele). Provavelmente é mais fácil fazer o back-port do sistema para trabalhar com o 9, e a maioria do restante do D3DX é muito fácil de reimplementar ou encontrar alternativas.
2
Não use d3dx. Não é tão rápido / bom / eficiente / legal de qualquer maneira.
Eu poderia passar o material matemático, a malha, a textura e o material auxiliar do DirectX - mas não consigo desistir do D3DXEffect. E eu estou preso com o DX9 mais ou menos para sempre. E, no que me diz respeito, o DX10 + não existe, porque não existe no XP
bluescrn

Respostas:

17

Infelizmente, não há uma solução legal e legal para isso, exceto para fazer um instalador, porque suas mãos estão atadas aos direitos de distribuição concedidos a você pelo DirectX SDK, que fornece as DLLs do D3DX. Sob os termos do contrato de licença a que você está sujeito, usando o SDK (que está localizado em (SDK Install Directory)/Documentation/License Agreements/você, é permitido redistribuir apenas as formas binárias de certos subconjuntos do SDK, juntamente com alguns dos códigos de exemplo e utilitário.

A partir do SDK de junho de 2010, você permitia redistribuir qualquer coisa no diretório "Redist" e, ao fazer isso, deve incluir certos componentes (DSetup32.dll, DSetup.dll, DXSetup.exe, DXupdate.cab e dxdllreg_x86.cab). O diretório Redist inclui os arquivos .cab para as DLLs do D3DX, mas não as próprias DLLs, para que você não tenha sorte.

Não é terrivelmente difícil construir um instalador, felizmente, que apenas executa o D3DX apropriado web instalador ou outros enfeites que é algo que você redistribuir. Os instaladores .msi simples são igualmente fáceis de usar (basta clicar duas vezes em geral) e podem ser configurados para permitir a instalação em diretórios arbitrários, se você estiver preocupado, por algum motivo, em "poluir" o diretório Arquivos de Programas com esses pequenos programas descartáveis. A sobrecarga no tamanho do download de um instalador configurado adequadamente também pode ser bem pequena, portanto, isso não deve ser um problema.

EDIT: Aqui está uma boa página sobre o material de instalação do DX .

EDIT 2: Riscado o bit "web" em resposta a uma correção nos comentários.


fonte
3
Você não tem permissão para redistribuir o instalador da web, apenas aponte-o para a página microsoft.com (portanto, não é o ideal). E os componentes redistribuíveis são de no mínimo 3Mb (insignificante em comparação ao tamanho de um 'jogo real', mas não para pequenos projetos de tempo livre)
bluescrn
Sim, você está certo, eu falo sobre o instalador da web.
2

Quatro soluções principais vêm à mente.

O primeiro é usar uma versão mais antiga do DirectX SDK. Parece que me lembro que as versões da rotatória 2004 ou anterior estavam vinculadas estaticamente (mas se um tamanho executável maior o assusta, isso pode não ser uma opção), e também é o caso que se você usar uma versão de 2006/2007 ou anterior, o As DLLs D3DX necessárias precisam de uma chance muito maior de estar na máquina. A desvantagem disso é que você perderá correções de bugs, aprimoramentos de desempenho e funcionalidade aprimorada nos SDKs mais recentes (ele também descarta qualquer versão do D3D que não seja 9).

A segunda solução é usar o LoadLibrary e o GetProcAddress nas funções do D3DX. Você escolhe uma versão máxima e mínima suportada (por exemplo, de _42 a _34), depois faz um loop de max para min, constrói o nome da DLL e tenta carregá-lo. Se você carregar OK, faça várias chamadas GetProcAddress e use os ponteiros de função em vez das funções brutas do D3DX. Como extensões OpenGL, se você sabe do que estou falando. Esse é potencialmente um pouco cabeludo, e talvez você ainda precise lidar com o caso em que não consegue encontrar nenhuma DLL no seu intervalo. Mas eu usei este no passado e funciona bem o suficiente.

Terceira solução é simplesmente não usar o D3DX. Pode ser uma opção em alguns casos, pode não ser uma opção no seu caso.

A quarta e última solução é apenas dizer aos usuários para atualizarem o Direct 3D. Eles realmente deveriam fazer isso de qualquer maneira, é um download pequeno e rápido da Microsoft e um solucionador de problemas instantâneo. Seus usuários podem não gostar disso, e você pode ter que lidar com perguntas como "Eu já tenho o D3D11, por que preciso atualizar o meu D3D9"? no nariz.

Maximus Minimus
fonte