เรื่องราวของท่าเรือที่เป็นไปไม่ได้: Quake ถูกย้ายไปยัง Game Boy Advance อย่างไร

click fraud protection

การย้าย Quake ไปยัง Game Boy Advance ดูเหมือนจะเป็นไปไม่ได้ แต่ Randy Linden ก็สามารถดึงมันออกมาได้ นี่คือวิธีการ

Game Boy Advance เป็นเกมคอนโซลมือถือที่สร้างสรรค์โดย Nintendo เปิดตัวในญี่ปุ่นในปี พ.ศ. 2544 และทำหน้าที่เป็นผู้สืบทอดของเกมบอยคัลเลอร์ มี ARM7TDMI โอเวอร์คล็อกที่ 16.78 MHz, RAM ทำงานภายใน 32kb, RAM ภายนอก 256kb และ VRAM 96kb มันไม่ใช่เครื่องที่ทรงพลังที่สุด แต่มีเกมมากมายสำหรับอุปกรณ์พกพาที่หลายคนคงอยู่ในความทรงจำ เกมหนึ่งที่ไม่เคยเห็นแสงสว่างในตอนกลางวันสำหรับอุปกรณ์นี้คือพอร์ตต้นแบบของ Quake ซึ่งเป็นเกมที่พัฒนาโดย id Software ที่ช่วยกำหนดประเภทเกมยิงมุมมองบุคคลที่หนึ่งที่เรารู้จักในปัจจุบัน

Quake เป็นเกมที่มีรายละเอียดมากอย่างไม่น่าเชื่อ พร้อมด้วยเพลงประกอบที่ยอดเยี่ยมและรูปแบบเกมที่น่าดึงดูด และเช่นเดียวกับ DOOM มันถูกย้ายไปยังอุปกรณ์ทุกเครื่องที่คุณนึกออก การเชื่อมต่อกับ Game Boy Advance นั้นน่าทึ่งเป็นพิเศษเนื่องจากไม่รองรับกราฟิก 3D โดยกำเนิด และ Nintendo ทำการตลาดอุปกรณ์พกพาโดยเฉพาะว่าเป็นประสบการณ์การเล่นเกมสองมิติ นั่นไม่ได้หยุด Randy Linden จากการพัฒนาท่าเรือของเขาเอง

รูปถ่ายของพอร์ต Quake ที่เล่นบน Analogue Pocket ซึ่งใช้โดยได้รับอนุญาตจาก Modern Vintage Gamer

หากคุณไม่คุ้นเคยกับ Linden เขาเป็นที่รู้จักดีที่สุดในฐานะผู้พัฒนาทั้งสอง bleem! (เครื่องจำลอง PlayStation) และพอร์ต SNES ของ DOOM ซึ่งเป็นความสำเร็จที่ John Romero ผู้ร่วมก่อตั้ง id Software เคยกล่าวไว้ในการให้สัมภาษณ์กับ แช็คนิวส์ เขาไม่คิดว่าจะเป็นไปได้ ความสามารถในการพัฒนาของ Linden พิสูจน์ให้เห็นว่าถ้าใครก็ตามสามารถทำให้ Quake บน Game Boy Advance เป็นจริงได้ คนๆ นั้นก็คงเป็นเขา

ท่าเรือแห่งนี้ได้รับแสงสว่างจากการที่ Linden ปล่อยท่าเรือแห่งนี้ผ่านโครงการ Forest of Illusion Forest of Illusion เป็นโครงการที่มุ่งรักษาประวัติศาสตร์ของเกมของ Nintendo และ Linden เอื้อมมือออกไปเพื่อแจกจ่ายสำเนาพอร์ต Quake ที่เขาพบในแฟลชการ์ดขนาด 256MB ในตัวเขา การครอบครอง.

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

พอร์ต Game Boy Advance ของ Quake

ในทางเทคนิคแล้ว เป็นเรื่องมหัศจรรย์ที่ Quake สามารถวิ่งไปถึงระดับที่ทำได้บน Game Boy Advance มันทำงานที่อัตราเฟรมที่ดีและรักษาแสงและสีที่ถูกต้องของเกม Quake ดั้งเดิม ทุกอย่างเป็นแบบ 3 มิติ รวมถึงอาวุธและสัตว์ประหลาดด้วย เกมบน Game Boy Advance ใช้งานได้กับกราฟิก 3D โดยทั่วไปแล้วใช้สไปรท์ แต่นี่คือเรื่องจริง ไม่ได้ใช้การฉายรังสีในลักษณะที่เกม 3D อื่นๆ ทำบนมือถือ และยังบรรลุคะแนนอีกด้วย เอฟเฟกต์แสงบนวัตถุที่เรนเดอร์ล่วงหน้าผ่านเคล็ดลับการเปลี่ยนพาเลทเพื่อให้ได้ภาพลวงตาของไดนามิก แสงสว่าง

เพื่อให้ชัดเจน พอร์ตนี้ไม่ใช่เกมตัวเต็ม และเป็นเพียงเกมต้นแบบที่ Linden ตั้งใจจะนำไปใช้กับ id Software เมื่อสร้างเสร็จแล้วเพื่อออกสู่ตลาด อย่างไรก็ตาม ความนิยมของ Game Boy Advance เริ่มลดลง และต่อมากลับกลายเป็นเอ็นจิ้นแบบกำหนดเองที่เขียนโดย Linden กลายเป็นกลไกของเกมอื่นที่พัฒนาโดย Linden ทั้งหมด นั่นก็คือ Cyboid Linden บอกเราว่า "โค้ดจำนวนมาก" ยังคงเป็นโค้ด ARM ดั้งเดิมจากเวอร์ชัน Game Boy Advance หากคุณต้องการลองใช้ Cyboid เวอร์ชันเก่าจะมีให้บริการใน Google Play Store แต่ APK อย่างเป็นทางการได้รับการเผยแพร่บน อเมซอน แอพสโตร์ เนื่องจากเกมมีโค้ด 32 บิตระดับต่ำจำนวนมาก

ไซบอยผู้พัฒนา: อาร์ แอนด์ อาร์ ดิจิตอล แอลแอลซี

ราคา: ฟรี

3.3.

ดาวน์โหลด

Linden ยังแชร์วิดีโอเกี่ยวกับโค้ดของเขาที่ทำงานบน iPod Video ให้เราฟังด้วย ซึ่งเป็นหนึ่งใน Cyboid เวอร์ชันแรกสุด มันถูกสร้างขึ้นจากรหัสเครื่องยนต์เดียวกับที่ใช้สำหรับพอร์ต Quake ของเขาไปยัง Game Boy Advance

พอร์ต Game Boy Advance ของ Quake ไม่มีทรัพย์สินอย่างเป็นทางการของเกม ดังที่ Linden ไม่มี ติดต่อ id Software หรือ ZeniMax เกี่ยวกับการเผยแพร่เวอร์ชัน E1M1 ซึ่งมี Quake อย่างเป็นทางการ สินทรัพย์

เกมที่กำลังเผยแพร่อยู่ในขณะนี้ยังเป็นเวอร์ชันแก้ไขจุดบกพร่องอีกด้วย การกดปุ่ม R ค้างไว้ขณะบู๊ตเครื่องจะนำผู้เล่นตรงไปยังแผนที่ที่สองของเกม และการกดแป้นซ้ายบน D-pad ค้างไว้จะเป็นการนำพวกเขาไปยังแผนที่ที่สาม การสลับแผนที่ยังสามารถเข้าถึงได้เมื่อผู้เล่นตาย และมอนสเตอร์จะไม่โจมตีผู้เล่นจนกว่าผู้เล่นจะยิงพวกมันก่อน

ในส่วนของเพลง การสาธิตใช้ไฟล์ .S3M สาธารณะ และตัวผสมเสียงจะจัดการทั้งเพลงสเตอริโอและเอฟเฟกต์เสียง

ขอบเขตทางเทคนิค

มีขอบเขตหลายประการสำหรับ Game Boy Advance ที่ทำให้พอร์ตนี้ยาก อุปสรรคที่ใหญ่ที่สุดบางประการคือความเร็วสัญญาณนาฬิกาต่ำ การขาดความสามารถด้านกราฟิก 3D ของอุปกรณ์พกพา และการขาดหน่วยจุดลอยตัว (FPU) ระหว่างทางมีคนอื่นๆ อีกมาก แต่สิ่งเหล่านี้เป็นจุดที่ Linden มองว่าเป็นปัญหาโดยเฉพาะ ก่อนที่เราจะพูดถึงเรื่องนี้ สิ่งสำคัญคือต้องเข้าใจรูปแบบของ Game Boy Advance ก่อน

ภาพหน้าจอใช้โดยได้รับอนุญาตจาก Modern Vintage Gamer

Game Boy Advance มี RAM สามชุด ชุดหนึ่งคือ RAM ทำงานภายใน (IWRAM) อีกชุดคือ RAM ทำงานภายนอก (EWRAM) และชุดที่สามคือ RAM วิดีโอ (VRAM) IWRAM ขนาด 32kb ใช้สำหรับจัดเก็บคำสั่ง ARM เพื่อการดำเนินการที่รวดเร็ว ในขณะที่ EWRAM ขนาด 256kb นั้นเหมาะสมที่สุดสำหรับการจัดเก็บคำสั่งแบบ Thumb เท่านั้นและข้อมูลชิ้นเล็กๆ เช่น โรดริโก โคเปตติ บันทึกEWRAM สามารถเข้าถึงได้ช้ากว่า IWRAM ถึงหกเท่า หน่วยความจำส่วนใหญ่ในรูปแบบของ EWRAM สามารถเข้าถึงได้ผ่านบัส 16 บิตเท่านั้น แม้ว่า Game Boy Advance จะวางตลาดในรูปแบบอุปกรณ์พกพาแบบ 32 บิตก็ตาม IWRAM สามารถเข้าถึงได้ผ่านบัส 32 บิต VRAM บน Game Boy Advance มีขนาด 96kb และแม้ว่าจะใช้จัดเก็บข้อมูลกราฟิกเป็นหลัก แต่ก็พบได้ในแผนผังหน่วยความจำของ CPU และสามารถใช้เป็นหน่วยความจำปกติได้เช่นกัน

คำสั่ง Thumb เป็นส่วนย่อยของคำสั่ง ARM 32 บิต และเป็นชุดคำสั่งที่เข้ารหัสเป็นคำ 16 บิต มีประโยชน์ทั้งหมดของคำสั่งแบบ 32 บิตโดยไม่ต้องใช้พื้นที่มากนัก ทำให้มีประสิทธิภาพสำหรับการพัฒนาที่เหมาะสมที่สุด ซึ่งหมายความว่าแม้ว่า EWRAM จะเข้าถึงได้ช้ากว่า แต่คำสั่ง Thumb ที่มีประสิทธิภาพมักจะยังจบลงได้เร็วเท่ากับคำสั่ง ARM ที่เก็บไว้ ใน IWRAM แม้ว่าข้อเสียของคำสั่ง Thumb ก็คือบางครั้งคำสั่ง Thumb ก็ไม่เทียบเท่ากับคำสั่ง ARM ที่คุณต้องการ ดำเนินการ EWRAM ใช้สำหรับจัดเก็บเอาต์พุตของตรรกะการแปลงทางคณิตศาสตร์ 3 มิติ ซึ่งโดยพื้นฐานแล้วคือรายการของขอบรูปหลายเหลี่ยมที่จากนั้นจึงติดตามสแกนไลน์ทีละสแกนไลน์ด้วยโค้ดแรสเตอร์ไรเซชัน

ดังที่ Linden บอกฉัน ส่วนที่ซับซ้อนและยากที่สุดของพอร์ตทั้งหมดคือตัวเรนเดอร์สแกนไลน์ ประกอบด้วยโค้ดแอสเซมบลี ARM ที่ได้รับการปรับปรุงประสิทธิภาพสูงสุดมากกว่า 10,000 บรรทัด ซึ่งออกแบบมาเพื่อวาดชุดพิกเซลไปยัง VRAM ตัวเรนเดอร์สแกนไลน์ใช้ IWRAM ขนาด 32kb ส่วนใหญ่ ขอบที่อยู่ใกล้กับกล้องมากที่สุดนั้นเป็นแบบแอ็คทีฟและเรนเดอร์ และโดยพื้นฐานแล้วมันคือแผนผัง Binary Space Partitioning (BSP) ขนาดใหญ่ VRAM ใช้เพื่อจัดเก็บผลลัพธ์ของเอาต์พุตการแปลงรูปหลายเหลี่ยมลงในตารางขอบเนื่องจากมี IWRAM ไม่เพียงพอ แต่ VRAM บน Game Boy Advance ยังคงเร็วกว่า EWRAM กราฟิกยังถูกจัดเก็บและแสดงที่นี่

เขาใช้เวลาส่วนใหญ่ไปกับการเพิ่มประสิทธิภาพเพื่อให้แน่ใจว่าจะได้รับเวลาดำเนินการที่เร็วที่สุดเท่าที่จะเป็นไปได้ สามสิ่งที่เขาทำเพื่อเร่งเวลาดำเนินการนั้นมีดังต่อไปนี้:

  • แก้ไขโค้ดด้วยตนเองก่อนดำเนินการ จึงต้องใช้คำแนะนำน้อยลง
  • ใช้ชุดตารางค้นหาสำหรับสิ่งต่าง ๆ เช่น ส่วนกลับ ไซน์ โคไซน์ แทนเจนต์ ฯลฯ
  • สลับ "โหมด" ของ CPU เพื่อเข้าถึงการลงทะเบียนเพิ่มเติม (เช่น "ตัวแปร") โดยไม่ต้องบันทึกและกู้คืนค่าของการลงทะเบียน

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

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

น่าตลกที่ Linden ยังกล่าวถึงวิธีที่วิธีการเปลี่ยนธนาคารของเขาค้นพบข้อบกพร่องในโปรแกรมจำลอง Nanoboy Advance ปรากฎว่าโปรแกรมจำลองนั้นไม่รองรับการใช้โหมดอื่น ๆ ของ CPU เพื่อบันทึกการลงทะเบียนและการสลับ และการสาธิต Quake ของเขาเป็นเกมแรกที่รู้จักที่ทำได้จริง

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

ภาพด้านบนเป็นภาพที่ Linden แบ่งปันกับเราจากบันทึกของเขา และสิ่งที่น่าสนใจเป็นพิเศษคือ "จำนวนคำสั่งวงจร ARM เบ็ดเตล็ด" เขาคิดค้นวิธีเพิ่มประสิทธิภาพรอบสำหรับการคำนวณ เพื่อให้สามารถลดจำนวนรอบสัญญาณนาฬิกาสำหรับการคำนวณได้ ตามที่เขาอธิบายให้ฉันฟัง ตัวเลข 8 บิตสามารถคูณได้ในหนึ่งรอบสัญญาณนาฬิกา ตัวเลข 16 บิตในสองรอบสัญญาณนาฬิกา ตัวเลข 32 บิตในสามรอบสัญญาณนาฬิกา และตัวเลข 64 บิตในสี่รอบสัญญาณนาฬิกา .

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

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

“โปรแกรมมาจาก [พื้นที่เก็บข้อมูล] โดยจะถ่ายโอนบล็อกใหญ่ของโปรแกรมไปยัง RAM ภายในเพื่อดำเนินการเพราะมันเร็วกว่า การเข้าถึง RAM แต่ละครั้งนั้นช้ากว่ามาก ดังนั้นฉันจึงทำ DMA [Direct Memory Access] ของบล็อกขนาดใหญ่จาก ROM ไปเป็น RAM จากนั้นฉันก็เปลี่ยนโค้ดโปรแกรมจริง ตัวอย่างเช่น ARM มีความสามารถในการเลื่อนตัวถูกดำเนินการไปทางซ้ายหรือขวาหรือสามารถปิดบังบิตบางบิตซึ่งเป็นส่วนหนึ่งของชุดคำสั่งได้ คำสั่งจะระบุบิตที่คุณจะปกปิดหรือจำนวนบิตที่คุณจะเลื่อน ดังนั้น ฉันจะสร้างโค้ดที่จะแก้ไขสิ่งที่กำลังจะถูกดำเนินการตามจำนวนบิตที่ฉันต้องเปลี่ยน อีกตัวอย่างหนึ่งเกี่ยวกับการคูณเมทริกซ์ 3 มิติ มีการคูณมากมายที่เกี่ยวข้องตรงนี้. ฉันจะสร้างคำสั่งจริงที่กำลังคูณเข้าไปใน RAM ภายใน จากนั้นจึงดำเนินการคำสั่งเหล่านั้นเพื่อให้โค้ดสร้างส่วนต่างๆ ของตัวเองขึ้นมาในขณะที่มันกำลังทำงานอยู่"

โค้ดที่แก้ไขได้เองมีข้อเสียในตัวเอง โดยเฉพาะอย่างยิ่งเมื่อเป็นเรื่องของการดีบัก โดยขจัดความจำเป็นในการสั่งการสาขาด้วย โดยที่โค้ดจะข้ามไปยังลำดับการดำเนินการอื่น และอาจกีดกันเธรดหลักจากเวลาในการคำนวณอันมีค่า Linden ยังบอกเราด้วยว่าตารางการค้นหานั้นอยู่ในแนวเดียวกันอย่างสมบูรณ์ใน ROM เพื่อให้เป็นผลคูณที่สมบูรณ์แบบของค่า 8 บิตที่เลื่อนไปทางซ้าย ขนาดของตารางตรวจสอบมีขนาดใหญ่มากและไม่พอดีกับ RAM และการจัดตำแหน่งยังช่วยหลีกเลี่ยงความจำเป็นในการโหลดคำสั่งเพิ่มเติมเพื่อรับที่อยู่พื้นฐานของตาราง

โดยรวมแล้ว ต้นแบบขั้นสุดท้ายได้รับการพัฒนาในเวลาเกือบสองปี

อนาคตของท่าเรือ Quake ของ Randy Linden

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

การตั้งค่าของ Randy Linden สำหรับการเชื่อมต่อ Game Boy Advance กับคอมพิวเตอร์เพื่อการพัฒนา

ฉันถาม Linden ว่าทำไมเขาถึงเลือก Quake และเขาบอกฉันว่าเขาชอบเกมนี้ และเขาชอบความท้าทายของการเป็น "โปรเจ็กต์ที่เป็นไปไม่ได้" เพราะมันอยู่ด้านหลังพอร์ต DOOM สำหรับ SNES ของเขา นอกจากนี้เขายังกล่าวด้วยว่าแม้ว่าเขาไม่เชื่อว่าเกมทั้งหมดอาจถูกย้ายเนื่องจากข้อจำกัดด้านพื้นที่ แต่เกมส่วนใหญ่อาจอยู่ในเอนจิ้นเดียวกัน

หากคุณสนใจที่จะลองชม Quake สำหรับ Game Boy Advance อย่าลืมเข้าไปดูการวางจำหน่ายบน Forest of Illusion ซึ่งคุณสามารถดูได้ด้านล่างนี้


ดาวน์โหลดจากป่าแห่งภาพลวงตา