Jak radzić sobie z D3DX .dll do diabła?

16

Istnieje wiele wersji biblioteki DLL D3DX, z każdej aktualizacji SDK, każda wersja ma unikalną nazwę ( lista nazw bibliotek D3DX ).

Zbyt często ludzie nie mają wersji. Więc nawet jeśli mają kompatybilną wersję DirectX, twój projekt oparty na D3D nie będzie działał na ich komputerze.

Chcę być w stanie dystrybuować gry (małe projekty w wolnym czasie, wpisy dotyczące jam gier itp.) Jako zwykły plik zip, bez potrzeby instalatora. Ale znaczny procent użytkowników napotyka brakujące błędy D3DX .dll. Bez instalatora oficjalne rozwiązanie Microsoftu (internetowy instalator / narzędzie do aktualizacji DirectX) nie jest zbyt dobrym rozwiązaniem.

Niestety, Microsoft nadal nie daje nam możliwości statycznego linkowania do D3DX (co byłoby ładnym czystym rozwiązaniem). Unikanie używania D3DX nie jest zbyt praktyczne, zwłaszcza jeśli pracujesz z shaderem (i nie, przynajmniej nie przełączam się na OpenGL)

Czy ktoś ma sprytne rozwiązania pozwalające uniknąć tego piekła DLL?

bluescrn
źródło
2
Może uzyskać lepsze odpowiedzi od Stack Overflow ( stackoverflow.com ) - nawet jeśli dotyczy to twoich gier, tak naprawdę to programuje. W międzyczasie ... Czy nie możesz po prostu umieścić bibliotek DLL w tym samym folderze, co plik wykonywalny?
Ricket
Hmmm ... czy głupim pomysłem byłoby przywrócenie najstarszej możliwej wersji zestawu SDK DX9, jaką mogę zdobyć, tylko po to, aby zmniejszyć ten problem? Wygląda na szalony sposób robienia rzeczy, ale stwardnienie rozsiane naprawdę stworzyło irytujący problem tutaj. Kolejną równie szaloną opcją byłoby ponowne wdrożenie najważniejszej funkcjonalności D3DX od zera, ale nie zamierzam wymyślać systemu Effects ...
bluescrn
W ostatnich SDK (jak od pewnego czasu w ubiegłym roku chyba) efekt podsystem został w dużym stopniu przeniosła się z rdzenia i D3DX SDK dla 10+. W rzeczywistości możesz go skompilować samodzielnie - kod znajduje się w zestawie SDK i można go rozpowszechniać (podobnie jak generowane z niego pliki binarne). Prawdopodobnie łatwiej jest cofnąć port systemu do pracy z 9, a większość reszty D3DX jest dość łatwa do zaimplementowania lub znalezienia alternatyw dla.
2
Nie używaj d3dx. I tak nie jest tak szybki / dobry / wydajny / chłodny.
Mógłbym przekazać matematykę DirectX, siatkę, teksturę i ogólne informacje pomocnicze - ale tak naprawdę nie mogę zrezygnować z D3DXEffect. I utknąłem z DX9 mniej więcej na zawsze. I o ile mi wiadomo, DX10 + nie istnieją, ponieważ nie istnieją na XP
bluescrn 30.01.11

Odpowiedzi:

17

Niestety, nie ma na to dobrego, legalnego rozwiązania, z wyjątkiem stworzenia instalatora, ponieważ twoje ręce są związane prawami do dystrybucji przyznanymi ci przez DirectX SDK, który zapewnia biblioteki DLL D3DX. Zgodnie z warunkami umowy licencyjnej jesteś zobowiązany do korzystania z zestawu SDK (który znajduje się w(SDK Install Directory)/Documentation/License Agreements/ tobie, możesz jedynie redystrybuować formy binarne niektórych podzbiorów SDK, wraz z niektórymi przykładowymi kodami i kodami narzędziowymi.

Począwszy od zestawu SDK z czerwca 2010 r. Można zezwolić na redystrybucję czegokolwiek w katalogu „Redist”, a do tego należy dołączyć pewne składniki (DSetup32.dll, DSetup.dll, DXSetup.exe, DXupdate.cab i dxdllreg_x86.cab). Katalog Redist zawiera pliki cab dla bibliotek DLL D3DX, ale nie same biblioteki DLL, więc masz pecha.

To nie jest strasznie trudne do zbudowania instalatora, na szczęście, że właśnie prowadzi odpowiednią D3DX internetowej instalatora lub cokolwiek to jest coś, czego redystrybucji. Proste instalatory .msi są tak samo łatwe w użyciu dla użytkownika (podwójne kliknięcie jest ogólnie wszystkim, czego potrzeba) i można je skonfigurować tak, aby zezwalało na instalację w dowolnych katalogach, jeśli z jakiegoś powodu martwisz się o „zanieczyszczenie” katalogu Program Files za pomocą te małe programy wyrzucania. Narzut w rozmiarze pobierania odpowiednio skonfigurowanego instalatora może być również dość mały, więc nie powinno to stanowić większego problemu.

EDYCJA: Oto dobra strona na temat instalacji DX .

EDYCJA 2: W odpowiedzi na korektę w komentarzach przekreślono bit „sieci”.


źródło
3
Nie możesz redystrybuować instalatora internetowego, po prostu skieruj go na stronę microsoft.com (więc nie jest to idealne), a komponenty redystrybucyjne mają co najmniej 3 Mb (nieznaczne w porównaniu do rozmiaru „prawdziwej gry”, ale nie dla małych projektów w wolnym czasie)
bluescrn
Eee, masz rację, źle napisałem o instalatorze internetowym.
2

Przychodzą mi na myśl cztery główne rozwiązania.

Pierwszym z nich jest użycie starszej wersji zestawu DirectX SDK. Wydaje mi się, że pamiętam, że wersje z ronda 2004 lub wcześniejszego były połączone statycznie (ale jeśli przeraża cię większy rozmiar pliku wykonywalnego, może to nie być opcja), a także w przypadku wersji z roku 2006/2007 lub wcześniejszego Potrzebne biblioteki DLL D3DX będą miały znacznie większą szansę na bycie na komputerze. Minusem tego jest to, że będziesz tracić poprawki błędów, ulepszenia wydajności i ulepszoną funkcjonalność w nowszych zestawach SDK (wyklucza to również dowolną wersję D3D inną niż 9).

Drugim rozwiązaniem jest użycie LoadLibrary i GetProcAddress w funkcjach D3DX. Wybierasz maksymalną i minimalną obsługiwaną wersję (powiedzmy od _42 do _34), następnie przechodzisz do pętli od max do min, konstruujesz nazwę DLL i próbujesz ją załadować. Jeśli załadujesz go OK, wykonasz kilka wywołań GetProcAddress i użyjesz wskaźników funkcji zamiast surowych funkcji D3DX. Coś w rodzaju rozszerzeń OpenGL, jeśli wiesz o czym mówię. Ten jest potencjalnie trochę włochaty i być może będziesz musiał poradzić sobie ze sprawą, w której nie możesz znaleźć żadnej biblioteki DLL w swoim zasięgu. Ale korzystałem z tego w przeszłości i działa wystarczająco dobrze.

Trzecie rozwiązanie to po prostu nie używać D3DX. W niektórych przypadkach może być opcją, może nie być opcją w twoim przypadku.

Czwarte i ostatnie rozwiązanie polega po prostu na poinformowaniu użytkowników o aktualizacji Direct 3D. Tak naprawdę powinni to robić, to małe i szybkie pobieranie z Microsoft, i to natychmiastowe rozwiązanie problemu. Twoi użytkownicy mogą nie chcieć tego robić i być może będziesz musiał poradzić sobie z pytaniami typu „Mam już D3D11, dlaczego muszę aktualizować swój D3D9”, ale w sumie może okazać się bardziej ekonomiczny to na nosie.

Maximus Minimus
źródło