D3DX .dll cehennem ile nasıl başa çıkılır?


16

Her SDK güncellemesinden D3DX dll'nin çok sayıda sürümü vardır, her sürümün benzersiz bir adı vardır ( D3DX dll adlarının listesi ).

Çoğu zaman, insanların sürümleri eksik. Dolayısıyla, DirectX'in uyumlu bir sürümüne sahip olmalarına rağmen, D3D tabanlı projeniz makinelerinde çalışmaz.

Yükleyiciye gerek kalmadan oyunları (küçük boş zaman projeleri, oyun sıkışma girişleri, vb.) Basit bir zip dosyası olarak dağıtabilmek istiyorum. Ancak kullanıcıların önemli bir yüzdesi eksik D3DX .dll hatalarıyla karşılaşır. Bir yükleyici olmadan, Microsoft'un resmi çözümü (DirectX web yükleyicisi / güncelleyici) gerçekten bir çözüm değildir.

Ne yazık ki, Microsoft hala bize D3DX'e statik bağlantı yapma seçeneği vermiyor (bu güzel ve temiz bir çözüm olacaktır). D3DX kullanmaktan kaçınmak, özellikle gölgelendiricilerle çalışıyorsanız (ve hayır, en azından şimdilik OpenGL'ye geçmiyorum) çok pratik değil.

Herkes bu DLL cehennemden kaçınmak için akıllı çözümleri var mı?


2
Stack Overflow'dan ( stackoverflow.com ) daha iyi yanıtlar alabilir - bu oyunlarınız için geçerli olsa da gerçekten programlıyor. Bu arada ... DLL'leri sadece yürütülebilir dosya ile aynı klasöre koyamaz mısınız?
Ricket

Hmmm ... sadece bu sorunu azaltmak için alabileceğim en eski DX9 SDK sürümüne geri dönmek aptalca bir fikir olur mu? Bir şeyler yapmak için çılgın bir yol gibi görünüyor, ama MS burada gerçekten can sıkıcı bir sorun yarattı. Eşit derecede çılgın bir başka seçenek de en önemli D3DX işlevselliğini sıfırdan uygulamak olacaktır, ancak Effects sistemini yeniden icat etmek
istemiyorum

(Bir süre geçen yıl bence itibariyle) son SDK'lardaki etkisi alt sistemi büyük ölçüde taşındı dışarı çekirdeğin ve 10+ için D3DX SDK'ler. Aslında kendiniz derleyebilirsiniz - kod SDK'da ve yeniden dağıtılabilir (ondan üretilen ikili dosyalar gibi). Sistemin 9 ile çalışabilmesi için bağlantı noktasını desteklemek daha kolaydır ve geri kalan D3DX'in çoğunun yeniden uygulanması veya alternatifleri bulmak oldukça kolaydır.

2
D3dx kullanmayın. Neredeyse onun kadar hızlı / iyi / verimli / serin değil.

DirectX matematiği, mesh, doku ve genel yardımcı maddeleri aktarabilirdim - ama gerçekten D3DXEffect'ten vazgeçemem. Ve sonsuza dek DX9 ile takıldım. Ve endişelendiğim kadarıyla, DX10 + mevcut değil, çünkü XP'de mevcut değiller
bluescrn

Yanıtlar:


17

Ne yazık ki, bir yükleyici yapmak dışında bunun için iyi, yasal bir çözüm yoktur, çünkü elleriniz D3DX DLL'leri sağlayan DirectX SDK tarafından verilen dağıtım haklarına bağlıdır. Lisans sözleşmesinin hükümleri uyarınca, SDK'yı kullanmakla yükümlüsünüz (içinde bulunur) (SDK Install Directory)/Documentation/License Agreements/, bazı örnek ve yardımcı program kodlarıyla birlikte, yalnızca SDK'nın belirli alt kümelerinin ikili formlarını yeniden dağıtmanıza izin verilir.

Haziran 2010 SDK itibariyle, "Redist" dizinindeki herhangi bir şeyi yeniden dağıtmanıza izin verdiniz ve bunu yaparken belirli bileşenleri (DSetup32.dll, DSetup.dll, DXSetup.exe, DXupdate.cab ve dxdllreg_x86.cab) eklemelisiniz. Redist dizini, D3DX DLL'leri için .cab dosyalarını içerir, ancak şanssız olduğunuz için DLL'lerin kendilerini değil .

Sadece uygun D3DX çalışır neyse bir yükleyici, inşa etmek korkunç zor değildir web yükleyici veya etajer olan bir şey yeniden dağıtmak. Basit .msi yükleyicileri, bir kullanıcının kullanması kadar kolaydır (çift tıklama genellikle gereken tek şeydir) ve Program Files dizinini "kirletmek" konusunda bir nedenden dolayı endişeleniyorsanız, rastgele dizinlere yüklemeye izin verecek şekilde yapılandırılabilir. bu küçük fırlatma programları. Uygun şekilde yapılandırılmış bir yükleyicinin indirme boyutundaki ek yük de oldukça küçük olabilir, bu yüzden çok fazla sorun olmamalıdır.

EDIT: İşte DX kurulum şeyler hakkında iyi bir sayfa .

DÜZENLEME 2: Yorumlarda bir düzeltmeye yanıt olarak "web" biti çıktı.


3
Web yükleyiciyi yeniden dağıtmanıza izin verilmez, sadece microsoft.com sayfasına yönlendirin (ideal değil) ve Yeniden dağıtılabilir bileşenler en az 3Mb'dir ('gerçek bir oyunun boyutuna kıyasla önemsizdir, ancak boş zaman projeleri için)
bluescrn

Ee, evet, haklısın, web kurucuyu yanlış anladım.

2

Dört ana çözüm akla geliyor.

Birincisi, DirectX SDK'nın eski bir sürümünü kullanmaktır. Döner kavşak 2004 veya daha eski sürümlerin statik olarak bağlantılı olduğunu hatırlıyorum (ancak daha büyük bir yürütülebilir boyut sizi korkutuyorsa bu bir seçenek olmayabilir) ve ayrıca 2006/2007 veya daha eski bir sürümü kullanıyorsanız, İhtiyacınız olan D3DX DLL'leri makinede olma şansı çok daha yüksek olacaktır. Bunun dezavantajı, yeni SDK'larda hata düzeltmelerini, performans geliştirmelerini ve geliştirilmiş işlevleri kaçırmayacak olmanızdır (ayrıca 9 dışındaki D3D sürümlerini de hariç tutar).

İkinci çözüm ise D3DX fonksiyonlarında LoadLibrary ve GetProcAddress kullanmaktır. Desteklenen bir maksimum ve minimum sürümü (örneğin, _42'den _34'e kadar) seçersiniz, sonra max'dan min'e bir döngüye girersiniz, DLL adını oluşturur ve LoadLibrary'i denemeye çalışırsınız. Tamam yüklerseniz, bir sürü GetProcAddress çağrısı yaparsınız ve ham D3DX işlevleri yerine işlev işaretçilerinizi kullanırsınız. Neden bahsettiğimi biliyorsanız, OpenGL uzantıları gibi. Bu potansiyel olarak biraz kıllı ve hala aralığınızda herhangi bir DLL bulamadığınız durumla uğraşmak zorunda kalabilirsiniz. Ama bunu geçmişte kullandım ve yeterince iyi çalışıyor.

Üçüncü çözüm sadece D3DX kullanmamaktır. Bazı durumlarda bir seçenek olabilir, sizin durumunuzda bir seçenek olmayabilir.

Dördüncü ve son çözüm, kullanıcılarınıza Direct 3D'lerini yükseltmelerini söylemektir. Bunu gerçekten de yapıyor olmalılar, Microsoft'tan küçük ve hızlı bir indirme ve anında sorun çözücü. Kullanıcılarınız bunu yapmak istemeyebilir ve "Zaten D3D11'im var, neden D3D9'umu yükseltmem gerekiyor?" burun üzerinde.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.