Doom ทำงานต่อเนื่องเป็นเวลา 2.5 ปีก่อนจะเกิดข้อผิดพลาดจาก Integer Overflow Bug

ทีมบรรณาธิการ BigGo
Doom ทำงานต่อเนื่องเป็นเวลา 2.5 ปีก่อนจะเกิดข้อผิดพลาดจาก Integer Overflow Bug

การทดลองที่น่าทึ่งได้เผยให้เห็นถึงความแข็งแกร่งของเกมเอนจิ้น Doom ต้นฉบับปี 1993 อย่างแท้จริง ความอยากรู้ของนักพัฒนาเกี่ยวกับระบบเล่นเดโมของเกมนำไปสู่การทดสอบที่ไม่ธรรมดาเป็นเวลาสองปีครึ่งและค้นพบข้อจำกัดพื้นฐานที่เกมวิดีโอคลาสสิกหลายเกมมีร่วมกัน

การทดลองที่เริ่มต้นทุกอย่าง

ผู้ใช้ minki จาก Lenowo เริ่มต้นการเดินทางที่ไม่ธรรมดานี้หลังจากค้นพบวิธีที่เอนจิ้นของ Doom จัดการกับลำดับเดโมของมัน ทุกครั้งที่เดโมของเกมทำงานและรีเซ็ต เอนจิ้นจะเก็บตัวแปรใหม่ในสตริงที่เติบโตขึ้นเรื่อยๆ กระบวนการนี้ดำเนินต่อไปอย่างไม่มีที่สิ้นสุด ซึ่งในทางทฤษฎีนำไปสู่สภาวะ overflow ที่ข้อมูลเกินความจุการจัดเก็บของตัวแปรที่ใช้บรรจุข้อมูลนั้น

แทนที่จะปล่อยให้เป็นเพียงทฤษฎี minki ตัดสินใจทดสอบโดยใช้อุปกรณ์ PDA เก่า การเลือกฮาร์ดแวร์ไม่ใช่เรื่องบังเอิญ ความสามารถในตำนานของ Doom ที่สามารถทำงานบนอุปกรณ์เกือบทุกชนิดที่มีหน้าจอทำให้สิ่งนี้เป็นไปได้ PDA ได้รับพลังงานผ่าน UPS ที่เชื่อมต่อกับพอร์ต USB ของเราเตอร์ ให้แหล่งจ่ายไฟ 5V คงที่เพื่อให้มั่นใจว่าจะทำงานได้อย่างไม่หยุดชะงัก

การรอคอยที่ยาวนานและบทสรุปที่น่าทึ่ง

หลังจากทำงานต่อเนื่องเป็นเวลาสองปีครึ่งพอดี สิ่งที่หลีกเลี่ยงไม่ได้ก็เกิดขึ้น เพียงไม่กี่ชั่วโมงหลังจากข้ามจุดสำคัญนี้ Fatal Error popup ปรากฏขึ้นบนหน้าจอ ยืนยันว่าตัวแปรได้ overflow จริงๆ และทำให้เกิดการ crash ของระบบตามที่คาดการณ์ไว้ ช่วงเวลานี้ได้รับรองการคำนวณทางทฤษฎีหลายปีเกี่ยวกับข้อจำกัดภายในของเกม

รูปแบบที่พบในเกมคลาสสิกย้อนยุค

ปรากฏการณ์นี้ไม่ใช่เรื่องเฉพาะของ Doom ชุมชนเกมมิ่งได้บันทึกความแปลกประหลาดที่คล้ายกันในเกมคลาสสิกมากมาย เผยให้เห็นเส้นด้ายร่วมในวิธีที่เกมเก่าจัดการกับการติดตามเวลาและเหตุการณ์ Crash Bandicoot 3 แสดงพฤติกรรมที่แปลกประหลาดเป็นพิเศษเมื่อตัวจับเวลาโกลบอลของมัน overflow หลังจากเล่นต่อเนื่องประมาณ 2.27 ปี เมื่อเกิดเหตุการณ์นี้ เกมจะเข้าสู่สถานะที่เหนือจริงที่ศัตรูเคลื่อนที่ย้อนเวลา วัตถุหยุดนิ่ง และทั้งด่านพังทลายลงอย่างสิ้นเชิง

Final Fantasy IX นำเสนอกรณีที่น่าสนใจอีกกรณีหนึ่งด้วยดาบที่เป็นที่ปรารถนาซึ่งปกติแล้วต้องไปถึงดันเจี้ยนสุดท้ายภายใน 12 ชั่วโมงของการเล่นเกม อย่างไรก็ตาม ผู้เล่นที่อดทนค้นพบเส้นทางทางเลือก การปล่อยให้เกมทำงานประมาณสองปีทำให้ตัวนับนาฬิกาภายใน overflow และรีเซ็ต ทำให้อาวุธนั้นเข้าถึงได้อีกครั้ง การค้นพบนี้ทำให้ดาบได้รับการขนานนามที่ขบขันว่า missable within reason ในชุมชนเกมมิ่ง

ตัวอย่าง Integer Overflow ในเกมคลาสสิก

เกม เวลาที่เกิด Overflow ผลกระทบ
Doom (1993) 2.5 ปี เกิด Fatal Error crash
Crash Bandicoot 3 ~2.27 ปี ศัตรูเคลื่อนที่ถอยหลัง ด่านเสียหาย
Final Fantasy IX ~2 ปี นาฬิการีเซ็ต ดาบหายากสามารถหาได้
Paper Mario 4.5 ปี ตัวจับเวลาอบเค้กรีเซ็ตเป็นแบบสมบูรณ์แบบ
ภาพหน้าจอจาก Crash Bandicoot 3 แสดงให้เห็น glitch ที่น่าขันซึ่งเกิดจาก timer overflow หลังจากเล่นเกมเป็นเวลานาน
ภาพหน้าจอจาก Crash Bandicoot 3 แสดงให้เห็น glitch ที่น่าขันซึ่งเกิดจาก timer overflow หลังจากเล่นเกมเป็นเวลานาน

ความจริงทางเทคนิคเบื้องหลังความมหัศจรรย์

พฤติกรรมแปลกๆ เหล่านี้เกิดจากข้อจำกัดพื้นฐานของการจัดเก็บ integer ในระบบเกมเก่า เกมย้อนยุคส่วนใหญ่อาศัยตัวนับ 16-bit หรือ 32-bit ที่เพิ่มขึ้นทุก game tick เพื่อประสิทธิภาพ signed integer 16-bit สามารถเก็บค่าได้เพียงถึง 32,767 ในขณะที่ unsigned counterpart สูงสุดที่ 65,535 เมื่อเกมเอนจิ้นที่ทำงานที่ 30 หรือ 35 ticks ต่อวินาทีในที่สุดเกินขีดจำกัดเหล่านี้ ผลลัพธ์จะมีตั้งแต่ glitch ที่น่าขัน ไปจนถึงความล้มเหลวของระบบทั้งหมด

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

ข้อจำกัดการจัดเก็บข้อมูลจำนวนเต็ม

  • จำนวนเต็ม 16 บิตแบบมีเครื่องหมาย: ค่าสูงสุด 32,767
  • จำนวนเต็ม 16 บิตแบบไม่มีเครื่องหมาย: ค่าสูงสุด 65,535
  • จำนวนเต็ม 32 บิตแบบมีเครื่องหมาย: ค่าสูงสุด 2,147,483,647
  • อัตราการทำงานของเกม: โดยทั่วไปจะอยู่ที่ 30-35 ครั้งต่อวินาทีในเกมย้อนยุค

เครื่องพิสูจน์การออกแบบเกมวินเทจ

แทนที่จะเป็นตัวแทนของการเขียนโปรแกรมที่ไม่ดี ปัญหา overflow เหล่านี้เน้นย้ำถึงข้อจำกัดเชิงปฏิบัติและปรัชญาการออกแบบของการพัฒนาเกมยุคแรก นักพัฒนาได้ตั้งสมมติฐานที่สมเหตุสมผลเกี่ยวกับรูปแบบการใช้งานและปรับโค้ดให้เหมาะสมตามนั้น ความจริงที่ว่าเกมเหล่านี้สามารถทำงานต่อเนื่องเป็นปีๆ ก่อนจะเจอปัญหาแสดงให้เห็นถึงความเสถียรและประสิทธิภาพที่น่าทึ่งในสถาปัตยกรรมพื้นฐานของพวกมัน

การทดลองเหล่านี้ทำหน้าที่เป็นการมองเห็นที่น่าทึ่งเข้าไปในรากฐานทางคณิตศาสตร์ของเกมคลาสสิก เผยให้เห็นว่าข้อจำกัดของเลขคณิตมากกว่าข้อผิดพลาดในการเขียนโปรแกรมสร้างพฤติกรรมที่ไม่คาดคิดเหล่านี้ สำหรับผู้เล่นที่ทุ่มเทซึ่งยินดีรอหลายปีเพื่อไอเท็มหายากหรือประสบการณ์ที่ไม่เหมือนใคร สภาวะ overflow เหล่านี้เสนอเส้นทางที่แหวกแนวแต่ถูกต้องตามกฎไปสู่ความสำเร็จในเกม