
ถ้าคุณเล่นเกมบน Linux และสนใจเรื่องการค้นหาข้อมูลเกมเก่าๆ ชื่อนี้เหมาะสำหรับคุณ คุณอาจเริ่มคุ้นเคยกับ D7VK 1.4 มากขึ้นเรื่อยๆเลเยอร์การแปลงขนาดเล็กแต่ทรงพลังนี้ได้กลายเป็นส่วนประกอบสำคัญสำหรับการเล่นเกม Direct3D 5, 6 และ 7 คลาสสิกผ่าน Vulkan ซึ่งโดยทั่วไปจะใช้ Wine หรือ Proton เป็นพื้นฐาน นอกจากนี้ ยังมาพร้อมกับบริบทที่ DXVK ได้พัฒนาไปสู่เวอร์ชัน 1.4 ของตัวเองแล้ว ซึ่งช่วยเสริมความแข็งแกร่งให้กับระบบนิเวศการแปลง DirectX → Vulkan โดยรวม
ในบรรทัดต่อไปนี้ เราจะมาทบทวนกัน คุณสมบัติใหม่ที่สำคัญที่สุดของ D7VK 1.4 และวิธีการทำงานร่วมกับระบบนิเวศ DXVK/Wineเราจะกล่าวถึงสิ่งที่โปรแกรมนี้มีให้ในแง่ของความเข้ากันได้และประสิทธิภาพกับเกมเก่าๆ ข้อจำกัดของมัน และวิธีการเริ่มต้นใช้งานบนระบบ Linux ของคุณ (และแม้แต่บน Windows แต่เป็นการใช้งานรอง) นอกจากนี้เราจะกล่าวถึงคุณสมบัติหลักของ DXVK 1.4 โดยสังเขป เนื่องจากแนวคิดและหลักการหลายอย่างนั้นคล้ายคลึงและเสริมกัน
D7VK คืออะไรกันแน่ และมันช่วยแก้ปัญหาอะไร?
D7VK คือ เลเยอร์การแปลที่ใช้ Vulkan ออกแบบมาเพื่อใช้งานกับแอปพลิเคชันและเกม 3 มิติรุ่นเก่า ที่ใช้ Direct3D 7, 6 และ 5 บน Linux ผ่าน Wine แทนที่จะสร้างระบบ Direct3D และ DirectDraw ทั้งหมดขึ้นมาใหม่ตั้งแต่ต้น D7VK อาศัยแบ็กเอนด์ D3D9 ของ DXVK และการใช้งาน DDraw ของ Wine (หรือแม้แต่ของ Windows เอง) เพื่อทำหน้าที่เป็นตัวกลางแบบเรียบง่ายระหว่างทั้งสองระบบ
กล่าวโดยสรุป เราอาจกล่าวได้ว่า D7VK ทำหน้าที่เป็น "ตัวแปล" ระหว่างเกม Direct3D 5/6/7 รุ่นเก่ากับ DXVKซึ่งจะแปลงทุกอย่างเป็น Vulkan ในที่สุด ด้วยวิธีนี้ เกมคลาสสิกหลายเกมจึงสามารถใช้ประโยชน์จากข้อดีของ Vulkan (ลดภาระการทำงาน ใช้ CPU ได้ดีขึ้น บริหารจัดการทรัพยากรได้ดีขึ้น) โดยที่นักพัฒนาไม่จำเป็นต้องแก้ไขโค้ดแม้แต่บรรทัดเดียว
มันเป็นสิ่งสำคัญที่จะเข้าใจว่า เป้าหมายหลักของ D7VK คือการมอบความเข้ากันได้ที่ดีกับ D3D7เพิ่มการสนับสนุน "เชิงทดลอง" สำหรับ D3D6 และ D3D5 เนื่องจากยิ่งย้อนกลับไปในประวัติศาสตร์ของ DirectX มากเท่าไหร่ API ก็ยิ่ง "มีปัญหา" มากขึ้นเท่านั้น และการทำงานร่วมกับ DDraw และ GDI ก็ยิ่งหายากขึ้นเท่านั้น
สถาปัตยกรรมและขอบเขตของ D7VK
สถาปัตยกรรมของ D7VK นั้นตั้งอยู่บนแนวทางที่เน้นการใช้งานได้จริงเป็นอย่างมาก: มันอาศัย DXVK (โดยเฉพาะแบ็กเอนด์ D3D9) และ DDraw ของ Wine เพื่อสร้างเลเยอร์บาง ๆ ที่นำเอาเฉพาะสิ่งที่จำเป็นจาก D3D7/6/5 มาใช้ แทนที่จะเขียน DirectDraw และ API ทั้งหมดก่อน D3D8 ใหม่ทั้งหมด มันจะรวมเอาเฉพาะส่วนที่จำเป็นที่สุดเพื่อให้เกมสามารถสื่อสารกับ DXVK ได้อย่างถูกต้อง
ซึ่งหมายความว่า บทความนี้ไม่ได้มีจุดประสงค์เพื่อครอบคลุมทุกแง่มุมที่มืดมนที่สุดของ DDrawโดยเฉพาะอย่างยิ่งสำหรับแอปพลิเคชันที่ผสมผสาน D3D กับ GDI หรือ DirectX เวอร์ชันต่างๆ อย่างไม่ละอายใจ ในกรณีเช่นนี้ ผู้เขียน D7VK เองแนะนำอย่างยิ่งให้ใช้ WineD3D ซึ่งแม้จะมีประสิทธิภาพน้อยกว่าเล็กน้อย แต่ก็สามารถใช้งานได้เกือบทุกอย่างและจัดการกับปฏิสัมพันธ์ที่ "ยุ่งยาก" เหล่านั้นได้ดีกว่ามาก
โดยอาศัย DXVK สำหรับ D3D9 ตัวเลือกการกำหนดค่า DXVK ทั้งหมดสำหรับ D3D9 สามารถนำไปใช้กับ D7VK ได้รวมถึงพารามิเตอร์ต่างๆ เช่น ขีดจำกัด FPS การควบคุม VSync หน้าจอแสดงผลข้อมูลประสิทธิภาพ (HUD) และการปรับแต่งพฤติกรรมภายใน ดังนั้น D7VK จึงสืบทอดความสมบูรณ์และประสิทธิภาพมากมายจาก DXVK ที่สั่งสมมาตลอดหลายปี
คุณสมบัติใหม่ที่สำคัญของ D7VK 1.4
D7VK เวอร์ชัน 1.4 นำเสนอคุณสมบัติใหม่ มีการปรับปรุงที่สำคัญหลายประการโดยมีเป้าหมายเพื่อให้เข้ากันได้กับเกมบางเกม และปรับปรุงรายละเอียดเล็กๆ น้อยๆ ของการแสดงผลกราฟิกให้ดียิ่งขึ้นไม่มีการเปลี่ยนแปลงครั้งใหญ่ในด้านสถาปัตยกรรม แต่มีการพัฒนาหลายอย่างที่เมื่อรวมกันแล้วทำให้เกมหลายเกมที่เคยมีปัญหา สามารถเล่นได้อย่างสมบูรณ์
การรองรับสีโปร่งใสที่สำคัญ
หนึ่งในจุดเด่นที่สำคัญของ D7VK 1.4 คือการนำฟังก์ชันการทำงานต่างๆ มาใช้ การรองรับความโปร่งใสของคีย์สี ซึ่งเป็นเทคนิคที่ใช้กันอย่างแพร่หลายในยุคแรกๆ ของ Direct3D เป็นทางเลือกราคาประหยัดแทนการทดสอบอัลฟ่า แทนที่จะใช้ช่องอัลฟ่า จะใช้สีเฉพาะเพื่อทำเครื่องหมายพิกเซลโปร่งใส ซึ่งหากการแปลไม่สมบูรณ์ จะทำให้เกิดบล็อกสีทึบในบริเวณที่ควรโปร่งใส
ขอขอบคุณการทำงานของชุมชน โดยเฉพาะอย่างยิ่งของ @CkNoSFeRaTU ตอนนี้ D7VK สามารถจัดการกับความโปร่งใสของสีหลักประเภทนั้นได้อย่างถูกต้องแล้วการแก้ไขปัญหานี้ช่วยแก้ปัญหาภาพสีเพี้ยนที่ปรากฏในเกมต่างๆ เช่น Arx Fatalis, Messiah, Darkstone, Divine Divinity, Mortal Kombat 4 และเกมอื่นๆ อีกมากมายที่ใช้เทคนิคกราฟิกนี้ในขณะนั้น
ปรับปรุงการทำงานร่วมกันกับ DDraw และเกมที่มีตัวละครหัวโตให้ดียิ่งขึ้น
อีกด้านหนึ่งที่มีความก้าวหน้าอย่างเห็นได้ชัดคือในด้าน... การรวมระบบการทำงานร่วมกันระหว่าง DDraw และ D3D เวอร์ชันต่างๆ ที่รองรับAPI DirectDraw และ Direct3D รุ่นเก่าถูกนำมาผสมผสานกันในรูปแบบที่ไม่เป็นไปตามแบบแผนทั่วไป และบ่อยครั้งที่เกมทำสิ่งต่างๆ ที่จากมุมมองในปัจจุบันแล้วดูไม่สมเหตุสมผล
ใน D7VK 1.4 ได้มีการทุ่มเทการทำงานอย่างมากในด้านต่างๆ ดังนี้ รวมและเสริมสร้างวิธีการจัดการปฏิสัมพันธ์ระหว่าง DDraw และ D3D7/6/5 ให้ดียิ่งขึ้นนั่นหมายความว่าเกมอย่าง Plants vs Zombies และเกมอื่นๆ จากค่าย PopCap ในยุคเดียวกัน จากเดิมที่เล่นไม่ได้หรือไม่เสถียร กลับมาเล่นได้อย่างถูกต้องแล้ว
ด้วยความช่วยเหลือจากชุมชน ปัญหาเหล่านี้จึงได้รับการแก้ไขแล้ว บั๊กที่เกี่ยวข้องกับการสร้างอินสแตนซ์ DDraw ผ่าน IClassFactoryข้อบกพร่องนี้ทำให้เกมอย่าง Re-Volt และ Sea Dogs เล่นไม่ได้ แต่ตอนนี้เกมเหล่านั้นเล่นได้แล้ว ซึ่งเป็นการเพิ่มจำนวนเกมคลาสสิกที่สามารถเล่นบน D7VK ได้โดยไม่มีปัญหา
การปรับปรุงเชิงลึก การทำความสะอาด และการแก้ไขสำหรับเกมบางเกม
โดยใช้ประโยชน์จากเบาะแสที่ได้รับจากผู้ร่วมงาน เช่น @Trass3r ใน D7VK 1.4 ได้เพิ่มการรองรับการล้างค่าความลึกที่เริ่มต้นจาก DDraw แล้วคุณสมบัติข้อนี้ ซึ่งอาจฟังดูเฉพาะเจาะจงมาก เป็นสิ่งสำคัญสำหรับเกมบางเกมในการจัดการบัฟเฟอร์ความลึกอย่างถูกต้อง และป้องกันไม่ให้เกิดข้อผิดพลาดเรื่อง z-fighting หรือองค์ประกอบที่วาดไม่ดี
นอกจากนี้ ยังได้มีการรวมเข้าไว้ด้วย การสนับสนุนเบื้องต้นสำหรับการเขียนข้อมูลกลับเชิงลึก โดยปัจจุบันเน้นที่รูปแบบ D16การปรับปรุงนี้ส่งผลให้ปัญหาการบดบังแหล่งกำเนิดแสงได้รับการแก้ไขในเกมต่างๆ เช่น Star Wars Episode I: Racer ซึ่งก่อนหน้านี้แสงไฟมีพฤติกรรมที่ไม่สมจริงหรือไม่ก็ไม่หายไปเมื่อควรจะหายไป
รายการเปลี่ยนแปลงของ D7VK 1.4 ยังรวมถึงสิ่งต่อไปนี้ด้วย แก้ไขปัญหาเกมค้างในช่วงเริ่มต้นของ V-Rally 2 Expert Editionรวมถึงการแก้ไข "กรณีพิเศษ" หลายประการที่อาจทำให้เกม D3D หรือ DDraw รุ่นเก่าเกิดการขัดข้อง ค้าง หรือแสดงพฤติกรรมผิดปกติอื่นๆ เกมที่ได้รับประโยชน์จากการแก้ไขนี้ ได้แก่ Revenant, Powerslide และ Slave Zero นอกจากนี้ยังมีวิธีแก้ไขเฉพาะสำหรับปัญหาเกมขัดข้องที่อาจเกิดขึ้นเมื่อกลับไปยังเมนูหลักใน GTA 2 อีกด้วย
การติดตั้งและการใช้งาน D7VK ขั้นพื้นฐาน
การติดตั้งและใช้งาน D7VK ใน Wine prefix นั้นค่อนข้างง่าย: เพียงแค่คัดลอกไฟล์ ddraw.dll ถัดจากไฟล์ปฏิบัติการของเกมหรือแอปพลิเคชัน จากนั้นกำหนดค่าการแทนที่ที่เหมาะสมใน Wine เพื่อใช้ DLL นั้นเป็นคำสั่งหลัก
โดยเฉพาะใน winecfg จำเป็นต้องเพิ่มการแทนที่ "native, builtin" สำหรับไลบรารี ddraw ในแท็บ Libraries ตรวจสอบให้แน่ใจว่าได้ระบุลำดับที่ถูกต้องแล้ว ไม่ต้องกังวลเรื่องสถาปัตยกรรม เพราะ DDraw และ D3D รุ่นเก่าๆ นั้นรองรับเฉพาะสถาปัตยกรรม 32 บิตมาโดยตลอด
นอกจากนี้ยังมี จำเป็นต้องใช้เส้นทางการติดตั้งทางเลือกสำหรับเกมพิเศษบางเกม เช่น GTA 2, StarLancer หรือ Midtown Madness 2ในกรณีนั้น จะต้องเปลี่ยนชื่อ ddraw.dll จากระบบไวน์ถึง ddraw_.dll และคัดลอก ddraw.dll จาก D7VK ไปยังไดเร็กทอรี system32 o syswow64 ภายในคำนำหน้าตามบิตของมัน D7VK จะพยายามโหลดก่อน ddraw_.dll จากเส้นทางปัจจุบันก่อนที่จะหันไปใช้ ddraw.dll ของระบบ จึงทำให้ทั้งสองส่วนสามารถอยู่ร่วมกันได้
D7VK สามารถใช้งานได้บนระบบปฏิบัติการ Windows เช่นกัน แม้ว่า ไม่ใช่แพลตฟอร์มหลักที่ใช้ในการพัฒนาหรือทดสอบในกรณีนั้น ให้คัดลอกได้เลย ddraw.dll โดยปกติแล้วไฟล์ executable ของเกมจะถูกจัดเก็บไว้ในที่เดียวกัน แต่ไม่แนะนำอย่างยิ่งให้วางไว้ในไดเร็กทอรีระบบของ Windows เนื่องจากต้องใช้โปรแกรม DDraw เวอร์ชันจริง และอาจทำให้การติดตั้งเสียหายอย่างร้ายแรงได้
DXVK 1.4: บริบทและการทำงานร่วมกับ D7VK
ประวัติของ D7VK มีความเชื่อมโยงอย่างแน่นหนากับ วิวัฒนาการของโครงการ DXVK เอง ซึ่งเป็นแกนหลักของการแปลง Direct3D เป็น Vulkan สำหรับเกมรุ่นใหม่ๆ (โดยเฉพาะ Direct3D 10 และ 11) DXVK เวอร์ชัน 1.4 ถือเป็นก้าวสำคัญที่ส่งผลต่อวิธีการผสานรวมเลเยอร์ต่างๆ เช่น D7VK หรือ D8VK ด้วย
DXVK 1.4 อัปเดตแล้ว อินเทอร์เฟซ Direct3D 11 จนถึงเวอร์ชัน 11.4 ที่รวมอยู่ใน Windows 10 (build 1903)สิ่งนี้ทำให้สามารถแก้ไขปัญหาเฉพาะบางอย่างในเกม เช่น Plants vs. Zombies: Battle for Neighborville ได้ API ใหม่ที่เปิดตัวใน D3D11.4 นั้นถูกนำมาใช้เพียงบางส่วน โดยเน้นไปที่ฟีเจอร์ที่เหมาะสมกับฟังก์ชันการทำงานของ Vulkan ที่มีอยู่แล้ว
เดอะ อินเทอร์เฟซ DXGI เวอร์ชัน 1.5 รวมถึงความสามารถในการตรวจสอบการรองรับ HDR (แม้ว่าจะยังไม่มีเอาต์พุต HDR ในตัวก็ตาม) นอกจากนี้ ยังมีการเพิ่มวิธีการโต้ตอบ DXGI-GDI ซึ่งช่วยอำนวยความสะดวกในการเริ่มต้นใช้งานไคลเอ็นต์ต่างๆ เช่น Rockstar Game Launcher โดยมีเงื่อนไขว่าต้องมีการแก้ไข Direct2D เฉพาะใน Wine ด้วย
ประสิทธิภาพและการปรับปรุงภายในของ DXVK 1.4
ในแง่ของประสิทธิภาพ DXVK 1.4 นำมาซึ่งการปรับปรุงที่น่าสนใจหลายประการ ฟีเจอร์เหล่านี้ส่งผลต่อเกม Direct3D 11 หลายเกม ช่วยเพิ่มความลื่นไหลและลดภาระการทำงานของ CPUหนึ่งในสิ่งที่โดดเด่นที่สุดคือการเปิดใช้งานตัวเลือกโดยค่าเริ่มต้น d3d11.allowMapFlagNoWaitซึ่งช่วยเพิ่มประสิทธิภาพในเกมบางเกมโดยอนุญาตให้จัดการทรัพยากรที่แมปไว้ได้อย่างมีประสิทธิภาพมากขึ้น
พวกเขายังมีความมุ่งมั่นอีกด้วย ปัญหาที่ทำให้เกม The Witcher 3 ไม่สามารถเปิดตัวได้อย่างถูกต้องพฤติกรรมการซิงโครไนซ์ได้รับการปรับปรุงให้คล้ายคลึงกับคอนโทรลเลอร์ D3D11 รุ่นดั้งเดิมมากขึ้น นอกจากนี้ ยังได้แก้ไขปัญหาคอขวดที่อาจเกิดขึ้นในเกมที่ใช้บริบทแบบเลื่อนเวลาอย่างหนัก เช่น Dark Souls III และ Sekiro: Shadows Die Twice อีกด้วย
DXVK 1.4 ปรับปรุงประสิทธิภาพได้อย่างมาก การติดตามทรัพยากรภายใน ช่วยลดการใช้ CPU ลงเล็กน้อย โดยการจัดการบัฟเฟอร์ เท็กซ์เจอร์ และองค์ประกอบกราฟิกอื่นๆ งานภายในทั้งหมดนี้ แม้ว่าจะไม่ปรากฏให้ผู้ใช้เห็นเสมอไป แต่ก็เป็นการวางรากฐานสำหรับการบูรณาการที่ราบรื่นยิ่งขึ้นกับเลเยอร์ต่างๆ เช่น D7VK ซึ่งต้องการแบ็กเอนด์ D3D9/D3D11 ที่แข็งแกร่งที่สุดเท่าที่จะเป็นไปได้
การติดตั้ง DXVK 1.4 บน Wine ในทางปฏิบัติ
สำหรับผู้ที่ต้องการใช้งาน DXVK โดยตรงบน Wine ขั้นตอนการทำงานโดยทั่วไปมีดังนี้ ดาวน์โหลดแพ็กเกจ DXVK เวอร์ชันเสถียร แตกไฟล์ และเรียกใช้สคริปต์การติดตั้งในตำแหน่ง Wine ที่ต้องการตัวอย่างเช่น ในเวอร์ชัน 1.4 คุณสามารถทำสิ่งต่อไปนี้ได้:
ขั้นแรก ดาวน์โหลดไฟล์โดยใช้เครื่องมือเช่น wget จากลิงก์ GitHub อย่างเป็นทางการ:
wget https://github.com/doitsujin/dxvk/releases/download/v1.4/dxvk-1.4.tar.gz
จากนั้นจึงทำการคลายไฟล์บีบอัดด้วย แตกไฟล์ tar แล้วเข้าถึงโฟลเดอร์ที่แตกไฟล์ออกมา:
tar -xzvf dxvk-1.4.tar.gz
cd dxvk-1.4
สุดท้าย สคริปต์การติดตั้งจะถูกเรียกใช้กับ Wine prefix ที่ใช้งานอยู่โดยใช้ ง่ายๆ sh setup-dxvk.sh install ด้วยสิทธิพิเศษที่เหมาะสม:
sudo sh setup-dxvk.sh install
สคริปต์ยังอนุญาตให้ ให้ใช้การใช้งาน DXGI ของ Wine แทนการใช้งาน DXVK หากคุณต้องการใช้ vkd3d สำหรับเกม Direct3D 12 และ DXVK สำหรับเกม Direct3D 11 คุณสามารถทำได้โดยการเรียกใช้คำสั่งต่อไปนี้:
setup-dxvk.sh install --without-dxgi
อีกหนึ่งทางเลือกที่ใช้งานได้จริงซึ่งบทภาพยนตร์นำเสนอคือ ติดตั้งไฟล์ DLL ในรูปแบบลิงก์สัญลักษณ์ (โดยใช้ตัวเลือก) --symlinkซึ่งทำให้การอัปเดตพรีฟิกซ์ Wine หลายรายการพร้อมกันทำได้ง่ายขึ้นมาก เพียงแค่อัปเดตสำเนาส่วนกลางของ DXVK เพียงชุดเดียวก็เพียงพอแล้ว
เมื่อพิจารณาโดยรวมแล้ว D7VK 1.4 และ DXVK 1.4 พวกมันช่วยเสริมสร้างระบบนิเวศให้แข็งแกร่งขึ้น ซึ่งใน Linux และ Wine กำลังสร้างชื่อเสียงในฐานะแพลตฟอร์มที่จริงจังสำหรับการเล่นเกมทั้งเกมคลาสสิก Direct3D 5/6/7 และเกมสมัยใหม่ D3D10/11นำเสนอประสิทธิภาพที่ใกล้เคียงกับ Windows อย่างน่าประหลาดใจ และเหนือสิ่งอื่นใด คือความเข้ากันได้ที่กว้างขวางมากขึ้นกับ API รุ่นเก่าที่ดูเหมือนจะถูกลืมไปแล้ว