แพทช์ในเกมทำงานอย่างไร


37

บางครั้งเกมคอนโซลและพีซีมีแพตช์เพื่อแก้ไขข้อบกพร่องที่นักพัฒนาพลาด / ไม่มีเวลาแก้ไข

คำถามของฉันคือทำงานเหล่านี้ได้อย่างไร

บางครั้งไฟล์แพตช์มีขนาดไม่กี่เมกะไบต์ ฉันไม่เข้าใจว่าไฟล์ขนาดเล็กสามารถเปลี่ยนแปลงโปรแกรมที่เป็นไปตามข้อกำหนดได้อย่างไร


คุณต้องการเปลี่ยนเกมที่คอมไพล์แล้วที่ทำโดยใช้โปรแกรมปะแก้เล็ก ๆ หรือไม่?
wolfdawn

ไม่ฉันแค่สนใจในทฤษฎีที่อยู่เบื้องหลัง เกมของฉันมีขนาดเล็กพอที่จะคอมไพล์พวกเขาอีกครั้งและแจกจ่ายเกมทั้งหมดอีกครั้ง :)
MulletDevil

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

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

2
เมกะไบต์ไม่กี่อาจมีขนาดเล็กทั้งหมดขึ้นอยู่กับสิ่งที่อยู่ในนั้นและเปอร์เซ็นต์ของ codebase ทั้งหมดที่เป็น หากพูดว่าต้องเปลี่ยนแผนที่ทั้งระดับ 3D เนื่องจากรูปแบบไฟล์ที่เลือกเป็นต้นรวมถึงพื้นผิวทั้งหมดและอะไรที่ไม่กี่เมกะไบต์อาจมีขนาดเล็กมาก
jwenting

คำตอบ:


30

มีหลายวิธีในการทำเช่นนี้วิธีที่ง่ายที่สุดคือการ XOR ทั้งสองไฟล์และบีบอัดไฟล์เหล่านั้น (GZIP หรืออื่น ๆ ) ทฤษฏีเบื้องหลังนี้คือหวังว่าคุณจะได้เลขศูนย์จำนวนมาก (ลำดับที่ยาวของค่าเดียวกันบีบอัดได้ดี)

คุณสามารถนำแนวคิดนั้นไปใช้เพิ่มเติมและลองค้นหาพื้นที่ของไฟล์ทั้งสองที่มีข้อมูลเหมือนกันและละเว้นมันทั้งหมด

สุดท้ายคุณสามารถใช้โครงสร้างของไฟล์แต่ละประเภทเพื่อผลประโยชน์ของคุณ ตัวอย่างเช่นใน EXE คุณสามารถจัดแพคเกจแต่ละวิธีแยกกัน (เฉพาะที่เปลี่ยน) และสร้าง EXE ด้วยตัวคุณเองใหม่ในระหว่างการใช้โปรแกรมปะแก้ อย่างไรก็ตามโปรดทราบว่านี่อาจเป็นไปได้ในขอบเขตของ overkill และอาจไม่คุ้มค่ากับความพยายาม (การได้รับ bdiff ที่ง่ายอาจไม่แสดงให้เห็นถึงความซับซ้อนพิเศษที่อาจทำลายป่า) เป็นอีกตัวอย่างหนึ่งที่คุณสามารถใช้ไฟล์ diff สำหรับสคริปต์

แต่ส่วนใหญ่ระบบปะในป่าใช้เส้นทางที่ง่าย: พวกเขาเพียงแค่ไฟล์แพคเกจที่มีการเปลี่ยนแปลง - พวกเขาไม่พยายามที่จะเปลี่ยนแปลงแพคเกจเฉพาะภายในไฟล์เหล่านั้น (อาจจะด้วยเหตุผลที่ดีเนื้อหาของเกมส่วนใหญ่จะถูกบีบอัดแล้วและการสร้างแพทช์ต่อต้านสูง เอนโทรปีหรือข้อมูลที่ถูกบีบอัดจะไม่ทำงานเลย )


คุณหมายถึงอะไรโดยแพ็คเกจแต่ละวิธีใน exe เป็นรายบุคคล มันใช้ได้จริงเหรอ?
wolfdawn

@ArthurWulfWhite ใช่ สำหรับบ้านอินดี้อาจไม่คุ้มค่ากับเวลาเพราะต้องใช้เวลาและความพยายามอย่างมาก (คุณต้องเขียน linker ของคุณเอง) - ในฐานะ บริษัท ที่เกี่ยวข้องกับ 'เทคโนโลยีการปะแก้' โดยเฉพาะมันจะคุ้มค่ากับความพยายาม ทุกอย่างขึ้นอยู่กับรหัสที่สามารถใช้งานได้ขนาดใหญ่ - ฉันลองดู Sacred 2 อย่างรวดเร็วและเป็น 26mb (8mb สำหรับ EXE หลัก) ความแตกต่างแบบไบนารีอาจสามารถเข้าใกล้มันได้ แต่ถึงกระนั้นก็เป็นความคิดที่คุ้มค่าที่จะออกไปที่นั่น (ฉันรู้ว่า CABs ได้รับการบีบอัดที่ดีใน EXEs เพราะพวกเขาใช้ประโยชน์จากโครงสร้าง)
Jonathan Dickinson

นั่นเป็นเรื่องที่น่าสนใจมาก ฉันคิดว่าแบนด์วิธเป็นสิ่งที่เป็นอยู่ทุกวันนี้การลดขนาดของแพทช์เกมไม่ใช่ปัญหาหลัก +1 คำตอบที่คิดออกน่าสนใจดี
wolfdawn

มันเป็นไปไม่ได้ที่จะทำการปะแก้ในแต่ละวิธีในเกมส่วนใหญ่ คอมไพเลอร์สามารถมีผลลัพธ์ที่แตกต่างกันค่อนข้างมากกับการเปลี่ยนแปลงรหัสง่าย ๆ การตัดสินใจที่อินไลน์โดยอัตโนมัติสามารถเปลี่ยนแปลงเค้าโครงตารางสัญลักษณ์สามารถเปลี่ยนแปลงได้ ฯลฯ การเปลี่ยนแปลงโค้ดมักจะเปลี่ยนโครงสร้าง API ภายใน การปรับให้เหมาะสมทำให้เบลอเส้นแบ่งระหว่างขอบเขตของฟังก์ชันเมื่อเทียบกับสิ่งที่คุณเห็นในโปรแกรมแก้ไขรหัสของคุณ ระบบ DRM ยังทำให้โคลนเป็นอย่างมาก ระบบแก้ไขใช้การแทนที่แบบขายส่งหรือส่วนต่างแบบไบนารีและบีบอัดข้อมูล อะไรก็ตามที่คุณแนะนำนั้นช่างบอบบางเกินกว่าจะส่งในโลกแห่งความเป็นจริง imo
Sean Middleditch เมื่อ

2
@SeanMiddleditch ฉันจะทำเพื่อพิสูจน์ว่าเป็นไปได้ :)
Jonathan Dickinson

15

รหัสที่สามารถใช้งานได้ของเกมไม่ได้อยู่ในความสามารถในการปฏิบัติการ แต่มักจะถูกแบ่งออกเป็นหลายไลบรารีแบบไดนามิก (ตัวอย่างเช่นเกมกราฟิกและเสียงเครื่องยนต์) ไฟล์ปฏิบัติการจริงและสคริปต์จำนวนมากสำหรับวัตถุประสงค์ต่างๆ

โปรแกรมแก้ไขอาจแก้ไขปัญหาในส่วนใดส่วนหนึ่งเหล่านี้โดยไม่มีการรับประกันการเปลี่ยนแปลงในทุกส่วน

วิธีการที่แตกต่างจากการแทนที่ไฟล์ที่ถูกเปลี่ยนทั้งหมดอาจเป็นการทำไบนารีที่แตกต่างกันและเพียงแค่แพ็คแพ็กเกจความแตกต่างที่เกิดขึ้นจริงเพื่อทำการแจกจ่ายต่อ

(แน่นอนว่าจะใช้งานได้เฉพาะกับไฟล์ที่คุณสามารถรับประกันว่าผู้ใช้จะไม่เปลี่ยนแปลง)


2
คุณสามารถพูดถึงสิ่งนี้ได้เป็นตัวอย่าง: daemonology.net/bsdiff
wolfdawn

2
คำตอบที่ดีในทางปฏิบัติ +1
wolfdawn

2

โดยปกติแล้วพวกเขาจะใช้ระบบต่างเลขฐานสองของ บริษัท อื่นเพื่อแจกจ่ายแพตช์ไปยังข้อมูลเกม โดยทั่วไปไฟล์ปฏิบัติการจะมีขนาดเล็กพอที่จะแจกจ่ายได้เล็กน้อย

เกมสมัยใหม่ส่วนใหญ่มีข้อมูลเกมเป็นร้อยเมกะไบต์ (ส่วนใหญ่เป็นพื้นผิวแบบจำลองข้อมูลระดับเป็นต้น) สิ่งเหล่านี้ต้องมีการปะแก้บ่อย ๆ เท่าที่ฉันรู้สำนักพิมพ์มักจะมีวิธีการที่เป็นกรรมสิทธิ์ของการทำเช่นนี้

จำเป็นต้องพูดมีตัวอย่างโอเพนซอร์สอยู่ Linux ลีนุกซ์บางตัว (Fedora?) ใช้เลขฐานสองสำหรับแพทช์ คุณสามารถตรวจสอบเหล่านั้นและอ่านซอร์สโค้ดหรือเอกสารของพวกเขา


-1

diffอัลกอริทึมที่ทันสมัยสามารถค้นหาลำดับไบต์ที่มีร่วมกันระหว่างสองไบนารีอย่างมีประสิทธิภาพ ไม่น่าแปลกใจถ้าคุณคิดเกี่ยวกับมัน การบีบอัดไฟล์ขึ้นอยู่กับการค้นหาลำดับไบต์ที่เหมือนกันเช่นกัน

เมื่อคุณมีรายการลำดับของไบต์ที่เหมือนกันคุณจะต้องส่งออฟเซ็ตเก่าและใหม่ความยาวและแน่นอนว่ามีอะไรใหม่ที่สมบูรณ์ ในด้านของการรับมันจะเป็นการชุมนุมที่ตรงไปตรงมา คัดลอกบิตที่คุณต้องการเก็บจากไฟล์เก่าเติมบิตใหม่

การสร้างแพตช์จะง่ายยิ่งขึ้นถ้าลิงเกอร์ของคุณสามารถคายไฟล์แผนที่ซึ่งแสดงรายการออฟเซ็ตของทุกฟังก์ชั่นในไฟล์

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