- เมื่อรันเกมแบบเต็มหน้าจอบน 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 ควบคู่กันไปด้วย
ยังไม่มีความคิดเห็น