• เมื่อรันเกมแบบเต็มหน้าจอบน MacBook เกมส่วนใหญ่จะเรนเดอร์ภาพเบลอเนื่องจากปัญหา รอยบากบนจอแสดงผล
  • กลไกการ เลือกความละเอียด ของระบบไม่ได้คำนึงถึงพื้นที่รอยบาก ทำให้เลือกพื้นที่แสดงผลผิดพลาด
  • การเลือก ความละเอียด 16:10 เป็นเพียงทางแก้ชั่วคราว แต่ต้นตอจริง ๆ คือการออกแบบ API และคำแนะนำของ Apple ที่ยังไม่เพียงพอ
  • ปัญหานี้เกิดซ้ำได้ในเกมยอดนิยมหลายเกม (เช่น Shadow of the Tomb Raider, No Man’s Sky); ขณะที่บางเกมใหม่กว่าอย่าง Cyberpunk 2077 จัดการได้ถูกต้อง
  • Apple ควรปรับปรุง HIG และ API เพื่อยกระดับแนวทางและการรองรับสำหรับนักพัฒนา

ปัญหา: สาเหตุของการเรนเดอร์ภาพเบลอในเกมแบบเต็มหน้าจอบน Mac

  • ปัญหานี้ถูกส่งให้ Apple แล้วตั้งแต่เดือนกันยายน 2023 ในชื่อ issue FB13375033
  • เมื่อรันเกมแบบเต็มหน้าจอบนจอ MacBook เกมส่วนใหญ่ไม่ได้คำนึงถึง รอยบาก (notch) อย่างถูกต้อง จึงเกิด ข้อผิดพลาดในการเรนเดอร์
  • หลายเกมดึงรายการความละเอียดที่ระบบรองรับมาใช้ แล้วเลือกค่าตัวแรกจากรายการนั้น (ความละเอียดของพื้นที่จอทั้งหมด) แต่ในความเป็นจริง พื้นที่เต็มหน้าจอที่ AppKit ใช้งานได้จะถูกจำกัดให้อยู่ใต้รอยบาก
  • เมื่อเกมแสดงผลที่ ความละเอียดเต็มจอทั้งหมด พื้นที่ที่วาดได้จริงจะเล็กกว่า ทำให้เฟรมถูกบีบในแนวตั้งและนำไปสู่ปัญหา ภาพเบลอ

โครงสร้างพื้นที่ของจอแสดงผลบน Mac

  • จอ Mac ที่มีรอยบากมีพื้นที่หลักอยู่สามส่วน
    • ขอบเขตของจอทั้งหมด (รวมรอยบากและเมนู)
    • Safe area (ใต้รอยบาก)
    • พื้นที่เต็มหน้าจอที่ AppKit ใช้งานได้ (ใต้แถบเมนู)
  • รายการความละเอียดที่ฟังก์ชัน CGDisplayCopyAllDisplayModes ส่งกลับมานั้นปะปนกันระหว่าง ความละเอียดเต็มจอทั้งหมด กับ ความละเอียดใต้แถบเมนู (โดยมากเป็นอัตราส่วน 16:10)
  • เกมส่วนใหญ่มักใช้ค่ารายการแรก (พื้นที่เต็มหน้าจอทั้งหมด) จึงทำให้แสดงผลไม่ถูกต้อง
  • ตัวอย่าง: Shadow of the Tomb Raider เริ่มต้นด้วยความละเอียดเต็มจอทั้งหมด (3456x2234) แต่พื้นที่ที่วาดได้จริงคือ 3456x2160 เท่านั้น (ต่างกัน 74 พิกเซล ทำให้ภาพถูกบีบและเรนเดอร์ออกมาเบลอ)

วิธีแก้: การเลือกความละเอียดที่ถูกต้องและแนวทางเลี่ยงปัญหาชั่วคราว

  • ผู้ใช้: เมื่อเล่นเกมเต็มหน้าจอบน Mac ที่มีจอรอยบาก ควรเลือก ความละเอียด 16:10 ด้วยตนเอง เพราะเกมมักไม่ปรับให้อัตโนมัติ
  • นักพัฒนา: ควรใช้พร็อพเพอร์ตี safeAreaInsets ของ NSScreen เพื่อ กรองรายการความละเอียดให้ละเอียดขึ้น
    • มีการให้โค้ดอัลกอริทึมสำหรับกรองเฉพาะความละเอียดที่ตรงตามเกณฑ์ของ Safe area (แต่มีผลข้างเคียงคืออาจกรองความละเอียดบางแบบ เช่น 4:3 ออกมากเกินไป)
    • อย่างไรก็ตาม โดยแก่นแล้วจำเป็นต้องมีการปรับปรุงจากฝั่ง Apple

เกมที่ได้รับผลกระทบ: ตัวอย่างเกมหลักและสถานะการจัดการ

  • Shadow of the Tomb Raider, Control Ultimate Edition, No Man’s Sky, Riven, Stray และอีกหลายเกมมีอาการเรนเดอร์ถูกบีบและเบลอ เพราะ ค่าเริ่มต้นความละเอียดไม่ถูกต้อง
    • Control: กำหนดความละเอียดเองภายใน แต่ไม่ตรงกับความละเอียดจริงของ Mac
    • No Man’s Sky: แสดงทั้งความละเอียดที่มีอัตราส่วนไม่ถูกต้อง รวมถึงความละเอียดของ safe area และ non safe area
    • Riven, Stray: ตั้งค่าเริ่มต้นให้เรนเดอร์ด้วยความละเอียดที่ถูกบีบ
  • Cyberpunk 2077 เลือก ความละเอียดที่ถูกต้อง ในอัตราส่วน 16:10 (ไม่ได้เปิดเผยวิธีกรองภายใน)
  • World of Warcraft: ใช้ legacy API ที่สามารถวาดไปถึงบริเวณรอยบากได้ จึงใช้ความละเอียดเต็มจอได้อย่างถูกต้อง

สิ่งที่ Apple ควรทำ: ความจำเป็นที่ Apple ต้องจัดการ

  • ควรเพิ่ม แนวทางและคำอธิบายเรื่องการจัดการความละเอียด สำหรับจอมีรอยบากลงในเอกสาร HIG (Human Interface Guidelines)
  • ควรปรับปรุง CGDisplayMode ใน AppKit/Cocoa เพื่อให้ การกรองความละเอียด ทำได้ง่ายขึ้น
  • ควรออกแบบ API ใหม่ สำหรับการปรับแต่งเกมโดยเฉพาะ เพื่อลดปัญหารายการความละเอียดและ boilerplate
  • สำหรับนักพัฒนา ควรพิจารณาแนะนำให้คำนวณรายการความละเอียดเองแทนการ query ความละเอียดจากระบบ หรือใช้แนวทาง “render scale”
  • หากมีการปรับปรุงเหล่านี้ Apple ก็ควรอัปเดตเอกสารทางการและ sample code ควบคู่กันไปด้วย

ยังไม่มีความคิดเห็น

ยังไม่มีความคิดเห็น