1 คะแนน โดย GN⁺ 2024-04-19 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • แพตช์ 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 mode
    • rasterizer_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

แก้ขนาด 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 ความคิดเห็น

 
GN⁺ 2024-04-19
ความคิดเห็นจาก 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 นี้

    • เข้าใจว่า DVD รองรับเฉพาะวิดีโอ anamorphic 4:3 ที่ใช้ พิกเซลไม่เป็นสี่เหลี่ยมจัตุรัส เพื่อให้ได้อัตราส่วนภาพที่ถูกต้องตอนเล่นกลับ
  • “จิตวิญญาณแฮ็กเกอร์” เองนั้นสมเหตุสมผลเต็มที่ แต่ก็สงสัยว่ามีเหตุผลอะไรเป็นพิเศษให้ต้องลำบากเพิ่มหน่วยความจำให้คอนโซลและโอเวอร์คล็อก GPU เพื่อเล่น Halo 2 แบบนี้ แทนที่จะเล่นเวอร์ชัน PC

    • พอร์ต PC ของ Halo 2 นั้นขึ้นชื่อว่าแย่มาก ทั้งในอดีตและตอนนี้ และหนักกว่าสิ่งที่ Gearbox ทำกับ Halo 1 เสียอีก
      มีวิดีโอจำนวนมากที่ลงรายละเอียดข้อบกพร่องในหลายระดับ
      https://youtu.be/03K2Uz3s1hg?si=zaFO1XdzMcFvI1F6
    • เวลาที่อุปกรณ์เก่าถูกมองว่าไม่เหมาะจะทำอะไรสักอย่าง ถ้าทำให้อุปกรณ์นั้นทำสิ่งนั้นได้จริง ก็มักให้ความรู้สึกดี
      เหมือนเป็นการพิสูจน์ว่ามันเป็นไปได้พอสมควร หรือกระทั่งดีกว่าด้วยซ้ำ
      อาจจะเกือบเป็นอุปสรรคทางจิตใจก็ได้ แต่โดยรวมเป็นเรื่องเบา ๆ และสนุก และเหมือนอยู่คนละด้านกับความหมกมุ่นที่จะซื้อรุ่นล่าสุดของอุปกรณ์ยอดนิยมให้ได้ก่อนใคร
      ทั้งสองอย่างให้ ความรู้สึกเหนือกว่า บางแบบ
    • ก็แค่จิตวิญญาณแฮ็กเกอร์นั่นแหละ
      ทุกวันนี้ Halo 2 ยังเล่นได้ผ่านล็อบบี้ออนไลน์หรือแคมเปญ และเลือกได้ทั้งกราฟิกต้นฉบับของ 343 หรือกราฟิก HD แบบรีมาสเตอร์
    • ยังเป็น 30fps อยู่ดี สำหรับผมแล้วเลยตัดทิ้งโดยอัตโนมัติ
  • ในบทความบอกว่า “ระบบข้อมูล tag ถูกออกแบบมาให้ยืดหยุ่นและรวดเร็วที่สุดเท่าที่เป็นไปได้ และการทำงานภายในก็น่าทึ่งในเชิงวิศวกรรม ผมเขียนบทความทั้งบทได้เลยว่าเหตุใดผมถึงคิดว่ามันทำให้เอนจิน Blam เป็นหนึ่งในเอนจินที่ยืดหยุ่นที่สุด แต่เรื่องนั้นไม่เกี่ยวกับบทความนี้” ถ้าบทความนั้นถูกเขียนขึ้นจริง ๆ ก็อยากอ่านมาก

    • ถ้าคุณเคยเขียนเรื่องแบบนี้เอง หรือรู้จักคนที่เขียนไว้ ช่วยแชร์ด้วยก็ดี
    • ตอนเด็ก ๆ เคยทำ ม็อด Halo 2 แต่แทบไม่รู้การเขียนโปรแกรมเลย และแนวคิดที่เห็นจากตรงนั้นทำให้ตื่นตะลึงมาก
      มือใหม่เกินกว่าจะตามทันว่ามันทำงานอย่างไร และมันไดนามิกมากจนโดยพื้นฐานแล้วไม่เข้าใจเลยว่าโครงสร้างแบบนั้นเป็นไปได้อย่างไร
      ไม่เข้าใจว่าทำไมตำแหน่งผู้เล่นถึงอยู่ในบริบทเดียวกับอาวุธที่มีการตั้งค่า และเอฟเฟกต์ต่าง ๆ ยังอยู่ในรายการเดียวกันได้อย่างไร
      หลายสิ่งที่สนใจอยู่ตอนนี้ สุดท้ายก็ยังวนเวียนอยู่รอบ ๆ แนวคิดเหล่านี้
  • อยากให้ยุคของการม็อด Xbox และ Halo 2 กลับมาอีกครั้งในยุคปัจจุบัน
    ช่วงเวลานั้นมีอิทธิพลอย่างมากต่อการเลือกเส้นทางอาชีพของผม และผมยังเชื่อว่า Halo 2 เป็นเกมออนไลน์ที่สร้างนวัตกรรมมากที่สุดตลอดกาล
    แค่ซื้อเครื่องมือง่าย ๆ สำหรับโหลดเซฟเกม ก็ทำ Xbox แบบซอฟต์ม็อดได้ในไม่กี่นาที แต่คอนโซลทุกวันนี้มีทั้งการเป่า e-fuse เพื่อกันดาวน์เกรด และมีการเสริมความปลอดภัยมากขึ้นกว่านั้นมาก
    เมื่อประกอบกับโปรเจกต์ที่ Insignia เริ่มรองรับ Halo 2 นี่จึงเป็นช่วงเวลาที่ดีมากสำหรับ Halo 2 แบบคลาสสิก

    • ไม่ว่าจะมองว่าดีหรือร้าย นักพัฒนาในช่วง 10 ปีที่ผ่านมาเหมือนจะ ถีบบันไดที่ตัวเองเคยปีนขึ้นมา ทิ้งไปในหลาย ๆ ด้าน
      เหตุผลหนึ่งที่ผมมาเป็นวิศวกรซอฟต์แวร์ในตอนนี้ ก็เพราะสมัยก่อนสามารถแอบดูได้ง่ายว่าเว็บเพจทำงานอย่างไร ไปแตะหน่วยความจำของโปรแกรมได้ และเปิดฮาร์ดแวร์ออกมาดูข้างในได้
      สมัย Halo PC ผมได้เรียนรู้มากมายว่าในเกมมีอะไรบ้างจากการม็อดเลเวล และการรู้ว่า “BSP” คืออะไรอาจเป็นความรู้จิปาถะที่ไม่มีประโยชน์ แต่ก็ทำให้ผมมั่นใจว่าสามารถเข้าใจอะไรได้มากขึ้น
      ทุกวันนี้ยังเข้าวงการเทคโนโลยีและเรียนรู้ได้อยู่ แต่แทบไม่เห็นเส้นทางที่เกิดจากการลงมือรื้อ ๆ ซ่อม ๆ จริง ๆ แบบนั้นแล้ว
      ซอฟต์แวร์แคร็กหรือดีบักได้ยากขึ้นมาก แม้จะไม่ใช่เป็นไปไม่ได้ แต่กำแพงในการเริ่มต้นสูงขึ้นมาก
      เว็บเพจก็ยังเปิดดูได้อยู่ แต่เว็บไซต์จำนวนมากในปัจจุบันกลายเป็นกอง div ที่คอยแบกสัตว์ประหลาด JavaScript ที่ถูกบีบอัดและทำให้อ่านยาก ส่วนเกมก็ยากถึงขั้นทำไม่ได้ในหลายกรณี เพราะพึ่งพาการสตรีมคอนเทนต์จากเซิร์ฟเวอร์มากขึ้น
      ฮาร์ดแวร์ก็ต้องเจอกระบวนการความปลอดภัยที่อาจทำให้อุปกรณ์กลายเป็นก้อนอิฐ ต้องใช้ปืนลมร้อนเพื่อเปิดขอบหน้าจอที่ติดกาว และต้องยอมเสี่ยงความเสียหายถาวร
      การเปลี่ยนแปลงแต่ละอย่างคงมีเหตุผลของมัน แต่ระหว่างทางความสนุกส่วนใหญ่ก็หายไปด้วย และแม้เครื่องมือในวันนี้จะดีกว่าในเชิงเทคนิค การม็อดเกมก็ไม่เหมือนเดิมแล้ว
    • Xbox ในยุคนั้นใกล้เคียงกับ พีซีที่ประกอบจากชิ้นส่วนสำเร็จรูป มากกว่าฮาร์ดแวร์สั่งทำเฉพาะ จึงซอฟต์ม็อดได้ง่ายด้วยเครื่องมือเซฟเกมเท่านั้น
      ทุกวันนี้ก็ยังรื้อ ๆ ลอง ๆ ได้เต็มที่กับพีซีหรือคอนโซลสายพีซีอย่าง Steam Deck แล้วไม่เข้าใจว่าทำไมต้องไปสู้กับคอนโซลปิดที่ออกแบบมาให้ล็อกตั้งแต่แรก
      นอกจากการได้สิทธิ์เข้าถึงฮาร์ดแวร์ x86 แบบคัสตอมที่ซื้อได้ถูกในตลาดแล้ว ก็ไม่ชัดว่าได้อะไรอีก
    • คำว่า “Halo 2 เป็นเกมออนไลน์ที่สร้างนวัตกรรมมากที่สุดตลอดกาล” ในบริบทของเกมออนไลน์ แทบจะเป็นสัจพจน์ที่คนเห็นตรงกันเกือบหมดและมีข้อโต้แย้งน้อยมาก
    • อยากรู้ว่า Halo 2 เป็นเกมออนไลน์ที่สร้างนวัตกรรมมากที่สุดตลอดกาลในแง่ไหนกันแน่
      เกม FPS ออนไลน์แบบแข่งขันที่มีชุมชนม็อดแข็งแรงบนพีซีนั้นคึกคักมาก่อนแล้วเกิน 10 ปี
    • ผมยังเล่น Halo 2 บนพีซีอยู่บ่อย ๆ รวมถึงมัลติเพลเยอร์ด้วย
      มีชุมชนที่ยังแอ็กทีฟอยู่เพราะ Project Cartographer: https://halo2.online/home/
    1. บัดกรี RAM ใหม่เพื่ออัปเกรด VRAM จาก 64MB เป็น 128MB, 2) บัดกรี CPU ตัวใหม่ลงในคอนโซลแล้วพบว่าคอขวดอยู่ที่ GPU, 3) เปิดการโอเวอร์คล็อก GPU บน Xbox รุ่นแรก แต่ชนขีดจำกัดแบนด์วิดท์หน่วยความจำ, 4) รีเวิร์สเอนจิเนียร์ ซอร์สโค้ด Halo 2 เพื่อตั้งสเกลเป็น 720p หรือ 1080p (เอาต์พุตเป็น 1080i แบบอินเทอร์เลซ), 5) เร่งความเร็วฮาร์ดไดรฟ์เพื่อให้โหลดเท็กซ์เจอร์เร็วขึ้น
      คนนี้ดูจะทุ่มเทให้ Halo 2 มากกว่าที่ Bungie ทุกวันนี้ทุ่มให้ IP ของตัวเองเสียอีก
    • Bungie ไม่ได้เกี่ยวข้องกับ Halo แล้ว
      IP เป็นของ Microsoft และการพัฒนารับผิดชอบโดย 343 Industries
      ตอนนี้ Bungie มี Destiny/Destiny 2 และเกมยิงแนว extraction Marathon ที่กำลังจะออก
    • พลังของความคิดถึงมีมากจริง ๆ
      ผมใช้เวลากับเกมนั้นไปเยอะมาก และดีใจที่มีคนอื่นที่หลงใหลในมนตร์เสน่ห์เดียวกันเหมือนผม
    • นี่เป็น ผลงานทางวิศวกรรม ที่สุดยอดมากก็จริง แต่พอรู้ว่าสามารถซื้อ Xbox Series X ราคา 500 ดอลลาร์มาเล่นเวอร์ชันรีมาสเตอร์ที่ 4K 120fps ได้ ก็คงยากที่จะลงมือทำเอง
      ถึงอย่างนั้น ความทุ่มเทระดับนี้ก็น่านับถือ
  • อาจฟังดูประชดประชันเกินไป แต่ตัวโปรเจกต์นั้นเจ๋งจริง ๆ
    แค่สงสัยว่าการเปลี่ยน CPU, โอเวอร์คล็อก, เพิ่ม RAM, ใส่สตอเรจโซลิดสเตต และยังโอเวอร์คล็อก GPU ด้วยแบบนี้ จะเรียกว่าผลักดันไปถึง ขีดจำกัดของ Xbox ดั้งเดิม ได้หรือเปล่า
    ถึงจุดนั้นมันก็ดูแทบไม่ใช่ Xbox แล้ว

    • จะยังเรียกว่า Xbox ได้ไหมนั้นถกเถียงกันได้ แต่ในบริบทของหัวข้อนี้และเจตนาของบทความ ส่วนใหญ่ก็ใกล้เคียงกับ การเถียงเรื่องความหมายของคำ
      เวลาบอกว่าเอา Honda Civic ไปโมเครื่องยนต์และช่วงล่างเพียบเพื่อเค้นให้ถึงขีดจำกัด แล้วมีคนถามว่า “แต่มันยังเป็น Civic จริง ๆ เหรอ?” ทางเทคนิคอาจถูกก็ได้ แต่ฟังเหมือนจับผิดคำพูด
      ผู้เขียนมีสิทธิ์ตั้งชื่อที่ต้องการ และเราแค่อ่านในหัวว่า “ม็อด OG Xbox จนแทบตาย” ก็พอ
    • ในบริบทการม็อด Xbox ตรงนี้ “original Xbox” ควรอ่านว่า ไม่ใช่ Xbox 360
      เพราะ Halo 2 สามารถรันบน 360 ด้วยความละเอียดสูงกว่าได้ การระบุให้ชัดว่าเป็นโปรเจกต์ม็อดที่มุ่งไปที่ Xbox รุ่นแรกจึงมีประโยชน์
      ไม่ได้หมายถึง Xbox ที่ไม่ถูกดัดแปลงตามตัวอักษร แต่หมายถึงเป้าหมายของการม็อดคือ Xbox รุ่นแรก
    • อย่างน้อยการใช้ เมนบอร์ด เดิมก็ยังมีความหมายอยู่
    • จากที่ดูรีโพ GitHub เขาบอกว่าใช้แพตช์นี้ได้แม้ไม่มีคอนโซลที่อัปเกรด CPU และในการทดสอบก็วัดไม่พบการเพิ่มประสิทธิภาพเพิ่มเติมด้วย
      ยังบอกด้วยว่าบนคอนโซลที่ใช้สาย IDE พื้นฐาน ความเร็วถ่ายโอนเพิ่มขึ้น 10% และถ้าใช้สาย IDE ที่อัปเกรดแล้ว ในทางทฤษฎีอาจเพิ่มได้สูงสุดถึง 300%
      ถ้ามี RAM 128MB ก็สามารถใช้ RAM เพิ่มเติมเพื่อเปิดโหมดวิดีโอ 720p และ 1080i และเพิ่มแคชหน่วยความจำสำหรับเท็กซ์เจอร์กับจีโอเมทรี ทำให้แทบไม่มีอาการป็อปอิน
      ถ้าต้องการแค่ 480p ก็ใช้คอนโซลเดิม ๆ แล้วโอเวอร์คล็อก GPU พร้อมเปลี่ยนสาย IDE ก็พอ
      ถ้อยคำเกี่ยวกับ SSD ดูเหมือนทำให้เข้าใจผิดโดยไม่ตั้งใจ และอาจหมายถึงการใช้สาย 80 พินร่วมกับ SSD
      CPU ที่โอเวอร์คล็อกไม่จำเป็น และ CPU ก็ไม่ใช่คอขวด ส่วน RAM ที่เพิ่มขึ้นจำเป็นเฉพาะเมื่ออยากได้ 720p ขึ้นไปเท่านั้น
      ได้ส่งฟีดแบ็กนี้ไปแล้ว บล็อกโพสต์จึงอาจอัปเดตให้ส่วนนี้ชัดเจนขึ้น
    • การเค้นประสิทธิภาพจากฮาร์ดแวร์เดิมให้ได้มากที่สุดนั้นเป็นเป้าหมายอย่างหนึ่งในตัวเอง
      วงการ คอมพิวเตอร์เรโทร ก็เป็นแบบนั้น และการแต่งรถก็คล้ายกัน
      บางคนอยากได้ Corvette สภาพเดิมจากโรงงานที่สมบูรณ์แบบ บางคนอยากได้ Model A ที่ใส่เครื่องยนต์ใหม่กว่ามันอีก 50 ปี
      การบิดของที่คุ้นเคยและเป็นที่รู้จักให้เป็นไปตามใจตัวเองเป็นเรื่องเท่
  • ปริมาณงานมหาศาลมาก
    อีกเรื่องที่น่าสนใจคือเพื่อนชื่อ “doom” ไม่อยากเปิดเผยตัวตนของตัวเอง

    • ไม่ใช่ว่าเราควรจริงจังกับการคาดเดา หรือควรคาดเดาเลยด้วยซ้ำ แต่ถ้าทำงานในวงการที่ทำให้ต้องคิดอีกที ก่อนจะเชื่อมโยงตัวตนในโลกจริงเข้ากับ การทำวิศวกรรมย้อนกลับ Xbox ก็เข้าใจได้ว่าทำไมถึงเป็นแบบนั้น
    • นึกถึง Doom9 ขึ้นมา
    • แทบจะแน่นอนว่าน่าจะเป็น grimdoomer