การปรับขนาดแบบเศษส่วนใน X11 ใช้งานได้จริง: นักพัฒนาพิสูจน์ฟีเจอร์ "เป็นไปไม่ได้" ด้วยโค้ดง่ายๆ

ทีมชุมชน BigGo
การปรับขนาดแบบเศษส่วนใน X11 ใช้งานได้จริง: นักพัฒนาพิสูจน์ฟีเจอร์ "เป็นไปไม่ได้" ด้วยโค้ดง่ายๆ

นักพัฒนาคนหนึ่งได้สาธิตเรียบร้อยแล้วว่า X11 สามารถจัดการกับการปรับขนาดแบบเศษส่วนและการตั้งค่าหลายจอภาพที่มี DPI ต่างกันได้ ซึ่งท้าทายความเชื่อที่แพร่หลายว่าฟีเจอร์เหล่านี้เป็นไปไม่ได้บนโปรโตคอลเซิร์ฟเวอร์แสดงผลที่มีอายุมากแล้ว การพิสูจน์แนวคิดนี้เกี่ยวข้องกับการวาดวงกลมขนาด 2 นิ้วที่สม่ำเสมอบนหลายจอภาพที่มีความละเอียดและความหนาแน่นของพิกเซลต่างกัน

การสาธิตใช้จอแสดงผลสามแบบที่แตกต่างกัน: หน้าจอแล็ปท็อปที่ความละเอียด 2880x1800 จอภาพเดสก์ท็อปที่ 2560x1440 และทีวี 4K ที่ 3840x2160 โดยการสอบถาม extension RandR ของ X11 เพื่อหาขนาดทางกายภาพและจำนวนพิกเซล แอปพลิเคชันสามารถรักษาขนาดทางกายภาพเดียวกันบนทั้งสามหน้าจอได้สำเร็จ

ข้อมูลจำเพาะการแสดงผลของการทดสอบ:

  • แล็ปท็อป: ความละเอียด 2880x1800 ขนาดจริง 302mm x 189mm
  • จอภาพเดสก์ท็อป: ความละเอียด 2560x1440 ขนาดจริง 590mm x 334mm
  • จอแสดงผล TV: ความละเอียด 3840x2160 ขนาดจริง 1600mm x 900mm

การใช้งานทางเทคนิคแสดงความสามารถที่ซ่อนอยู่ของ X11

นักพัฒนาใช้ OpenGL ร่วมกับ extension XRandR ของ X11 เพื่อรวบรวมข้อมูลหน้าจอและคำนวณปัจจัยการปรับขนาดที่เหมาะสม โค้ดจะฟังเหตุการณ์การกำหนดค่าหน้าต่างและปรับการเรนเดอร์โดยอัตโนมัติตามจอภาพที่หน้าต่างปรากฏอยู่ เมื่อลากระหว่างจอภาพ วงกลมจะรักษาขนาดทางกายภาพ 2 นิ้วโดยการคำนวณรัศมีพิกเซลใหม่ตาม DPI ของแต่ละหน้าจอ

วิธีการนี้ทำงานโดยการรวมข้อมูลจาก XRROutputInfo (ซึ่งให้ข้อมูลขนาดทางกายภาพ) และ XRRCrtcInfo (ซึ่งให้ข้อมูลขนาดพิกเซลและตำแหน่ง) จากนั้นแอปพลิเคชันจะคำนวณพิกเซลต่อมิลลิเมตรและปรับการเรนเดอร์ตามนั้น

XRandR (X Resize and Rotate): extension ของ X11 ที่ให้ข้อมูลเกี่ยวกับจอแสดงผลที่เชื่อมต่อและคุณสมบัติของมัน

API หลักของ X11 ที่ใช้สำหรับการปรับขนาด:

  • XRRGetScreenResourcesCurrent() - รับการกำหนดค่าการแสดงผล
  • XRRGetOutputInfo() - ดึงข้อมูลขนาดทางกายภาพของจอแสดงผล
  • XRRGetCrtcInfo() - รับขนาดพิกเซลและตำแหน่ง
  • เหตุการณ์ ConfigureNotify - ตรวจจับการเคลื่อนย้ายหน้าต่างระหว่างจอมอนิเตอร์
การสาธิตเชิงทดลองของการรักษาขนาดที่สม่ำเสมอในการเรนเดอร์กราฟิกข้ามจอภาพต่างๆ คล้ายกับการบรรลุ fractional scaling ใน X11
การสาธิตเชิงทดลองของการรักษาขนาดที่สม่ำเสมอในการเรนเดอร์กราฟิกข้ามจอภาพต่างๆ คล้ายกับการบรรลุ fractional scaling ใน X11

ชุมชนอภิปรายความท้าทายของการปรับขนาดในโลกจริง

แม้ว่าการสาธิตจะพิสูจน์ว่าการปรับขนาดพื้นฐานเป็นไปได้ แต่ชุมชนนักพัฒนาชี้ให้เห็นความท้าทายที่ซับซ้อนกว่าที่ทำให้การปรับขนาดใน X11 เป็นปัญหาในทางปฏิบัติ ปัญหาหลักเกิดขึ้นกับแอปพลิเคชันที่มีอยู่แล้วซึ่งไม่ได้ถูกออกแบบมาเพื่อรองรับการปรับขนาด โดยเฉพาะเมื่อต้องจัดการกับกราฟิกแรสเตอร์ ไอคอน และองค์ประกอบ UI ที่ต้องการความแม่นยำ

ส่วนที่ยากของการปรับขนาดคือการวาดองค์ประกอบ UI เช่น ไอคอนแรสเตอร์หรือเส้นขนาด 1px ให้ดูไม่เบลอ

หน้าต่างที่ขยายข้ามหลายจอภาพที่มี DPI ต่างกันยังคงเป็นปัญหา เนื่องจากส่วนต่างๆ ของหน้าต่างเดียวกันอาจปรากฏในขนาดที่แตกต่างกัน เซิร์ฟเวอร์แสดงผลสมัยใหม่อย่าง Wayland จัดการเรื่องนี้โดยใช้การสร้างเสมือน DPI ซึ่ง compositor จัดการการแปลงการปรับขนาดแทนที่จะปล่อยให้แอปพลิเคชันแต่ละตัวจัดการเอง

บริบทที่กว้างขึ้นของวิวัฒนาการเซิร์ฟเวอร์แสดงผล

การอภิปรายเผยให้เห็นว่าทำไมชุมชนเดสก์ท็อป Linux จึงเปลี่ยนไปใช้ Wayland แม้ว่า X11 จะมีความสามารถทางทฤษฎี แม้ว่า X11 จะสามารถรองรับฟีเจอร์ขั้นสูงผ่าน extension ได้ในทางเทคนิค แต่การใช้งานจริงต้องการความพยายามอย่างมากจากทั้งนักพัฒนา toolkit และผู้เขียนแอปพลิเคชัน แอปพลิเคชันที่มีอยู่หลายตัวก็ไม่ได้ใช้งานการรองรับการปรับขนาดที่เหมาะสม

compositor ของ Wayland ตอนนี้รองรับการปรับขนาดแบบเศษส่วนผ่านโปรโตคอลเฉพาะ โดยทั้ง Qt6 และ GTK4 ได้ใช้งานการรองรับที่เหมาะสมแล้ว อย่างไรก็ตาม การนำไปใช้ยังไม่สมบูรณ์ โดยแอปพลิเคชันบางตัวยังคงใช้วิธีการปรับขนาดแบบเก่าที่อาจทำให้เกิดความเบลอ

การสาธิตนี้เป็นการเตือนใจว่าข้อจำกัดทางเทคนิคมักจะเกี่ยวกับการประสานงานของระบบนิเวศมากกว่าข้อจำกัดของโปรโตคอลพื้นฐาน แม้ว่า X11 อาจมีความสามารถมากกว่าที่เชื่อกันโดยทั่วไป แต่การตัดสินใจของชุมชนนักพัฒนาที่จะมุ่งความพยายามไปที่ Wayland สะท้อนถึงการพิจารณาเชิงปฏิบัติเกี่ยวกับการสร้างประสบการณ์เดสก์ท็อปที่เหนียวแน่นและทันสมัย

การสร้างเสมือน DPI: เทคนิคที่เซิร์ฟเวอร์แสดงผลจัดการการคำนวณการปรับขนาดทั้งหมด โดยนำเสนอแอปพลิเคชันด้วยระบบพิกัดที่สม่ำเสมอโดยไม่คำนึงถึงความละเอียดหน้าจอจริง

อ้างอิง: forbidden secrets of ancient X11 scaling technology revealed