- แพตช์ Halo 2 HD สำหรับ Xbox รุ่นดั้งเดิมเป็นโปรเจกต์ที่รวมการแก้ไขไฟล์รัน, การดัดแปลงฮาร์ดแวร์คอนโซล และการสร้างเครื่องมือ benchmark เพื่อพยายามเรนเดอร์ที่ 720p และ 1080p ให้เกินกว่า 480p
- Halo 2 เดิมแม้ระบุว่าเป็น 480p แต่ภายในวาดลงบน back buffer 640×480 แล้ว GPU อัปสเกลเป็น 720×480 ดังนั้นการรองรับ HD จึงต้องเปลี่ยนทั้งการจัดการ D3D buffer และ video mode
- การรันที่ 720p มี RAM พื้นฐาน 64MB ไม่พอ จึงต้อง อัปเกรด RAM เป็น 128MB และทำ kernel hot patch รวมถึงเลี่ยงข้อจำกัดเพื่อให้สามารถจัดสรรหน่วยความจำกายภาพแบบต่อเนื่องสำหรับ GPU จาก 64MB ส่วนบนได้
- ประสิทธิภาพดีขึ้นด้วย triple buffering, การทำ tiling ให้ texaccum render target, การโอเวอร์คล็อก GPU จาก 233.33MHz เป็น 300MHz ฯลฯ โดยฉาก benchmark Zanzibar เพิ่มจากราว 19FPS เป็นระดับ 27–28FPS
- RAM เพิ่มเติมยังถูกใช้เพื่อขยาย texture/geometry cache และปรับปรุงความเร็วการส่งข้อมูลจาก HDD แพตช์สุดท้ายทำให้ 720p ใช้งานจริงได้ แต่ 1080p ค่อนข้างเป็นโบนัสสำหรับจับภาพหน้าจอเป็นหลัก
เป้าหมายโปรเจกต์และสมมติฐานด้านฮาร์ดแวร์
- เป้าหมายคือเพิ่มการรองรับความละเอียด HD ให้กับ Halo 2 เวอร์ชัน Xbox รุ่นดั้งเดิม และตรวจสอบว่าฮาร์ดแวร์คอนโซลที่ดัดแปลงแล้วจะรับได้ถึงระดับไหน
- ขอบเขตงานรวมถึงการแพตช์เกม, การแก้ไขฮาร์ดแวร์คอนโซล Xbox และการเขียนเครื่องมือ custom สำหรับ benchmark ประสิทธิภาพ
- Xbox ดัดแปลงที่เป็นฐานของโปรเจกต์ถูกเรียกว่า “god box” และมีการเปลี่ยนแปลงดังนี้
- เปลี่ยน CPU Pentium 3 733MHz พื้นฐานเป็น CPU ดัดแปลงตระกูล Pentium 3 1.4GHz ด้วยบอร์ด interposer แบบ custom
- สามารถโอเวอร์คล็อก CPU ได้ถึงประมาณ 2GHz
- ใช้ RAM เพิ่มเติมและ SSD
- ใช้ custom kernel หรือ BIOS image ที่รองรับการดัดแปลงฮาร์ดแวร์
- ความละเอียดวิดีโอสูงสุดที่ Halo 2 รองรับคือ 480p และเป้าหมายคือเพิ่มการรองรับ 720p และถ้าเป็นไปได้ 1080i
- เมื่อเพิ่มความละเอียด ปริมาณการคำนวณ pixel shader จะเพิ่มขึ้น ทำให้ภาระ GPU สูงขึ้น จึงประเมินว่างานนี้คุ้มค่าก็ต่อเมื่อสามารถโอเวอร์คล็อก GPU ได้
- ภายหลังสามารถโอเวอร์คล็อก GPU ได้ประมาณ 15% และเตรียมคอนโซล “GENESIS-3” ไว้สำหรับงานพัฒนา
480p ของ Halo 2 และโครงสร้างการเรนเดอร์ภายใน
- Halo 2 ระบุบนกล่องว่ารองรับ 480p แต่ไม่ได้ตั้งค่า
D3DPRESENTFLAG_PROGRESSIVEใน D3D present parameter และสเกลขนาดหน้าจอก็เป็น1.0fเสมอ screen_boundsภายในถูกตั้งเป็น 640×480 ไม่ขึ้นกับ video mode- บน Xbox รุ่นดั้งเดิม 480p ถูก扱เป็น 720×480
- Halo 2 เรนเดอร์ลง back buffer 640×480 แล้วให้ GPU อัปสเกลเป็น 720×480 ก่อนส่งไปยัง video encoder
- ในโหมด widescreen ใช้กล้องแบบ anamorphic 1.33:1 เพื่อบีบภาพที่กว้างขึ้นลงบน surface 640×480 เดิม
- วิธีนี้อาจตั้งใจชดเชยการบีบแนวนอนในโหมด stretch ของทีวี
- ในแพตช์มีการเพิ่มตัวเลือกให้ปิด anamorphic scaling ด้วย
แพตช์ D3D สำหรับการเรนเดอร์ HD
- เพื่อรองรับความละเอียด มีฟังก์ชันหลัก 3 ตัวที่ถูกแก้ไข
_rasterizer_detect_video_mode: เปลี่ยนให้เปิดใช้งาน progressive scan ใน 720p ด้วย_rasterizer_init_screen_bounds: ตั้งขนาด 640×480, 720×480, 1280×720, 1920×1080 ตาม video moderasterizer_device_initialize: ตั้งค่า D3D back buffer และ present flag
- ในโหมด 1080i จะตรวจสอบว่าความกว้างหน้าจอเป็น 1920 หรือไม่ จากนั้นลบ
D3DPRESENTFLAG_PROGRESSIVEและตั้งค่าD3DPRESENTFLAG_INTERLACED - หลังการแก้ไขระยะแรก ฟิลเตอร์สีน้ำเงินในเมนูหลักหายไป และเกิดปัญหาเส้นลายซ้ำกับ geometry ของน้ำถูกตัด
- ปัญหาบางส่วนเกิดจาก มุมมอง 640×480 ที่ hardcode ไว้ สำหรับ back/front/depth buffer
- เกิด texture/surface view ที่มองหน่วยความจำเดียวกันด้วยความกว้างต่างกัน ทำให้การจัดวาง scan line คลาดเคลื่อน
หน่วยความจำ D3D และการจัดโครงสร้าง render target ใหม่
- Xbox รุ่นดั้งเดิมใช้ สถาปัตยกรรม unified memory ที่ CPU และ GPU ใช้ RAM เดียวกัน
- ไม่ใช่โครงสร้างแบบ PC ที่สร้าง D3D allocation ใน VRAM แล้วให้ GPU จัดการ
- CPU สามารถสร้างหน่วยความจำสำหรับ texture, render target, vertex buffer ฯลฯ แล้วส่ง address ให้ GPU ได้โดยตรง
- Halo 2 ใช้ render target ประมาณ 25 ตัว แต่ allocation ของ buffer ที่ไม่ซ้ำจริง ๆ มีเพียง 4–5 ตัว
- render target หลายตัวแชร์หน่วยความจำเดียวกันเป็น resource view ต่างแบบเพื่อประหยัดหน่วยความจำ
rasterizer_primary_targets_initializeสร้าง render target และ texture view เพิ่มเติมจาก back/front/depth buffer ที่ D3D สร้างขึ้น และ hardcode ขนาดไว้ที่ 640×480- แพตช์ครอบฟังก์ชันดังกล่าวด้วย hook เพื่อรันฟังก์ชันเดิมก่อน แล้วแก้ขนาด texture/surface ให้ตรงกับความละเอียด back buffer ปัจจุบัน
- pitch ของ tiled memory อาจต่างจาก
width * bppทั่วไป จึงคำนวณด้วยD3D_CalcTilePitch - pitch ที่ผิดอาจสร้างเอฟเฟกต์เป็นเส้นลาย โดยเฉพาะใน 1080i
- pitch ของ tiled memory อาจต่างจาก
แก้ขนาด texaccum render target
- ปัญหา geometry ของน้ำในเมนูหลักถูกตัดเกิดจาก texaccum render target ถูกตรึงไว้ที่ 640×480
- การใช้งาน DirectX ของ Xbox อนุญาตให้ sampling texture ได้เพียง 4 รายการต่อ pixel shader pass
- วัตถุที่ต้องใช้ input texture มากกว่า 4 รายการต้องเรนเดอร์หลาย pass
- เลเยอร์ texaccum จะรวม detail texture ก่อน แล้วใช้เป็น input ของ pass สำหรับ lightmap
rasterizer_targets_initializeจัดสรร texaccum render target เป็น 640×480- ครอบ
_rasterizer_alloc_and_create_render_targetด้วย hook เพื่อเปลี่ยนความกว้างและความสูงของ texaccum target ที่target_index == 1ให้เป็นขนาด back buffer ปัจจุบัน - หลังการเปลี่ยนแปลงนี้ ปัญหา geometry ของน้ำถูกตัดหายไป และไม่พบปัญหา rendering ที่สังเกตได้ระหว่างโหลด map
- ปัญหาฟิลเตอร์สีน้ำเงินแก้ได้ด้วยการอัปเดตการตรวจสอบขนาดแบบง่าย ๆ แต่ละเว้นรายละเอียดกระบวนการไว้
ข้อจำกัดหน่วยความจำที่ขวางการรัน 720p
- เมื่อตั้งค่าเป็น 720p เกม crash ตอนเริ่มต้น สาเหตุคือหน่วยความจำไม่พอจาก front/back/depth buffer และ rasterizer target ที่ใหญ่ขึ้น
- Xbox รุ่นดั้งเดิมมีรุ่น RAM 64MB สำหรับผู้บริโภค และ dev kit/debug console RAM 128MB สำหรับงานพัฒนา
- บนบอร์ด retail เองก็มีตำแหน่งสำหรับชิป RAM เพิ่มเติมอยู่
- หากบัดกรีชิป RAM และใช้ kernel ที่แก้ไขแล้ว จะเข้าถึง 64MB เพิ่มเติมได้
- การรันที่ 720p ขึ้นไปต้อง อัปเกรด RAM เป็น 128MB
- แม้แต่ 480p ปกติ หากจะรันโดยไม่อัปเกรด RAM ก็ต้องดึงหน่วยความจำจาก in-memory texture cache ของเกม ซึ่งจะทำให้ texture pop-in เพิ่มขึ้น
แพตช์ memory manager ของ Halo 2
- ตอนเริ่มต้น Halo 2 จัดสรรประมาณ 48.9MB จาก 64MB ที่ใช้ได้เป็น runtime data region ขนาดใหญ่ก้อนเดียว
- พื้นที่นี้ถูกแบ่งใช้กับ level metadata, texture, geometry, animation, sound cache, rasterizer target, network/simulation resource ฯลฯ
- เพื่อ visualise การใช้หน่วยความจำ จึงเขียน XboxImageGrabber
- วนอ่าน page table entry เพื่อ visualise สถานะการใช้ RAM เป็น bitmap
- runtime data region ถูกจัดสรรที่ address ที่ hardcode ไว้คือ 0x80061000
- tag data ใน map file ถูก serialize โดยใช้ address นี้เป็นฐาน ข้อมูลนี้จึงต้องอยู่ที่ address เดิมเสมอ
- runtime data อื่นสามารถย้ายได้
- พื้นที่ที่เลือกย้ายคือ rasterizer target, texture cache และ geometry cache
- hook allocation call เฉพาะบางจุดเพื่อย้ายไปยัง debug memory region
- เพิ่มการเรียก free ที่เหมาะสมในจังหวะปล่อยหน่วยความจำ เช่น เมื่่อโหลด level ใหม่
- ลดขนาด runtime data region เพื่อลดการสูญเปล่า
physical_memory_mallocถูก compiler inline ไว้ จึงต้องแพตช์แยกในแต่ละ call site
Xbox kernel hot patch และหน่วยความจำกายภาพ 64MB ส่วนบน
- address ของหน่วยความจำที่ส่งให้ GPU ต้องเป็น physical address และช่วงหน่วยความจำนั้นต้องต่อเนื่อง
- GPU ไม่มีแนวคิดเรื่อง page table หรือการแปลง virtual address
- แม้ใน kernel สำหรับ RAM 128MB โดยพื้นฐานแล้ว contiguous physical allocation ทำได้เฉพาะ 64MB แรก ส่วน virtual allocation ทำได้ทั้ง 128MB
- การทดสอบใช้ page table entry ของ 64MB ส่วนบนด้วยตนเองเพื่อใช้เหมือนหน่วยความจำ GPU สำเร็จ
- ข้อจำกัดที่ไม่สามารถใช้ physical memory สำหรับ GPU จาก 64MB ส่วนบนได้ไม่ใช่ข้อจำกัดฮาร์ดแวร์ แต่เป็นข้อจำกัดซอฟต์แวร์ของ kernel
- ภายใน
MmAllocateContiguousMemoryExมีการตรวจสอบMAX_USABLE_PFN- ค่าเดิมคือ 0x83FE0000 ซึ่งเท่ากับ 64MB - 128KB
- 128KB ส่วนบนถูกจองไว้เป็น GPU scratch area 64KB และ CPU page table 64KB
- แพตช์จะตรวจสอบตอนบูตเกมว่าคอนโซลมี RAM 128MB หรือไม่ จากนั้นค้นหาค่า
mov edx, 0x3FDFในMmAllocateContiguousMemoryExแล้วแก้เป็นค่าใหม่ที่เหมาะกับคอนฟิก 128MB - หลังจากนั้นใช้
MmAllocateContiguousMemoryExและMmFreeContiguousMemoryเพื่อจัดสรรและคืนหน่วยความจำกายภาพแบบต่อเนื่องจากทั้ง 128MB - มีผลข้างเคียงด้วย
- หลังออกจากเกม หากกลับ dashboard หรือ eject ถาด DVD ด้วย warm reboot โดยไม่ทำ cold reboot แอป/เกมถัดไปอาจเกิดกราฟิก artifact รุนแรงและ crash
- เพื่อซ่อนปัญหานี้ จึงใส่แพตช์เพิ่มเติมให้บังคับ cold reboot ตอนออกจากเกม
ผลการเรนเดอร์ 720p/1080p และคอขวดด้านประสิทธิภาพ
- การเรนเดอร์ 720p ดูดีขึ้นในเชิงภาพ แต่ประสิทธิภาพต่ำจนฉากหนัก ๆ FPS ตกลงไปต่ำกว่า 10
- 1080p สามารถเรนเดอร์แบบ native ได้ แต่เอาต์พุตของคอนโซล Xbox ทำได้เพียงสัญญาณ 1080i
- หาก dump D3D back buffer โดยตรง จะได้ภาพหน้าจอ 1080p ก่อนที่ GPU จะเปลี่ยนเป็น half frame สำหรับ video encoder
- การวัดประสิทธิภาพเปรียบเทียบ 3 คอนฟิก ได้แก่ Xbox พื้นฐาน, god box ที่โอเวอร์คล็อกเฉพาะ CPU และ god box ที่โอเวอร์คล็อกทั้ง CPU+GPU
- ใช้จุดหนักของ Zanzibar เป็น “zanzibar benchmark scene”
- การวัดช่วงแรกพบว่า FPS ของทั้งสามคอนฟิกแทบเท่ากัน และกราฟประสิทธิภาพชี้ว่า swap stall เป็นสาเหตุ
- Halo 2 ใช้ vsync on และ double buffering
- เกิดสถานการณ์ที่ GPU รอ vblank และไม่สามารถหมุน swap chain ต่อได้จนเกิด stall
Triple buffering และการยืนยันคอขวดที่ GPU
- วิธีแก้คือเพิ่ม back buffer count เป็น 2 เพื่อใช้ triple buffering รวมเป็น 3 buffer ได้แก่ front buffer 1 ตัวและ back buffer 2 ตัว
- ใน
D3DPRESENT_PARAMETERSตั้งค่าBackBufferCount = 2,D3DSWAPEFFECT_DISCARD,D3DPRESENT_INTERVAL_ONE - เนื่องจาก rendering engine ของ Halo 2 สลับ pointer ของ back/front buffer ทุกเฟรมตามสมมติฐาน double buffering จึงต้องแก้ทั้ง swap hook และ primary target initialize hook ด้วย
- เปลี่ยนให้ primary render surface และ texture view ทั้งสองอ้างถึง back buffer ปัจจุบันเสมอ
- แม้เกมจะ swap pointer ภายใน ทั้งคู่ก็ยังชี้ไปที่หน่วยความจำเดียวกัน จึงเทียบได้กับ no-op
- ในฉาก benchmark Zanzibar FPS บน GPU พื้นฐานอยู่ที่ประมาณ 22FPS
- เพิ่มขึ้นราว 3FPS จากเดิม
- เพิ่มขึ้นประมาณ 10% เมื่อเทียบกับ cap 30FPS
- swap stall หายไป และ GPU utilization ขึ้นสูงสุด ยืนยันได้ว่าคอขวดคือ GPU
การโอเวอร์คล็อก GPU และ RAM
- เปลี่ยน texaccum render target เป็น tiled memory แล้วได้เพิ่มอีก 1–2FPS
- ฉาก benchmark Zanzibar ดีขึ้นจากประมาณ 19FPS เป็น 23–24FPS
- เมื่อใช้ god box ที่โอเวอร์คล็อก GPU ฉาก benchmark Zanzibar ทำได้ 27–28FPS
- เวลาวิ่งใน map โดยทั่วไปคง 30FPS ได้ และตกเฉพาะบางพื้นที่หนัก ๆ
- เพื่อหลีกเลี่ยงการต้อง reflash BIOS จึงปรับ memory-mapped IO register ของ GPU clock generator โดยตรงตอนเริ่มเกม
- การคำนวณ GPU clock อิงค่า M, N, P ของ
NVPLL_COEFFและ base clock 16.6667MHz- ค่า N พื้นฐาน 28 ทำให้ GPU clock เป็น 233.33MHz
- ปรับค่า N เพื่อให้ตั้งค่าได้เป็นขั้นประมาณ 8MHz และทำให้ configure ผ่านไฟล์ ini ได้
- การโอเวอร์คล็อก GPU เป็น 300MHz เพิ่ม FPS ใน benchmark Zanzibar ได้อีกประมาณ 3FPS เมื่อเทียบกับ GPU พื้นฐาน
- ขีดจำกัดการโอเวอร์คล็อกของ GPU แตกต่างกันตามชิปแต่ละตัว
- GPU ของคอนโซล revision 1.0–1.4 มักเริ่มเห็นขีดจำกัดในช่วง low 300MHz
- มีเคสที่ GPU ของคอนโซล revision 1.6 ทำงานเสถียรที่มากกว่า 400MHz
- มีการทดสอบ RAM clock ด้วย
- แบนด์วิดท์สูงสุดตามทฤษฎีของ memory bus Xbox คือ 6.4GB/s และถือว่าค่าที่ใช้จริงได้อยู่ที่ราว 70% คือ 4.5GB/s
- โดยพื้นฐาน RAM ใกล้ 200MHz อยู่แล้ว แม้เพิ่มเพียงประมาณ 10MHz ก็อาจไม่เสถียรได้
- ในการทดสอบตั้งค่าประมาณ 208MHz พบว่าเพิ่มขึ้น 0.7FPS
- สั่งชิป RAM ที่ทำได้ 250MHz แล้ว แต่ ณ เวลาที่เขียนยังไม่ได้ติดตั้งและทดสอบเพิ่มเติม
ลด pop-in และขยาย cache
- Halo 2 เดิมมีปัญหา pop-in ของ texture และ geometry อยู่แล้ว และยิ่งเห็นชัดบนคอนโซลที่ใช้ HDD กลไกยุคต้นปี 2000
- ใช้ RAM เพิ่มเติมเพื่อขยาย texture cache และ geometry cache
- geometry cache พื้นฐานคือ 6.5MB สำหรับ map single-player และ 7MB สำหรับ map multiplayer
- texture cache ขึ้นกับขนาด map และใช้พื้นที่ที่เหลือระหว่าง tag data กับ low detail texture cache
- cache ทำงานแบบ LRU
- ทุก 30 frame จะลบข้อมูลที่ไม่ได้ใช้ในช่วง 30 frame ล่าสุด
- หาก cache เต็ม caller จะระบุ forced eviction หรือคำขอโหลดจะล้มเหลวแล้วลองใหม่ใน frame ถัดไป
- texture อาจมี buffer สำหรับ LOD ระดับ low/medium/high
- หากโหลด high LOD ไม่สำเร็จ จะลอง medium หรือ low LOD
- LOD ต่ำอาจแสดงก่อน แล้วเปลี่ยนเป็น LOD สูงภายหลัง ทำให้เกิด pop-in
- map ยังมี emergency low detail texture cache ขนาดตั้งแต่ 2×2 ถึงสูงสุด 8×8
- ใช้เพื่อวาดโมเดลบนหน้าจอชั่วคราวแม้การโหลด texture ปกติจะล้มเหลว
- อาการที่เมื่อเปิดแล้วปิดเมนูเพื่อน Xbox Live พื้นที่ภูมิประเทศดูเป็น texture ความละเอียดต่ำมากนั้นเกี่ยวข้องกับการใช้ cache นี้
- นำฟีเจอร์ visualise กราฟของ Bungie debug build มาสร้างใหม่เพื่อดูการใช้ cache โดยตรงและปรับขนาด
- การตั้งค่าสุดท้ายเพิ่ม geometry cache เป็น 20MB และ texture cache เป็นค่าคงที่ 30MB
- cache ทั้งสองใหญ่ขึ้นเกือบสองเท่าเมื่อเทียบกับค่าพื้นฐาน
- ใน cutscene เปิดของ Outskirts, Master Chief แสดงด้วย texture ความละเอียดสูงทันทีและยังมีพื้นที่ cache เหลือ
- เพื่อบรรเทา pop-in ที่เหลือ ยังเพิ่มความเร็วการส่งข้อมูล HDD ด้วย
- UDMA 2 พื้นฐานอยู่ที่ประมาณ 33.3MB/s
- UDMA 3 อยู่ที่ประมาณ 44.4MB/s
- หากมีสาย IDE 80-pin สามารถตั้งได้ถึง UDMA 5 ประมาณ 100MB/s
- ให้ความเร็วการส่งข้อมูลดีขึ้นประมาณ 10% ด้วยสาย IDE พื้นฐาน และตามทฤษฎีสูงสุด 300% ด้วยสาย IDE ที่อัปเกรดแล้ว
- โปรไฟล์หน่วยความจำ 720p สุดท้ายใช้ RAM 128MB มากกว่า 75%
- ในโหมด 1080p การใช้หน่วยความจำของ swap chain และ rasterizer target ใหญ่เกินไปจนต้องลดขนาด cache และโดยพื้นฐานใช้ RAM 128MB เกือบทั้งหมด
ผลลัพธ์
- โดยรวมแพตช์ 720p ถูกปรับปรุงจนเล่นได้ในระดับใช้งานจริง และการรองรับ 1080p ค่อนข้างเป็นโบนัสสำหรับจับภาพหน้าจอเป็นหลัก
- ยังมีพื้นที่ให้ปรับปรุงด้านประสิทธิภาพและการเปลี่ยนแปลงหน่วยความจำ แต่เป็นผลลัพธ์ที่ผลักขีดจำกัดของ Halo 2 และคอนโซล Xbox ไปไกลมาก
- ดาวน์โหลดแพตช์ Halo 2 HD และซอร์สโค้ดได้ที่ GitHub
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ลิงก์วิดีโอท้ายบทความ: https://www.youtube.com/watch?v=O_nk21389u8
ในวิดีโอมีการ เปรียบเทียบแบบวางคู่กัน ระหว่างต้นฉบับที่อัปสเกลเป็น 480p กับ 720p และตั้งแต่นาทีที่ราว ๆ 7 เป็นต้นไปจะอธิบายว่าต้องทำอะไรบ้างเพื่อให้ได้ 720p พร้อมยังคงเกมเพลย์ไว้ที่ประมาณ 30fps
ตัวบทความก็ยอดเยี่ยม แต่ตัววิดีโอที่สรุปการเปลี่ยนแปลงที่จำเป็นเพื่อให้ได้ความละเอียดสูงขึ้นก็ดีเช่นกัน
เรื่องที่ว่า 720×480 ไม่ใช่ความละเอียด 16:9 หรือไม่ใช่ “480p แท้” จริง ๆ คงต้องไปถามทางฝั่ง การกำหนดมาตรฐานของ ITU ในทศวรรษ 1970: https://tech.ebu.ch/docs/techreview/trev_304-rec601_wood.pdf
ในบันทึกเมื่อเดือนกุมภาพันธ์ 1980 ระบุว่า เพื่อให้รองรับช่วงเส้นสแกนที่ใช้งานได้ของมาตรฐานยุโรปทั้งหมด จำนวนตัวอย่างต่อเส้นที่ใช้งานได้ต้องมากกว่า 715.5 และต่อมา 720 samples ที่ใช้ใน Rec. 601 และ SMPTE 125 ก็กลายเป็นค่าตัวแรกที่ “ใช้งานได้”
Rec. 601 ให้ 720 samples ต่อเส้นที่ใช้งานได้สำหรับช่องสัญญาณความสว่าง และ 360 samples สำหรับสัญญาณสีต่างแต่ละตัว ส่วนตอนนิยาม HDTV ก็เอาความละเอียดแนวนอนของระบบทีวีเดิมนี้มาคูณสองและใช้สัดส่วนภาพ 16:9 จนนำไปสู่ 1920 samples/line และ 1080 lines
ระบบ progressive scan 1280×720 ก็อยู่ใน ตระกูล 720 พิกเซล เดียวกัน และระบบทีวีดิจิทัล, DVD, MPEG ส่วนใหญ่ก็แตกแขนงมาจากรูปแบบมาตรฐานพื้นฐาน 4:2:2 นี้
“จิตวิญญาณแฮ็กเกอร์” เองนั้นสมเหตุสมผลเต็มที่ แต่ก็สงสัยว่ามีเหตุผลอะไรเป็นพิเศษให้ต้องลำบากเพิ่มหน่วยความจำให้คอนโซลและโอเวอร์คล็อก GPU เพื่อเล่น Halo 2 แบบนี้ แทนที่จะเล่นเวอร์ชัน PC
มีวิดีโอจำนวนมากที่ลงรายละเอียดข้อบกพร่องในหลายระดับ
https://youtu.be/03K2Uz3s1hg?si=zaFO1XdzMcFvI1F6
เหมือนเป็นการพิสูจน์ว่ามันเป็นไปได้พอสมควร หรือกระทั่งดีกว่าด้วยซ้ำ
อาจจะเกือบเป็นอุปสรรคทางจิตใจก็ได้ แต่โดยรวมเป็นเรื่องเบา ๆ และสนุก และเหมือนอยู่คนละด้านกับความหมกมุ่นที่จะซื้อรุ่นล่าสุดของอุปกรณ์ยอดนิยมให้ได้ก่อนใคร
ทั้งสองอย่างให้ ความรู้สึกเหนือกว่า บางแบบ
ทุกวันนี้ Halo 2 ยังเล่นได้ผ่านล็อบบี้ออนไลน์หรือแคมเปญ และเลือกได้ทั้งกราฟิกต้นฉบับของ 343 หรือกราฟิก HD แบบรีมาสเตอร์
ในบทความบอกว่า “ระบบข้อมูล tag ถูกออกแบบมาให้ยืดหยุ่นและรวดเร็วที่สุดเท่าที่เป็นไปได้ และการทำงานภายในก็น่าทึ่งในเชิงวิศวกรรม ผมเขียนบทความทั้งบทได้เลยว่าเหตุใดผมถึงคิดว่ามันทำให้เอนจิน Blam เป็นหนึ่งในเอนจินที่ยืดหยุ่นที่สุด แต่เรื่องนั้นไม่เกี่ยวกับบทความนี้” ถ้าบทความนั้นถูกเขียนขึ้นจริง ๆ ก็อยากอ่านมาก
มือใหม่เกินกว่าจะตามทันว่ามันทำงานอย่างไร และมันไดนามิกมากจนโดยพื้นฐานแล้วไม่เข้าใจเลยว่าโครงสร้างแบบนั้นเป็นไปได้อย่างไร
ไม่เข้าใจว่าทำไมตำแหน่งผู้เล่นถึงอยู่ในบริบทเดียวกับอาวุธที่มีการตั้งค่า และเอฟเฟกต์ต่าง ๆ ยังอยู่ในรายการเดียวกันได้อย่างไร
หลายสิ่งที่สนใจอยู่ตอนนี้ สุดท้ายก็ยังวนเวียนอยู่รอบ ๆ แนวคิดเหล่านี้
อยากให้ยุคของการม็อด Xbox และ Halo 2 กลับมาอีกครั้งในยุคปัจจุบัน
ช่วงเวลานั้นมีอิทธิพลอย่างมากต่อการเลือกเส้นทางอาชีพของผม และผมยังเชื่อว่า Halo 2 เป็นเกมออนไลน์ที่สร้างนวัตกรรมมากที่สุดตลอดกาล
แค่ซื้อเครื่องมือง่าย ๆ สำหรับโหลดเซฟเกม ก็ทำ Xbox แบบซอฟต์ม็อดได้ในไม่กี่นาที แต่คอนโซลทุกวันนี้มีทั้งการเป่า e-fuse เพื่อกันดาวน์เกรด และมีการเสริมความปลอดภัยมากขึ้นกว่านั้นมาก
เมื่อประกอบกับโปรเจกต์ที่ Insignia เริ่มรองรับ Halo 2 นี่จึงเป็นช่วงเวลาที่ดีมากสำหรับ Halo 2 แบบคลาสสิก
เหตุผลหนึ่งที่ผมมาเป็นวิศวกรซอฟต์แวร์ในตอนนี้ ก็เพราะสมัยก่อนสามารถแอบดูได้ง่ายว่าเว็บเพจทำงานอย่างไร ไปแตะหน่วยความจำของโปรแกรมได้ และเปิดฮาร์ดแวร์ออกมาดูข้างในได้
สมัย Halo PC ผมได้เรียนรู้มากมายว่าในเกมมีอะไรบ้างจากการม็อดเลเวล และการรู้ว่า “BSP” คืออะไรอาจเป็นความรู้จิปาถะที่ไม่มีประโยชน์ แต่ก็ทำให้ผมมั่นใจว่าสามารถเข้าใจอะไรได้มากขึ้น
ทุกวันนี้ยังเข้าวงการเทคโนโลยีและเรียนรู้ได้อยู่ แต่แทบไม่เห็นเส้นทางที่เกิดจากการลงมือรื้อ ๆ ซ่อม ๆ จริง ๆ แบบนั้นแล้ว
ซอฟต์แวร์แคร็กหรือดีบักได้ยากขึ้นมาก แม้จะไม่ใช่เป็นไปไม่ได้ แต่กำแพงในการเริ่มต้นสูงขึ้นมาก
เว็บเพจก็ยังเปิดดูได้อยู่ แต่เว็บไซต์จำนวนมากในปัจจุบันกลายเป็นกอง div ที่คอยแบกสัตว์ประหลาด JavaScript ที่ถูกบีบอัดและทำให้อ่านยาก ส่วนเกมก็ยากถึงขั้นทำไม่ได้ในหลายกรณี เพราะพึ่งพาการสตรีมคอนเทนต์จากเซิร์ฟเวอร์มากขึ้น
ฮาร์ดแวร์ก็ต้องเจอกระบวนการความปลอดภัยที่อาจทำให้อุปกรณ์กลายเป็นก้อนอิฐ ต้องใช้ปืนลมร้อนเพื่อเปิดขอบหน้าจอที่ติดกาว และต้องยอมเสี่ยงความเสียหายถาวร
การเปลี่ยนแปลงแต่ละอย่างคงมีเหตุผลของมัน แต่ระหว่างทางความสนุกส่วนใหญ่ก็หายไปด้วย และแม้เครื่องมือในวันนี้จะดีกว่าในเชิงเทคนิค การม็อดเกมก็ไม่เหมือนเดิมแล้ว
ทุกวันนี้ก็ยังรื้อ ๆ ลอง ๆ ได้เต็มที่กับพีซีหรือคอนโซลสายพีซีอย่าง Steam Deck แล้วไม่เข้าใจว่าทำไมต้องไปสู้กับคอนโซลปิดที่ออกแบบมาให้ล็อกตั้งแต่แรก
นอกจากการได้สิทธิ์เข้าถึงฮาร์ดแวร์ x86 แบบคัสตอมที่ซื้อได้ถูกในตลาดแล้ว ก็ไม่ชัดว่าได้อะไรอีก
เกม FPS ออนไลน์แบบแข่งขันที่มีชุมชนม็อดแข็งแรงบนพีซีนั้นคึกคักมาก่อนแล้วเกิน 10 ปี
มีชุมชนที่ยังแอ็กทีฟอยู่เพราะ Project Cartographer: https://halo2.online/home/
คนนี้ดูจะทุ่มเทให้ Halo 2 มากกว่าที่ Bungie ทุกวันนี้ทุ่มให้ IP ของตัวเองเสียอีก
IP เป็นของ Microsoft และการพัฒนารับผิดชอบโดย 343 Industries
ตอนนี้ Bungie มี Destiny/Destiny 2 และเกมยิงแนว extraction Marathon ที่กำลังจะออก
ผมใช้เวลากับเกมนั้นไปเยอะมาก และดีใจที่มีคนอื่นที่หลงใหลในมนตร์เสน่ห์เดียวกันเหมือนผม
ถึงอย่างนั้น ความทุ่มเทระดับนี้ก็น่านับถือ
อาจฟังดูประชดประชันเกินไป แต่ตัวโปรเจกต์นั้นเจ๋งจริง ๆ
แค่สงสัยว่าการเปลี่ยน CPU, โอเวอร์คล็อก, เพิ่ม RAM, ใส่สตอเรจโซลิดสเตต และยังโอเวอร์คล็อก GPU ด้วยแบบนี้ จะเรียกว่าผลักดันไปถึง ขีดจำกัดของ Xbox ดั้งเดิม ได้หรือเปล่า
ถึงจุดนั้นมันก็ดูแทบไม่ใช่ Xbox แล้ว
เวลาบอกว่าเอา Honda Civic ไปโมเครื่องยนต์และช่วงล่างเพียบเพื่อเค้นให้ถึงขีดจำกัด แล้วมีคนถามว่า “แต่มันยังเป็น Civic จริง ๆ เหรอ?” ทางเทคนิคอาจถูกก็ได้ แต่ฟังเหมือนจับผิดคำพูด
ผู้เขียนมีสิทธิ์ตั้งชื่อที่ต้องการ และเราแค่อ่านในหัวว่า “ม็อด OG Xbox จนแทบตาย” ก็พอ
เพราะ Halo 2 สามารถรันบน 360 ด้วยความละเอียดสูงกว่าได้ การระบุให้ชัดว่าเป็นโปรเจกต์ม็อดที่มุ่งไปที่ Xbox รุ่นแรกจึงมีประโยชน์
ไม่ได้หมายถึง Xbox ที่ไม่ถูกดัดแปลงตามตัวอักษร แต่หมายถึงเป้าหมายของการม็อดคือ Xbox รุ่นแรก
ยังบอกด้วยว่าบนคอนโซลที่ใช้สาย IDE พื้นฐาน ความเร็วถ่ายโอนเพิ่มขึ้น 10% และถ้าใช้สาย IDE ที่อัปเกรดแล้ว ในทางทฤษฎีอาจเพิ่มได้สูงสุดถึง 300%
ถ้ามี RAM 128MB ก็สามารถใช้ RAM เพิ่มเติมเพื่อเปิดโหมดวิดีโอ 720p และ 1080i และเพิ่มแคชหน่วยความจำสำหรับเท็กซ์เจอร์กับจีโอเมทรี ทำให้แทบไม่มีอาการป็อปอิน
ถ้าต้องการแค่ 480p ก็ใช้คอนโซลเดิม ๆ แล้วโอเวอร์คล็อก GPU พร้อมเปลี่ยนสาย IDE ก็พอ
ถ้อยคำเกี่ยวกับ SSD ดูเหมือนทำให้เข้าใจผิดโดยไม่ตั้งใจ และอาจหมายถึงการใช้สาย 80 พินร่วมกับ SSD
CPU ที่โอเวอร์คล็อกไม่จำเป็น และ CPU ก็ไม่ใช่คอขวด ส่วน RAM ที่เพิ่มขึ้นจำเป็นเฉพาะเมื่ออยากได้ 720p ขึ้นไปเท่านั้น
ได้ส่งฟีดแบ็กนี้ไปแล้ว บล็อกโพสต์จึงอาจอัปเดตให้ส่วนนี้ชัดเจนขึ้น
วงการ คอมพิวเตอร์เรโทร ก็เป็นแบบนั้น และการแต่งรถก็คล้ายกัน
บางคนอยากได้ Corvette สภาพเดิมจากโรงงานที่สมบูรณ์แบบ บางคนอยากได้ Model A ที่ใส่เครื่องยนต์ใหม่กว่ามันอีก 50 ปี
การบิดของที่คุ้นเคยและเป็นที่รู้จักให้เป็นไปตามใจตัวเองเป็นเรื่องเท่
ปริมาณงานมหาศาลมาก
อีกเรื่องที่น่าสนใจคือเพื่อนชื่อ “doom” ไม่อยากเปิดเผยตัวตนของตัวเอง