Существует большое количество версий dll D3DX из каждого обновления SDK, каждая версия имеет уникальное имя ( список имен d3 D3DX ).
Слишком часто у людей отсутствуют версии. Таким образом, даже несмотря на то, что они имеют совместимую версию DirectX, ваш проект на базе D3D не будет работать на их компьютере.
Я хочу иметь возможность распространять игры (небольшие проекты в свободное время, записи игровых джемов и т. Д.) В виде простого zip-файла без необходимости в установщике. Но значительный процент пользователей сталкиваются с отсутствующими ошибками D3DX .dll. А без установщика официальное решение Microsoft (веб-установщик / обновление DirectX) на самом деле не является решением проблемы.
К сожалению, Microsoft по-прежнему не дает нам возможность статической ссылки на D3DX (что было бы хорошим чистым решением). И избегать использования D3DX не очень практично, особенно если вы работаете с шейдерами (и нет, я не переключаюсь на OpenGL, по крайней мере сейчас)
У кого-нибудь есть умные решения, чтобы избежать этого ада DLL?
Ответы:
К сожалению, для этого нет хорошего юридического решения, кроме как сделать установщик, потому что ваши руки связаны правами на распространение, предоставленными вам 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: Вычеркнуть бит "сети" в ответ на исправление в комментариях.
источник
На ум приходят четыре основных решения.
Первый - использовать старую версию 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», но в целом это может оказаться более экономичным в целом, чтобы принять это на носу.
источник