Как бороться с D3DX .dll адом?

16

Существует большое количество версий dll D3DX из каждого обновления SDK, каждая версия имеет уникальное имя ( список имен d3 D3DX ).

Слишком часто у людей отсутствуют версии. Таким образом, даже несмотря на то, что они имеют совместимую версию DirectX, ваш проект на базе D3D не будет работать на их компьютере.

Я хочу иметь возможность распространять игры (небольшие проекты в свободное время, записи игровых джемов и т. Д.) В виде простого zip-файла без необходимости в установщике. Но значительный процент пользователей сталкиваются с отсутствующими ошибками D3DX .dll. А без установщика официальное решение Microsoft (веб-установщик / обновление DirectX) на самом деле не является решением проблемы.

К сожалению, Microsoft по-прежнему не дает нам возможность статической ссылки на D3DX (что было бы хорошим чистым решением). И избегать использования D3DX не очень практично, особенно если вы работаете с шейдерами (и нет, я не переключаюсь на OpenGL, по крайней мере сейчас)

У кого-нибудь есть умные решения, чтобы избежать этого ада DLL?

bluescrn
источник
2
Возможно, получит лучшие ответы от Stack Overflow ( stackoverflow.com ) - даже если это относится к вашим играм, это действительно программирование. А пока ... Разве вы не можете просто поместить библиотеки DLL в ту же папку, что и ваш исполняемый файл?
Рикет
Хммм ... было бы глупо возвращаться к самой старой версии DX9 SDK, которую я могу достать, просто чтобы уменьшить эту проблему? Кажется сумасшедшим способом делать вещи, но MS действительно создала раздражающую проблему здесь. Другим столь же безумным вариантом было бы заново реализовать наиболее важную функциональность D3DX с нуля, но мне не хочется заново изобретать систему Effects ...
bluescrn
В последних SDK (по-моему, в прошлом году) подсистема эффектов была в значительной степени перенесена из ядра и D3DX SDK на 10+. Фактически, вы можете скомпилировать его самостоятельно - код находится в SDK и может распространяться (как и двоичные файлы, созданные из него). Вероятно, проще создать резервную копию системы для работы с 9, и большую часть остальной части D3DX довольно легко повторно реализовать или найти альтернативы.
2
Не используйте d3dx. Это не так быстро / хорошо / эффективно / круто в любом случае.
Я мог бы передать математические, сетчатые, текстурные и вспомогательные материалы по DirectX, но не могу отказаться от D3DXEffect. И я застрял с DX9 более или менее навсегда. И, насколько мне известно, DX10 + не существует, потому что они не существуют в XP
bluescrn

Ответы:

17

К сожалению, для этого нет хорошего юридического решения, кроме как сделать установщик, потому что ваши руки связаны правами на распространение, предоставленными вам DirectX SDK, который предоставляет библиотеки D3DX DLL. В соответствии с условиями лицензионного соглашения вы обязаны использовать SDK (который находится в (SDK Install Directory)/Documentation/License Agreements/вас, разрешается распространять только двоичные формы определенных подмножеств SDK, а также некоторые примеры и код утилиты.

Начиная с пакета SDK за июнь 2010 года вам разрешалось распространять что-либо в каталоге «Redist», и при этом необходимо включать определенные компоненты (DSetup32.dll, DSetup.dll, DXSetup.exe, DXupdate.cab и dxdllreg_x86.cab). Каталог Redist содержит CAB-файлы для библиотек D3DX, но не сами библиотеки, так что вам не повезло.

Это не так уж трудно построить инсталлятор, к счастью, что просто запускает соответствующий D3DX веб - инсталлятор или этажерку , что это то , что вы перераспределять. Простые установщики .msi просты в использовании для пользователя (двойной щелчок - это, как правило, все, что нужно) и могут быть настроены так, чтобы разрешить установку в произвольные каталоги, если вы по какой-то причине обеспокоены «загрязнением» каталога Program Files эти небольшие одноразовые программы. Накладные расходы в размере загружаемого файла надлежащим образом настроенного установщика также могут быть довольно малыми, так что это не должно быть слишком большой проблемой.

РЕДАКТИРОВАТЬ: Вот хорошая страница об установках DX .

РЕДАКТИРОВАТЬ 2: Вычеркнуть бит "сети" в ответ на исправление в комментариях.


источник
3
Вам не разрешается распространять веб-установщик, просто укажите их на страницу microsoft.com (что не идеально), а распространяемые компоненты имеют размер не менее 3 Мб (незначительный по сравнению с размером «реальной игры», но не для маленьких проектов свободного времени)
bluescrn
Э-э, да, вы правы, я неправильно сказал о веб-установщике.
2

На ум приходят четыре основных решения.

Первый - использовать старую версию DirectX SDK. Кажется, я помню, что версии от 2004-го или более ранних версий были статически связаны (но если вас испугал больший размер исполняемого файла, что может не подойти), а также, если вы используете версию 2006/2007 или более раннюю, DLL-библиотеки D3DX, которые вам нужны, с большей вероятностью окажутся на компьютере. Недостатком этого является то, что вы будете упускать ошибки, улучшения производительности и улучшенную функциональность в новых SDK (это также исключает любую версию D3D, кроме 9).

Второе решение - использовать LoadLibrary и GetProcAddress для функций D3DX. Вы выбираете максимальную и минимальную поддерживаемую версию (скажем, от _42 до _34), затем переходите к циклу от max до min, создаете имя DLL и пытаетесь загрузить его. Если вы загрузите его ОК, тогда вы выполните несколько вызовов GetProcAddress и будете использовать ваши указатели функций вместо необработанных функций D3DX. Вроде как расширения OpenGL, если вы знаете, о чем я говорю. Это потенциально немного волосатое, и вам, возможно, все равно придется иметь дело со случаем, когда вы не можете найти ни одной DLL в вашем диапазоне. Но я использовал этот в прошлом, и он работает достаточно хорошо.

Третье решение - просто не использовать D3DX. Может быть вариант в некоторых случаях, может быть не вариант в вашем случае.

Четвертое и последнее решение - просто сказать своим пользователям обновить их Direct 3D. Они действительно должны делать это в любом случае, это небольшая и быстрая загрузка от Microsoft, и это мгновенное решение проблем. Возможно, вашим пользователям это не понравится, и вам, возможно, придется столкнуться с такими вопросами, как «У меня уже есть D3D11, зачем мне обновлять мой D3D9», но в целом это может оказаться более экономичным в целом, чтобы принять это на носу.

Максимус Минимус
источник