วิธีจัดการกับ D3DX .dll hell


16

มี D3DX dll เป็นจำนวนมากจากการอัปเดต SDK แต่ละครั้งแต่ละรุ่นมีชื่อที่ไม่ซ้ำกัน ( รายชื่อ D3DX dll )

บ่อยครั้งที่คนมีรุ่นขาดหายไป ดังนั้นแม้ว่าพวกเขาจะมี DirectX เวอร์ชันที่เข้ากันได้โครงการที่ใช้ D3D ของคุณจะไม่ทำงานบนเครื่องของพวกเขา

ฉันต้องการที่จะสามารถแจกจ่ายเกม (โครงการเวลาว่างเล็ก ๆ น้อย ๆ รายการเกมติดขัด ฯลฯ ) เป็นไฟล์ซิปแบบง่ายโดยไม่จำเป็นต้องใช้โปรแกรมติดตั้ง แต่เปอร์เซ็นต์ที่สำคัญของผู้ใช้พบข้อผิดพลาด D3DX .dll ที่หายไป และหากไม่มีตัวติดตั้งโซลูชันอย่างเป็นทางการของ Microsoft (DirectX web installer / updater) ไม่ใช่วิธีแก้ปัญหามากนัก

น่าเสียดายที่ Microsoft ยังคงไม่ให้ตัวเลือกในการเชื่อมโยงแบบคงที่กับ D3DX (ซึ่งจะเป็นวิธีแก้ปัญหาที่ดีที่สุด) และการหลีกเลี่ยงการใช้ D3DX นั้นใช้งานไม่ได้จริง ๆ โดยเฉพาะอย่างยิ่งถ้าคุณทำงานกับ shaders (และไม่ฉันไม่ได้เปลี่ยนมาใช้ OpenGL อย่างน้อยตอนนี้)

ไม่มีใครมีวิธีแก้ปัญหาที่ชาญฉลาดเพื่อหลีกเลี่ยงนรก DLL นี้?


2
อาจได้รับการตอบสนองที่ดีขึ้นจาก Stack Overflow ( stackoverflow.com ) - แม้ว่าสิ่งนี้จะใช้กับเกมของคุณมันเป็นเรื่องการเขียนโปรแกรมจริงๆ ในระหว่างนี้ ... คุณไม่สามารถวาง DLLs ในโฟลเดอร์เดียวกับไฟล์ที่เรียกทำงานได้หรือไม่?
Ricket

หืมมมมมมมมมมมมมมมมมมมมหย่ ... ที่จะย้อนกลับไปใช้ DX9 SDK รุ่นเก่าที่สุดเท่าที่จะทำได้เพื่อลดปัญหานี้หรือไม่? ดูเหมือนจะเป็นวิธีที่บ้าคลั่งในการทำสิ่งต่าง ๆ แต่ MS ได้สร้างปัญหาที่น่ารำคาญจริงๆที่นี่ อีกตัวเลือกที่บ้าอย่างเท่าเทียมกันที่จะดำเนินการอีกครั้งการทำงาน D3DX ที่สำคัญที่สุดจากรอยขีดข่วน แต่ฉันไม่แฟนซีใหม่ประดิษฐ์ระบบเอฟเฟค ...
bluescrn

ใน SDKs ล่าสุด (บางครั้งเมื่อปีที่แล้วฉันคิดว่า) ระบบย่อยเอฟเฟกต์นั้นถูกย้ายออกจาก core และ D3DX SDK เป็นเวลา 10+ คุณสามารถรวบรวมได้ด้วยตนเองในความเป็นจริง - รหัสอยู่ใน SDK และสามารถแจกจ่ายซ้ำได้ (เช่นเดียวกับไบนารีที่ผลิตจากมัน) มันอาจจะง่ายกว่าที่จะแบ็คพอร์ตระบบให้ทำงานกับ 9 และส่วนที่เหลือของ D3DX นั้นค่อนข้างง่ายที่จะนำไปใช้ใหม่หรือหาทางเลือกอื่น

2
อย่าใช้ d3dx มันไม่เกือบจะเร็ว / ดี / มีประสิทธิภาพ / เย็นอย่างไรก็ตาม

ฉันสามารถส่งต่อคณิตศาสตร์ DirectX, mesh, texture และตัวช่วยทั่วไปได้ แต่ไม่สามารถยอมแพ้ D3DXEffect ได้ และฉันติดอยู่กับ DX9 มากกว่าหรือน้อยกว่าตลอดไป และเท่าที่ฉันเป็นห่วง DX10 + ไม่มีอยู่เพราะมันไม่มีอยู่ใน XP
bluescrn

คำตอบ:


17

น่าเสียดายที่ไม่มีวิธีแก้ปัญหาทางกฎหมายที่ดียกเว้นเรื่องนี้ในการติดตั้งเนื่องจากมือของคุณถูกผูกติดอยู่กับสิทธิ์ในการแจกจ่ายที่ DirectX SDK มอบให้คุณซึ่ง D3DX DLLs ภายใต้เงื่อนไขของข้อตกลงสิทธิ์การใช้งานที่คุณผูกพันโดยใช้ SDK (ซึ่งตั้งอยู่ใน(SDK Install Directory)/Documentation/License Agreements/คุณจะได้รับอนุญาตให้แจกจ่ายรูปแบบไบนารีของชุดย่อยบางส่วนของ SDK พร้อมกับตัวอย่างและรหัสอรรถประโยชน์บางส่วนเท่านั้น

ตั้งแต่ SDK เดือนมิถุนายน 2010 คุณได้รับอนุญาตให้แจกจ่ายอะไรในไดเรกทอรี "Redist" และเมื่อทำเช่นนั้นคุณต้องมีส่วนประกอบบางอย่าง (DSetup32.dll, DSetup.dll, DXSetup.exe, DXupdate.cab และ dxdllreg_x86.cab) ไดเรกทอรี Redist รวมถึงไฟล์. cab สำหรับ D3DX DLLs แต่ไม่ใช่ DLLs เองดังนั้นคุณจึงไม่โชคดี

มันไม่ยากอย่างยิ่งที่จะสร้างตัวติดตั้งโชคดีที่เพิ่งรันตัวติดตั้งเว็บ D3DX ที่เหมาะสมหรืออะไรก็ตามที่คุณแจกจ่ายซ้ำ ตัวติดตั้ง. msi แบบเรียบง่ายนั้นง่ายสำหรับผู้ใช้ที่จะใช้งาน (การดับเบิลคลิกโดยทั่วไปเป็นสิ่งที่จำเป็น) และสามารถกำหนดค่าเพื่ออนุญาตให้ติดตั้งลงในไดเรกทอรีต่าง ๆ หากคุณกังวลเกี่ยวกับ "มลพิษ" ไดเรกทอรีโปรแกรมไฟล์ด้วย โปรแกรมทิ้งห่างขนาดเล็กเหล่านี้ ขนาดค่าใช้จ่ายในการดาวน์โหลดของตัวติดตั้งที่ตั้งค่าไว้อย่างเหมาะสมอาจมีขนาดค่อนข้างเล็กเช่นกันดังนั้นจึงไม่ควรมีปัญหามากเกินไป

แก้ไข: นี่คือหน้าที่ที่ดีเกี่ยวกับสิ่งที่ติดตั้ง DX

แก้ไข 2: นำออกบิต "เว็บ" เพื่อตอบสนองต่อการแก้ไขในความคิดเห็น


3
คุณไม่ได้รับอนุญาตให้แจกจ่ายโปรแกรมติดตั้งเว็บใหม่เพียงแค่ชี้ไปที่หน้า microsoft.com (ไม่เหมาะ) และส่วนประกอบที่สามารถแจกจ่ายต่อได้นั้นมีอย่างน้อย 3MB (ไม่สำคัญเมื่อเทียบกับขนาดของเกมจริง 'แต่ไม่ใช่ สำหรับโครงการเวลาว่างเล็กน้อย)
bluescrn

เอ่อใช่คุณพูดถูกฉันคิดถึงการติดตั้งเว็บ

2

สี่วิธีแก้ปัญหาหลัก ๆ

สิ่งแรกคือการใช้ DirectX SDK รุ่นเก่ากว่า ฉันดูเหมือนจะจำได้ว่ารุ่นตั้งแต่วงเวียน 2004 หรือก่อนหน้านั้นมีการเชื่อมโยงแบบคงที่ (แต่ถ้าขนาดที่ใหญ่กว่าทำให้คุณกลัวว่าอาจจะไม่ใช่ตัวเลือก) และเป็นกรณีที่ถ้าคุณใช้รุ่นตั้งแต่ 2006/2007 ขึ้นไป D3DX DLLs ที่คุณต้องการจะมีโอกาสสูงที่จะได้อยู่ในเครื่อง ข้อเสียของสิ่งนี้คือคุณจะพลาดข้อผิดพลาดในการแก้ไขข้อบกพร่องการปรับปรุงประสิทธิภาพและการทำงานที่ได้รับการปรับปรุงใน SDK ที่ใหม่กว่า

วิธีที่สองคือใช้ LoadLibrary และ GetProcAddress ในฟังก์ชั่น D3DX คุณเลือกรุ่นที่ได้รับการสนับสนุนสูงสุดและต่ำสุด (เช่นจาก _42 ถึง _34) จากนั้นไปสู่การวนซ้ำจากมากไปหาน้อยสร้างชื่อ DLL และพยายามโหลดไลบรารี่ ถ้าคุณโหลดมันตกลงคุณจะทำการเรียก GetProcAddress และใช้พอยน์เตอร์ของฟังก์ชันแทนฟังก์ชัน D3DX แบบ raw เช่นส่วนขยาย OpenGL ถ้าคุณรู้ว่าฉันกำลังพูดถึงอะไร คนนี้อาจมีขนดกน้อยและคุณอาจต้องจัดการกับกรณีที่คุณไม่พบ DLL ใด ๆ ในช่วงของคุณ แต่ฉันเคยใช้อันนี้ในอดีตและใช้งานได้ดีพอ

วิธีที่สามคือไม่ใช้ D3DX อาจเป็นตัวเลือกในบางกรณีอาจไม่ใช่ตัวเลือกในกรณีของคุณ

วิธีที่สี่และสุดท้ายคือบอกผู้ใช้ของคุณให้อัพเกรด Direct 3D ของพวกเขา พวกเขาควรทำสิ่งนี้จริง ๆ มันเป็นการดาวน์โหลดขนาดเล็กและรวดเร็วจาก Microsoft และเป็นตัวแก้ปัญหาได้ทันที ผู้ใช้ของคุณอาจไม่ต้องการทำเช่นนั้นและคุณอาจต้องจัดการกับคำถามเช่น "ฉันมี D3D11 แล้วทำไมฉันต้องอัปเกรด D3D9 ของฉัน" แต่ด้วยความสมดุลอาจทำให้ประหยัดโดยรวมมากกว่าที่จะใช้ มันบนจมูก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.