Як боротися з пеклам D3DX .dll?


16

Існує велика кількість версій dll D3DX, від кожного оновлення SDK, кожна версія має унікальне ім’я ( список імен dll D3DX D3DX ).

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

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

На жаль, Microsoft все ще не дасть нам можливості статичного посилання на D3DX (що було б приємним чистим рішенням). І уникати використання D3DX не дуже практично, особливо якщо ви працюєте з шейдерами (і ні, я не переходжу на OpenGL, принаймні поки що)

Хтось має розумні рішення, щоб уникнути цього пекла DLL?


2
Ви можете отримати кращі відповіді від Stack Overflow ( stackoverflow.com ) - навіть якщо це стосується ваших ігор, це дійсно програмування. Тим часом ... Чи можете ви не просто помістити DLL-файли в ту ж папку, що і виконуваний файл?
Рікет

Гммм ... чи було б дурною ідеєю повернутися до найдавнішої можливої ​​версії SDK DX9, яку я можу отримати, просто щоб зменшити цю проблему? Здається, божевільний спосіб робити речі, але MS справді створила тут дратівливу проблему. Ще одним не менш шаленим варіантом було б повторно реалізувати найважливіший функціонал D3DX з нуля, але я не думаю, щоб переосмислити систему ефектів ...
bluescrn

В останніх SDK (як я вважаю, колись минулого року) підсистема ефектів значною мірою була виведена з основної та D3DX SDK на 10+. Ви можете скласти його самостійно, насправді - код знаходиться в SDK і перерозподіляється (як і двійкові файли, що виробляються з нього). Напевно, простіше підтримувати порт для роботи з 9, а більшість решти D3DX досить легко повторно реалізувати або знайти альтернативи.

2
Не використовуйте d3dx. Це майже не так швидко / добре / ефективно / круто в будь-якому випадку.

Я міг би передати математику DirectX, сітку, текстуру та загальні помічники DirectX - але я не можу відмовитись від D3DXEffect. І я затримався з DX9 більш-менш назавжди. Що стосується мене, DX10 + не існує, оскільки вони не існують на XP
bluescrn

Відповіді:


17

На жаль, не існує хорошого правового рішення для цього, окрім як встановити інсталятор, оскільки ваші руки пов’язані правами на розповсюдження, наданими вам DirectX SDK, який надає DLL-файли D3DX. Згідно з умовами ліцензійної угоди, на яку ви зобов'язані використовувати SDK (який знаходиться у (SDK Install Directory)/Documentation/License Agreements/вас, дозволено лише перерозподіляти двійкові форми певних підмножин SDK разом з деяким зразком та корисним кодом.

Починаючи з SDK у червні 2010 року, ви дозволяли перерозподіляти що-небудь у каталозі "Redist", і при цьому ви повинні включати певні компоненти (DSetup32.dll, DSetup.dll, DXSetup.exe, DXupdate.cab та dxdllreg_x86.cab). Каталог Redist включає файли .cab для DLL-файлів D3DX, але не самі DLL, щоб вам не пощастило.

Це не так уже й важко побудувати інсталятор, до щастя, що просто запускає відповідний D3DX веб - інсталятор або етажерку , що це те , що ви перерозподіляти. Прості інсталятори .msi користувачеві настільки ж прості у користуванні (подвійне клацання, як правило, все, що потрібно), і їх можна налаштувати, щоб дозволити встановлення у довільні каталоги, якщо ви чомусь турбуєтесь про "забруднення" каталогу програмних файлів ці невеликі програми викидання. Розмір витрат на завантаження належним чином налаштованого інсталятора може бути також невеликим, так що це не повинно бути великою проблемою.

EDIT: Ось хороша сторінка про матеріали встановлення DX .

EDIT 2: Викреслити "веб" біт у відповідь на виправлення в коментарях.


3
Вам заборонено перерозподіляти веб-інсталятор, просто вкажіть їх на сторінку microsoft.com (так не ідеально), а компоненти, що перерозподіляються, мають мінімум 3 Мбіт (незначні порівняно з розмірами "реальної гри", але не для маленьких проектів у вільний час)
bluescrn

Е, так, ти маєш рацію, я пропускаю помилки щодо веб-інсталятора.

2

Чотири основні рішення спадають на думку.

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

Другим рішенням є використання LoadLibrary та GetProcAddress для функцій D3DX. Ви вибираєте максимальну та мінімальну підтримувану версію (скажімо, від _42 до _34), потім переходите до циклу від max до min, будуєте ім'я DLL та намагаєтесь LoadLibrary. Якщо ви завантажуєте його нормально, тоді ви здійснюєте купу дзвінків GetProcAddress і використовуєте свої покажчики функцій замість необроблених функцій D3DX. Начебто розширення OpenGL, якщо ви знаєте, про що я говорю. Цей потенційно трохи волохатий, і вам, можливо, доведеться мати справу з тим випадком, коли ви не можете знайти жодної DLL у своєму асортименті. Але я користувався цим раніше і він працює досить добре.

Третє рішення - просто не використовувати D3DX. У деяких випадках це може бути варіантом, а у вашому випадку може не бути варіантом.

Четверте і остаточне рішення - просто сказати своїм користувачам оновити Direct 3D. Вони дійсно повинні робити це все одно, це невелике і швидке завантаження з Microsoft, і це миттєве вирішення проблем. Вашим користувачам може не подобатися цього робити, і вам, можливо, доведеться мати справу з такими питаннями, як "У мене вже D3D11, чому мені потрібно оновити свій D3D9", але, в цілому, це може бути більш економічним в цілому. це на носі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.