Войти
ПрограммированиеПодсказкиГрафика

Избавиться от зависимости от DLL D3DX (d3dx9_30.dll, d3dx9_41.dll ...)

Автор:

Классическая проблема начинающих разработчиков на Direct3D -
"Принёс свою программу на комп к знакомому, а там нет d3dx9_40.dll.  Что делать ???"

--------------------------------------------------------------------------------------------------------------------------

Что это за dll-ка такая ?
В ней лежат тела всех методов и функций из D3DX.
Всё интерфейсы, называющиеся ID3DXчтототамещё - реализованы в этой dll-ке.
Все функции, называющиеся D3DXсделатьчтото - реализованы в этой dll-ке.
Microsoft довольно часто обновляет SDK, и каждый раз туда кладёт dll-ку с новой версией.
Одновременно Microsoft выпускает обновлённый DirectX Redistributable, куда также попадает эта новая dll-ка.
Программист - существо прогрессивное. Он качает самый свежий SDK. И тем самым, его код зависит от самой свежей dll-ки.
Пользователь - существо по большей части ленивое. DirectX Redist обычно вообще новый никогда не ставит. Таким образом, у него на компе нужных dll-ек не оказывается.

--------------------------------------------------------------------------------------------------------------------------

Решений у этой проблемы целых четыре:

1.
Просто вместе со своей программой распространять и эту нужную dll-ку.
Решение лёгкое, но нелегальное. Microsoft в EULA прямо запрещает распространять компоненты directX "по кускам".

2.
Использовать SDK какой-нибудь ранней версии, чтобы ваша программа требовала dll-ку с небольшим номером.
И надеяться, что эта dll-ка у конечного пользователя всё-таки найдётся.
Решение, ясно дело, плохое.

3.
Собрать минимальную версию DirectX Redistributable, и таскать её вместе со своим дистрибутивом.
Поговаривают, что минимальный размер DirectX Redistributable - всего три метра.
Как это сделать - описано в SDK в статье "Technical articles" -> "DirectX Installation for Game Developers" -> "Small Installation Packages".
Если для вас таскать с собой лишние три метра - не проблема, то можно выбрать именно это решение.

4.
Радикальное решение - не использовать D3DX вообще.
Решение, требующее от программиста поработать мозгом и пальцами рук.
Программист, избравший это решение, и успешно его реализовавший, уже может считаться перешедшим с уровня "новичок в d3d" на уровень "разбирающийся в d3d".
Для примера, что делать с общеупотребительными фишками d3dx:
Загрузка средствами d3dx моделей и анимация - выкидывается. Берётся загрузчик какого-нибудь распространённого формата, или пишется свой.
Можно ознакомиться с этими статьями:
Создание Export плагина для 3D Studio MAX,
Формат 3DS: Первый шаг,
Скелетная анимация и экспорт из Maya 4.0.
Загрузка средствами d3dx текстур - выкидывается. Читать изображения из файлов - проще простого.
Можно ознакомиться с этими статьями:
Библиотека OpenIL,
Работа с файлами форматов ZIP, JPEG и PNG,
Описание формата TGA.
Фонты средствами d3dx - выкидываются. Пишутся свои.
Математика через d3dx матрицы/вектора и богопротивные функции вроде D3DXMatrixMultiplyTranspose - выкидывается. Пишется своя хорошая математика. Или ищется в поисковике.
Шейдеры и эффекты - компилируются во время сборки билда; скомпилированный шейдер записываем в файл на диске. А во время работы игрушки аккуратно читаем из файла результат компиляции, и создаём нужный шейдер уже без потерь времени на компиляцию.

В общем и целом, всё что в SDK идёт под заголовками "D3DX Reference", "Effect Reference", "X File Reference" - не использовать вообще.
Жизненно необходимые вещи вроде компиляции шейдеров и эффектов - использовать в оффлайне, во время сборки билда.

#D3DX, #Direct3D, #DirectX

24 сентября 2009

Комментарии [90]

итер дизайн. Современный дизайн.