Halo 2 HD ที่ทะลุขีดจำกัดของ Xbox รุ่นดั้งเดิม
โพสต์บล็อกนี้ครอบคลุมงานทั้งหมดที่ทำเพื่อเพิ่มการรองรับความละเอียด HD ให้กับ Halo 2 เวอร์ชัน Xbox รุ่นดั้งเดิม ตั้งแต่การแพตช์เกม การดัดแปลงฮาร์ดแวร์ของเครื่อง Xbox ไปจนถึงการเขียนเครื่องมือแบบกำหนดเองสำหรับเบนช์มาร์กประสิทธิภาพ เป้าหมายของโปรเจ็กต์นี้คือการก้าวข้ามข้อจำกัดของทั้งสองด้านและดูว่าจะไปได้ไกลแค่ไหน
- เพื่อนชื่อ "doom" ได้ทำการรีเวิร์สเอนจิเนียริงและศึกษาฮาร์ดแวร์กับซอฟต์แวร์ของ Xbox รุ่นดั้งเดิมมาตลอดหลายปี
- ด้วยการใช้บอร์ด CPU interposer แบบกำหนดเองของเขา จึงสามารถเปลี่ยน CPU Pentium 3 มาตรฐานเป็น Pentium 3 รุ่นดัดแปลงที่ 1.4Ghz และโอเวอร์คล็อกได้ถึงประมาณ 2Ghz
- เขายังเขียนแพตช์แบบกำหนดเองสำหรับ Xbox kernel เพื่อแพตช์การคำนวณ timing ของเกมแบบเรียลไทม์ให้รองรับ CPU ที่เร็วขึ้น
- เมื่อนำไปรวมกับการอัปเกรดฮาร์ดแวร์อื่น ๆ เช่น RAM และ SSD ก็เริ่มเรียกมันว่า "god box"
- doom ต้องการคนมาทำแพตช์ความละเอียด HD ที่เหมาะสมสำหรับเกมยอดนิยมที่ 720p และได้มาขอให้ฉันช่วย
- ฉันตอบรับข้อเสนอนี้โดยมีเงื่อนไขว่าจะต้องโอเวอร์คล็อก GPU ด้วย ซึ่งเขาก็ทำให้และส่งมอบเครื่องคอนโซล "GENESIS-3" มาให้
การเรนเดอร์เป็น HD
- ต้องเปลี่ยนขนาดของ D3D front/back buffer
- ต้องแก้ไขฟังก์ชัน _rasterizer_detect_video_mode, _rasterizer_init_screen_bounds, rasterizer_device_initialize
- เมื่อเปิดใช้ 720p ต้องตั้งค่า g_progressive_scan_enabled และกำหนดตัวแปร screen_bounds กับ frame_bounds ตามโหมดวิดีโอ
- ต้องตั้งค่าแฟล็กเพิ่มเติมในพารามิเตอร์การนำเสนอของ D3D ตามว่าโหมดวิดีโอเป็น progressive หรือ interlaced
การใช้หน่วยความจำ D3D อย่างมีประสิทธิภาพ
- Xbox ใช้สถาปัตยกรรมหน่วยความจำแบบรวมที่ CPU และ GPU ใช้ RAM ร่วมกัน
- Halo 2 สร้าง render target ด้วยตนเอง แทนที่จะใช้ฟังก์ชันที่ D3D มีให้
- Halo 2 ใช้ render target ที่แตกต่างกันราว 25 แบบ แต่ประหยัดหน่วยความจำด้วยการจัดสรรบัฟเฟอร์ที่ไม่ซ้ำกันจริง ๆ เพียง 4-5 ชุด
- ฟังก์ชัน rasterizer_primary_targets_initialize สร้าง render target เพิ่มเติมและ texture view โดยใช้ขนาดที่ฮาร์ดโค้ดไว้เป็น 640x480
- ดังนั้นหลังจากปรับขนาด back/front/depth buffer แล้ว จึงต้อง hook ฟังก์ชันนี้และแก้ขนาดให้ถูกต้อง
การปรับขนาด rasterizer target
- render target ของ texture accumulator (texaccum) ต้องตรงกับความละเอียดของ back buffer
- ฟังก์ชัน rasterizer_targets_initialize ฮาร์ดโค้ดขนาดของ texture accumulator เอาไว้
- จึง hook ฟังก์ชัน _rasterizer_alloc_and_create_render_target เพื่อเปลี่ยนขนาดให้ตรงกับ back buffer
ความเห็นของ GN⁺
- โปรเจ็กต์นี้เป็นความท้าทายทางเทคนิคที่ยากมาก แต่เกิดขึ้นได้เพราะ Ryan เข้าใจเอนจินของ Halo 2 อย่างลึกซึ้ง และ doom มีความเชี่ยวชาญด้านฮาร์ดแวร์ Xbox
- การ hot patch Xbox kernel สำหรับแพตช์ HD และการโอเวอร์คล็อกเป็นวิธีแก้ปัญหาที่น่าประทับใจและสร้างสรรค์มาก นี่เป็นวิธีที่ดีในการก้าวข้ามข้อจำกัดทางกายภาพของฮาร์ดแวร์
- ผลลัพธ์สุดท้ายยอดเยี่ยม แต่ก็ยังมีพื้นที่ให้ปรับปรุง โดยเฉพาะเรื่องการลด texture pop-in และการปรับปรุงเวลาโหลด
- การยืนยันได้ว่าการเรนเดอร์ติดคอขวดที่ GPU เป็นข้อมูลเชิงลึกที่สำคัญ และอาจบรรเทาปัญหาคอขวดได้ด้วย texture cache ที่ใหญ่ขึ้นจาก RAM ที่เพิ่มขึ้น
- ยังมีวิธีปรับแต่งเอนจินเรนเดอร์เพิ่มเติมได้ เช่น การปรับมุม FOV ของกล้อง การปรับระบบ LOD ให้เหมาะสม และการใช้การบีบอัดโมเดล/เท็กซ์เจอร์ที่มีประสิทธิภาพมากขึ้น
- การทำงานรีเวิร์สเอนจิเนียริงในระดับนี้สำหรับเกมคอนโซลรุ่นเก่าเป็นสิ่งที่น่าประทับใจมาก นี่คือความสำเร็จครั้งใหญ่ของวงการเกมเรโทร
ยังไม่มีความคิดเห็น