บางครั้งเกมคอนโซลและพีซีมีแพตช์เพื่อแก้ไขข้อบกพร่องที่นักพัฒนาพลาด / ไม่มีเวลาแก้ไข
คำถามของฉันคือทำงานเหล่านี้ได้อย่างไร
บางครั้งไฟล์แพตช์มีขนาดไม่กี่เมกะไบต์ ฉันไม่เข้าใจว่าไฟล์ขนาดเล็กสามารถเปลี่ยนแปลงโปรแกรมที่เป็นไปตามข้อกำหนดได้อย่างไร
บางครั้งเกมคอนโซลและพีซีมีแพตช์เพื่อแก้ไขข้อบกพร่องที่นักพัฒนาพลาด / ไม่มีเวลาแก้ไข
คำถามของฉันคือทำงานเหล่านี้ได้อย่างไร
บางครั้งไฟล์แพตช์มีขนาดไม่กี่เมกะไบต์ ฉันไม่เข้าใจว่าไฟล์ขนาดเล็กสามารถเปลี่ยนแปลงโปรแกรมที่เป็นไปตามข้อกำหนดได้อย่างไร
คำตอบ:
มีหลายวิธีในการทำเช่นนี้วิธีที่ง่ายที่สุดคือการ XOR ทั้งสองไฟล์และบีบอัดไฟล์เหล่านั้น (GZIP หรืออื่น ๆ ) ทฤษฏีเบื้องหลังนี้คือหวังว่าคุณจะได้เลขศูนย์จำนวนมาก (ลำดับที่ยาวของค่าเดียวกันบีบอัดได้ดี)
คุณสามารถนำแนวคิดนั้นไปใช้เพิ่มเติมและลองค้นหาพื้นที่ของไฟล์ทั้งสองที่มีข้อมูลเหมือนกันและละเว้นมันทั้งหมด
สุดท้ายคุณสามารถใช้โครงสร้างของไฟล์แต่ละประเภทเพื่อผลประโยชน์ของคุณ ตัวอย่างเช่นใน EXE คุณสามารถจัดแพคเกจแต่ละวิธีแยกกัน (เฉพาะที่เปลี่ยน) และสร้าง EXE ด้วยตัวคุณเองใหม่ในระหว่างการใช้โปรแกรมปะแก้ อย่างไรก็ตามโปรดทราบว่านี่อาจเป็นไปได้ในขอบเขตของ overkill และอาจไม่คุ้มค่ากับความพยายาม (การได้รับ bdiff ที่ง่ายอาจไม่แสดงให้เห็นถึงความซับซ้อนพิเศษที่อาจทำลายป่า) เป็นอีกตัวอย่างหนึ่งที่คุณสามารถใช้ไฟล์ diff สำหรับสคริปต์
แต่ส่วนใหญ่ระบบปะในป่าใช้เส้นทางที่ง่าย: พวกเขาเพียงแค่ไฟล์แพคเกจที่มีการเปลี่ยนแปลง - พวกเขาไม่พยายามที่จะเปลี่ยนแปลงแพคเกจเฉพาะภายในไฟล์เหล่านั้น (อาจจะด้วยเหตุผลที่ดีเนื้อหาของเกมส่วนใหญ่จะถูกบีบอัดแล้วและการสร้างแพทช์ต่อต้านสูง เอนโทรปีหรือข้อมูลที่ถูกบีบอัดจะไม่ทำงานเลย )
รหัสที่สามารถใช้งานได้ของเกมไม่ได้อยู่ในความสามารถในการปฏิบัติการ แต่มักจะถูกแบ่งออกเป็นหลายไลบรารีแบบไดนามิก (ตัวอย่างเช่นเกมกราฟิกและเสียงเครื่องยนต์) ไฟล์ปฏิบัติการจริงและสคริปต์จำนวนมากสำหรับวัตถุประสงค์ต่างๆ
โปรแกรมแก้ไขอาจแก้ไขปัญหาในส่วนใดส่วนหนึ่งเหล่านี้โดยไม่มีการรับประกันการเปลี่ยนแปลงในทุกส่วน
วิธีการที่แตกต่างจากการแทนที่ไฟล์ที่ถูกเปลี่ยนทั้งหมดอาจเป็นการทำไบนารีที่แตกต่างกันและเพียงแค่แพ็คแพ็กเกจความแตกต่างที่เกิดขึ้นจริงเพื่อทำการแจกจ่ายต่อ
(แน่นอนว่าจะใช้งานได้เฉพาะกับไฟล์ที่คุณสามารถรับประกันว่าผู้ใช้จะไม่เปลี่ยนแปลง)
โดยปกติแล้วพวกเขาจะใช้ระบบต่างเลขฐานสองของ บริษัท อื่นเพื่อแจกจ่ายแพตช์ไปยังข้อมูลเกม โดยทั่วไปไฟล์ปฏิบัติการจะมีขนาดเล็กพอที่จะแจกจ่ายได้เล็กน้อย
เกมสมัยใหม่ส่วนใหญ่มีข้อมูลเกมเป็นร้อยเมกะไบต์ (ส่วนใหญ่เป็นพื้นผิวแบบจำลองข้อมูลระดับเป็นต้น) สิ่งเหล่านี้ต้องมีการปะแก้บ่อย ๆ เท่าที่ฉันรู้สำนักพิมพ์มักจะมีวิธีการที่เป็นกรรมสิทธิ์ของการทำเช่นนี้
จำเป็นต้องพูดมีตัวอย่างโอเพนซอร์สอยู่ Linux ลีนุกซ์บางตัว (Fedora?) ใช้เลขฐานสองสำหรับแพทช์ คุณสามารถตรวจสอบเหล่านั้นและอ่านซอร์สโค้ดหรือเอกสารของพวกเขา
diff
อัลกอริทึมที่ทันสมัยสามารถค้นหาลำดับไบต์ที่มีร่วมกันระหว่างสองไบนารีอย่างมีประสิทธิภาพ ไม่น่าแปลกใจถ้าคุณคิดเกี่ยวกับมัน การบีบอัดไฟล์ขึ้นอยู่กับการค้นหาลำดับไบต์ที่เหมือนกันเช่นกัน
เมื่อคุณมีรายการลำดับของไบต์ที่เหมือนกันคุณจะต้องส่งออฟเซ็ตเก่าและใหม่ความยาวและแน่นอนว่ามีอะไรใหม่ที่สมบูรณ์ ในด้านของการรับมันจะเป็นการชุมนุมที่ตรงไปตรงมา คัดลอกบิตที่คุณต้องการเก็บจากไฟล์เก่าเติมบิตใหม่
การสร้างแพตช์จะง่ายยิ่งขึ้นถ้าลิงเกอร์ของคุณสามารถคายไฟล์แผนที่ซึ่งแสดงรายการออฟเซ็ตของทุกฟังก์ชั่นในไฟล์