Bagaimana menghadapi D3DX .dll sih?

16

Ada sejumlah besar versi dll D3DX, dari setiap pembaruan SDK, setiap versi memiliki nama unik ( daftar nama dll D3DX ).

Terlalu sering, orang kehilangan versi. Jadi meskipun mereka memiliki versi DirectX yang kompatibel, proyek berbasis D3D Anda tidak akan berjalan di mesin mereka.

Saya ingin dapat mendistribusikan game (proyek waktu luang kecil, entri selai game, dll) sebagai file zip sederhana, tanpa perlu penginstal. Tapi sebagian besar pengguna mengalami kesalahan D3DX .dll yang hilang. Dan tanpa penginstal, solusi resmi Microsoft (penginstal / pembaru web DirectX) tidak terlalu banyak solusi.

Sayangnya, Microsoft masih tidak akan memberi kami pilihan untuk menghubungkan statis ke D3DX (yang akan menjadi solusi bersih yang bagus). Dan menghindari menggunakan D3DX tidak terlalu praktis, terutama jika Anda bekerja dengan shader (dan tidak, saya tidak beralih ke OpenGL, setidaknya untuk saat ini)

Apakah ada yang punya solusi pintar untuk menghindari neraka DLL ini?

bluescrn
sumber
2
Mungkin mendapatkan respons yang lebih baik dari Stack Overflow ( stackoverflow.com ) - meskipun ini berlaku untuk permainan Anda, itu benar-benar pemrograman. Sementara itu ... Tidak bisakah Anda menempatkan DLL pada folder yang sama dengan yang dapat dieksekusi?
Ricket
Hmmm ... apakah ini ide konyol untuk kembali ke versi DX9 SDK tertua yang mungkin saya dapatkan, hanya untuk mengurangi masalah ini? Tampaknya cara gila dalam melakukan sesuatu, tetapi MS telah benar-benar menciptakan masalah yang mengganggu di sini. Pilihan lain yang sama gila adalah untuk mengimplementasikan kembali fungsi D3DX yang paling penting dari awal, tapi saya tidak suka menciptakan kembali sistem Efek ...
bluescrn
Dalam SDK baru-baru ini (pada beberapa waktu tahun lalu saya pikir) efek subsistem sebagian besar dipindahkan keluar dari inti dan D3DX SDK untuk 10 +. Anda dapat mengompilasinya sendiri - kode berada di SDK dan dapat didistribusikan kembali (seperti biner yang dihasilkan darinya). Mungkin lebih mudah untuk mendukung port sistem untuk bekerja dengan 9, dan sebagian besar D3DX lainnya cukup mudah untuk diterapkan kembali atau mencari alternatif.
2
Jangan gunakan d3dx. Tidak hampir secepat / baik / efisien / keren.
Saya bisa meneruskan matematika DirectX, mesh, tekstur, dan hal-hal pembantu umum - tetapi tidak bisa benar-benar menyerah D3DXEffect. Dan saya terjebak dengan DX9 lebih atau kurang selamanya. Dan sejauh yang saya ketahui, DX10 + tidak ada, karena mereka tidak ada di XP
bluescrn

Jawaban:

17

Sayangnya, tidak ada solusi hukum yang baik untuk ini kecuali membuat installer, karena tangan Anda terikat oleh hak distribusi yang diberikan kepada Anda oleh DirectX SDK, yang menyediakan DLL D3DX. Di bawah ketentuan perjanjian lisensi Anda terikat dengan menggunakan SDK (yang berlokasi di(SDK Install Directory)/Documentation/License Agreements/ Anda hanya diizinkan untuk mendistribusikan kembali bentuk biner dari subset tertentu dari SDK, bersama dengan beberapa sampel dan kode utilitas.

Pada Juni 2010 SDK, Anda diizinkan untuk mendistribusikan ulang apa pun di direktori "Redist" dan ketika melakukannya Anda harus menyertakan komponen tertentu (DSetup32.dll, DSetup.dll, DXSetup.exe, DXSetup.exe, DXupdate.cab dan dxdllreg_x86.cab). Direktori Redist menyertakan file .cab untuk DLL D3DX, tetapi bukan DLL itu sendiri sehingga Anda kurang beruntung.

Hal ini tidak terlalu sulit untuk membangun sebuah installer, untungnya, yang baru saja menjalankan D3DX sesuai web installer atau entah apa lagi yang merupakan sesuatu yang Anda distribusikan kembali. Penginstal .msi sederhana sama mudahnya bagi pengguna untuk menggunakan (mengklik dua kali pada umumnya yang diperlukan) dan dapat dikonfigurasikan untuk memungkinkan instalasi ke direktori arbitrer, jika Anda khawatir karena beberapa alasan tentang "mencemari" direktori Program Files dengan program kecil yang dibuang ini. Overhead dalam ukuran unduhan installer yang dikonfigurasi dengan tepat bisa sangat kecil, juga, sehingga seharusnya tidak terlalu menjadi masalah.

EDIT: Ini adalah halaman bagus tentang hal-hal instalasi DX .

EDIT 2: Hapus bit "web" sebagai tanggapan atas koreksi dalam komentar.


sumber
3
Anda tidak diizinkan mendistribusikan ulang penginstal web, cukup arahkan ke laman microsoft.com (jadi tidak ideal), dan komponen yang dapat didistribusikan kembali minimum 3Mb (tidak signifikan dibandingkan dengan ukuran 'permainan nyata', tetapi tidak untuk proyek waktu luang kecil)
bluescrn
Eh, yup, Anda benar, saya salah bicara tentang penginstal web.
2

Empat solusi utama muncul dalam pikiran.

Yang pertama adalah menggunakan versi DirectX SDK yang lebih lama. Saya sepertinya ingat bahwa versi dari bundaran 2004 atau sebelumnya terkait secara statis (tetapi jika ukuran yang lebih besar dapat dieksekusi membuat Anda takut yang mungkin tidak menjadi pilihan), dan itu juga kasus jika Anda menggunakan versi dari 2006/2007 atau sebelumnya maka DLL D3DX yang Anda butuhkan akan memiliki peluang yang jauh lebih tinggi untuk berada di mesin. Kelemahan dari ini adalah bahwa Anda akan kehilangan perbaikan bug, peningkatan kinerja dan peningkatan fungsionalitas di SDK yang lebih baru (itu juga mengesampingkan versi D3D selain 9).

Solusi kedua adalah menggunakan LoadLibrary dan GetProcAddress pada fungsi D3DX. Anda memilih versi yang didukung maksimum dan minimum (katakanlah, dari _42 ke _34), kemudian masuk ke loop dari maks ke min, membangun nama DLL, dan mencoba untuk LoadLibrary itu. Jika Anda memuatnya OK, Anda kemudian melakukan banyak panggilan GetProcAddress dan menggunakan pointer fungsi Anda alih-alih fungsi D3DX mentah. Jenis ekstensi OpenGL seperti, jika Anda tahu apa yang saya bicarakan. Yang ini berpotensi sedikit berbulu, dan Anda mungkin masih harus berurusan dengan kasus di mana Anda tidak dapat menemukan DLL dalam jangkauan Anda. Tetapi saya telah menggunakan yang ini di masa lalu dan itu bekerja dengan cukup baik.

Solusi ketiga adalah tidak menggunakan D3DX. Mungkin menjadi opsi dalam beberapa kasus, mungkin bukan opsi dalam kasus Anda.

Solusi keempat dan terakhir adalah memberi tahu pengguna Anda untuk meningkatkan 3D Langsung mereka. Mereka benar-benar harus melakukan ini, ini adalah unduhan kecil dan cepat dari Microsoft, dan ini adalah pemecah masalah instan. Pengguna Anda mungkin tidak suka harus melakukannya, dan Anda mungkin harus berurusan dengan pertanyaan seperti "Saya sudah punya D3D11, mengapa saya perlu memutakhirkan D3D9 saya", tetapi secara seimbang mungkin akan lebih ekonomis secara keseluruhan untuk mengambil itu di hidung.

Maximus Minimus
sumber