如何处理D3DX .dll地狱?


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与可执行文件放在同一文件夹中?
Ricket

嗯...还原到我能掌握的最古老的DX9 SDK版本,只是为了减少这个问题,这是一个愚蠢的主意吗?似乎是一种疯狂的处理方式,但是MS确实在这里制造了一个令人讨厌的问题。另一个同样疯狂的选​​择是从头开始重新实现最重要的D3DX功能,但我不希望重新发明Effects系统...
bluescrn 2011年

在最近的SDK中(我认为是去年的某个时候),效果子系统在很大程度上已经核心和D3DX SDK中移出 10多个版本。实际上,您可以自己编译它-代码在SDK中,并且可以重新分发(由此产生的二进制文件也是如此)。向后移植系统使其可以与9一起使用可能更容易,而大多数D3DX的其余部分很容易重新实现或寻找替代方案。

2
不要使用d3dx。无论如何,它不如快速/良好/高效/酷。

我可以传递DirectX的数学,网格,纹理和常规帮助程序的内容-但不能真正放弃D3DXEffect。而且我或多或少地被DX9所困扰。就我而言,DX10 +不存在,因为它们在XP上不存在
bluescrn 2011年

Answers:


17

不幸的是,除了制作安装程序外,没有很好的合法解决方案,因为您的双手受到DirectX SDK授予的分发权的束缚,后者提供D3DX DLL。根据许可协议的条款,您必须使用SDK(必须位于其中的SDK才能绑定到该SDK),该SDK (SDK Install Directory)/Documentation/License Agreements/仅允许重新分发SDK某些子集的二进制形式以及一些示例代码和实用程序代码。

从2010年6月版SDK开始,您允许重新分发“ Redist”目录中的所有内容,并且这样做时,您必须包括某些组件(DSetup32.dll,DSetup.dll,DXSetup.exe,DXupdate.cab和dxdllreg_x86.cab)。Redist目录包含D3DX DLL的.cab文件,但不包含DLL本身,因此您很不走运。

它是不是非常努力建立一个安装程序,幸运的是,只运行适当的D3DX 网络安装程序或诸如此类的东西那什么你重新分配。简单的.msi安装程序使用户易于使用(通常只需要双击即可),并且可以配置为允许安装到任意目录中,如果您出于某种原因担心“污染” Program Files目录这些小的一次性程序。适当配置的安装程序的下载大小的开销也可能非常小,因此应该不会有太大问题。

编辑:这是有关DX安装资料的好页面

编辑2:响应评论中的更正,删除了“ web”位。


3
您不允许重新分发Web安装程序,只需将它们指向microsoft.com页面即可(因此不理想),并且可重新分发的组件至少为3Mb(与“真实游戏”的大小相比微不足道,但不是)适用于少量的业余时间项目)
bluescrn 2011年

嗯,是的,我是对Web安装程序的误解。

2

想到了四个主要解决方案。

第一个是使用DirectX SDK的旧版本。我似乎记得2004年以前的回旋版本是静态链接的(但是,如果较大的可执行文件使您感到恐惧,那可能不是一个选择),并且如果您使用的是2006/2007年或更早的版本,您需要的D3DX DLL在计算机上的机会更大。缺点是您会错过较新的SDK中的错误修正,性能增强和改进的功能(它还会排除9以外的任何D3D版本)。

第二种解决方案是在D3DX函数上使用LoadLibrary和GetProcAddress。选择一个支持的最大和最小版本(例如,从_42到_34),然后进入从最大到最小的循环,构造DLL名称,然后尝试对其进行LoadLibrary。如果加载成功,则执行一堆GetProcAddress调用,并使用函数指针而不是原始D3DX函数。如果您知道我在说什么,就有点像OpenGL扩展。这可能有点麻烦,并且您可能仍要处理在您的范围内找不到任何DLL的情况。但是我过去曾经使用过它,并且效果很好。

第三种解决方案是不使用D3DX。在某些情况下可能是一个选择,在您的情况下可能不是一个选择。

第四个也是最后一个解决方案是仅告诉您的用户升级他们的Direct 3D。无论如何,他们确实应该这样做,这是Microsoft的一个很小而又快速的下载,它是一个即时的问题解决者。您的用户可能不喜欢这样做,您可能不得不处理诸如“我已经拥有D3D11,为什么需要升级D3D9”之类的问题,但总的来说,这样做可能更经济它在鼻子上。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.