D3DX .dll hellの対処方法


16

各SDK更新から、多数のバージョンのD3DX dllがあり、各バージョンには一意の名前(D3DX dll名のリスト)があります。

多くの場合、人々にはバージョンがありません。そのため、DirectXと互換性のあるバージョンを使用している場合でも、D3Dベースのプロジェクトは彼らのマシンでは実行されません。

インストーラーを必要とせずに、ゲーム(小さな空き時間のプロジェクト、ゲームジャムエントリなど)を単純なzipファイルとして配布できるようにしたいと思います。ただし、かなりの割合のユーザーが、D3DX .dllエラーを検出できません。そして、インストーラーがなければ、Microsoftの公式ソリューション(DirectX Webインストーラー/アップデーター)は、実際にはあまりソリューションではありません。

残念ながら、MicrosoftはまだD3DXへの静的リンクのオプションを提供していません(これはすてきなクリーンソリューションです)。D3DXの使用を避けることは、特にシェーダーを使用している場合はあまり実用的ではありません(少なくとも、現時点ではOpenGLに切り替えていません)

誰もこのDLLの地獄を回避する賢い解決策を持っていますか?


2
Stack Overflow(stackoverflow.com)からより良い応答が得られる場合があります-これはゲームに当てはまりますが、実際にはプログラミングです。とりあえず... DLLを実行可能ファイルと同じフォルダーに入れるだけではいけませんか?
リケット

うーん...この問題を軽減するために、入手できる最も古いDX9 SDKバージョンに戻すのは馬鹿げた考えでしょうか?物事を行うクレイジーな方法のように見えますが、MSは本当にここで迷惑な問題を作成しました。別の同様にクレイジーなオプションは、最も重要なD3DX機能をゼロから再実装することですが、エフェクトシステムを再発明するのは好きではありません
...-bluescrn

最近のSDK(昨年のある時点で)で、エフェクトサブシステムは主に10+のコアおよびD3DX SDK から移動しました。実際、自分でコンパイルできます。コードはSDKにあり、再配布可能です(それから生成されるバイナリも同様です)。おそらく、9で動作するようにシステムをバックポーティングする方が簡単であり、D3DXの残りのほとんどは、再実装または代替の検索が非常に簡単です。

2
d3dxを使用しないでください。とにかく、それほど速く/良い/効率的/クールではありません。

DirectXの数学、メッシュ、テクスチャ、および一般的なヘルパーを渡すことができましたが、実際にD3DXEffectを放棄することはできません。そして、私はいつまでもDX9にこだわっています。そして、私に関する限り、XP10には存在しないため、DX10 +は存在しません
bluescrn

回答:


17

残念ながら、D3DX DLLを提供するDirectX SDKによって付与された配布権に手が縛られているため、インストーラーを作成することを除いて、これに対する適切な法的解決策はありません。SDKを使用することにより、使用許諾契約の条項に拘束されます((SDK Install Directory)/Documentation/License Agreements/SDKは、一部のサンプルおよびユーティリティコードとともに、SDKの特定のサブセットのバイナリ形式のみを再配布することが許可されています)。

2010年6月SDKの時点で、「Redist」ディレクトリ内のすべてを再配布できるようになりました。その際、特定のコンポーネント(DSetup32.dll、DSetup.dll、DXSetup.exe、DXupdate.cab、dxdllreg_x86.cab)を含める必要があります。RedistディレクトリにはD3DX DLLの.cabファイルが含まれていますが、DLL自体は含まれていないため、運が悪いです。

ちょうど適切なD3DXの実行されることを、幸い、インストーラを構築するためにひどく難しいことではありませんウェブインストーラやその他もろもろであるあなたが再配布何かを。シンプルな.msiインストーラーは、ユーザーが使用するのと同じくらい簡単です(ダブルクリックで一般に必要なのはすべてです)。これらの小さな使い捨てプログラム。適切に構成されたインストーラーのダウンロードサイズのオーバーヘッドも非常に小さいため、それほど大きな問題にはなりません。

編集:ここにDXインストールのものに関する良いページがあります

編集2:コメントの修正に応じて「ウェブ」ビットを取り消します。


3
Webインストーラーを再配布することは許可されておらず、microsoft.comページにポイントするだけで(理想的ではありません)、再配布可能なコンポーネントは最小で3Mbです(「実際のゲーム」のサイズと比較して重要ではありませんが、少し暇なプロジェクトの場合)
-bluescrn

えー、うん、あなたは正しい、私はWebインストーラーについて誤解しています。

2

4つの主なソリューションが思い浮かびます。

1つは、古いバージョンのDirectX SDKを使用することです。2004年以前のラウンドアバウトのバージョンは静的にリンクされていたことを覚えているようです(ただし、実行可能ファイルのサイズが大きい場合はオプションではない可能性があります)、2006/2007以前のバージョンを使用する場合必要なD3DX DLLは、マシン上にいる可能性がはるかに高くなります。これの欠点は、新しいSDKのバグ修正、パフォーマンスの強化、および機能の改善を見逃すことです(9以外のD3Dのバージョンも除外されます)。

2番目の解決策は、D3DX関数でLoadLibraryとGetProcAddressを使用することです。サポートされている最大および最小バージョン(たとえば、_42から_34)を選択し、maxからminのループに入り、DLL名を作成し、LoadLibraryを試行します。OKをロードしたら、多数のGetProcAddress呼び出しを実行し、生のD3DX関数の代わりに関数ポインターを使用します。私が話していることを知っているなら、OpenGL拡張のようなものです。これは潜在的に少し複雑で、範囲内でDLLが見つからない場合に対処する必要があります。しかし、私は過去にこれを使用しており、十分に機能しています。

3番目の解決策は、D3DXを使用しないことです。場合によってはオプションかもしれませんが、あなたの場合はオプションではないかもしれません。

4番目の最終的な解決策は、Direct 3Dをアップグレードするようユーザーに伝えることです。とにかく彼らは本当にこれをしているはずです、それはMicrosoftからの小さくて速いダウンロードであり、それは即座の問題解決者です。ユーザーはそうすることを好まないかもしれず、「D3D11をすでに持っているのに、なぜD3D9をアップグレードする必要があるのか​​」などの質問に対処しなければならないかもしれません鼻の上に。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.