พอดีว่ามีแฟนเพจท่านนึง (และก็เป็นเพื่อนผมด้วย) รีเควสมาว่า หาโพสที่ผมเคยเขียนอธิบายเรื่องนี้ไว้ไม่เจอ ผมเขียนเป็นคอมเมนต์ตอบในโพสนึงในหน้าฟีดของเพจ LEVEL51 เนี่ยแหละ
ในคอมเมนต์ผมอธิบายแก้ความเข้าใจผิดในเรื่องที่ว่า การใช้จอ 144Hz (หรือ 120Hz) เป็นการสิ้นเปลืองโดยเปล่าประโยชน์ เพราะว่าเกมหลายเกมใจปัจจุบัน ก็ไม่ได้ทำงานที่ความเร็ว 144fps ได้ตลอดเวลา มองไม่เห็นอยู่ดี ในโพสนั้นผมอธิบายไว้ไม่ยาวมาก แต่มีหลายท่านก็ถูกใจ ก็สำหรับในโพสนี้ ผมขออาสาอธิบายสาเหตุที่ว่า ทำไมเราควรจะใช้หน้าจอ Hz สูงสุดเท่าที่เป็นไปได้ เพื่อความลื่นที่สุดเวลาเล่นเกม ต่อให้ fps จะไม่ถึง Hz ของหน้าจอก็ตาม
โดยเริ่มแรก เราจะต้องมาทำความเข้าใจการทำงานของเกมก่อนเลย
วิธีการที่เกมทำงาน
โปรแกรมทั้งหมดในทุก OS จะทำงานเป็น Loop หมุนวนไปเรื่อยๆ เสมอ สำหรับโปรแกรมที่ไม่ใช่เกมบน Windows ก็จะมี Windows Message Loop คอยจับข้อมูลที่ระบบของ Windows ส่งมา แล้วถึงค่อยไปแปลเป็น Event อีกที ถ้าอยากอ่านต่อไปทางนี้ ส่วนโปรแกรมที่เป็นเกม ก็ยังมี Loop นี้เหมือนกัน โดยเรียกว่า "Game Loop" หรือ "Main Loop" ถ้าอยากอ่านละเอียดก็ไปทางนี้
สำหรับ Game Loop ถ้าแปลเป็นภาษาอังกฤษแบบที่ทุกคนเข้าใจได้คร่าวๆ จะประมาณนี้
While Game is Running
● Read User Input
● Process Game Rule and AI
● Set Polygons Position in Game World
● Send Data to GPU for Render
Back to Beginning (Loop)
จาก Game Loop จำลองเบื้องต้น จะเห็นว่า ส่วนที่ GPU นั้นทำงานวาดภาพออกมา จะเป็นแค่งานในส่วนสุดท้าย ก่อนจะมีภาพอะไรออกมาได้ จะมีขั้นตอนต่างๆ ตามลำดับ ที่ต้องใช้ CPU ในการประมวลผล ก็คือ
- Read Input ทำงานในการอ่านสถานะของ Hardware ว่าตอนนี้เรากดปุ่มอะไรอยู่บ้าง
- Process Game Rule and AI จากนั้นก็มาประมวลผลว่า การกดหมายถึงอะไร เช่น ถ้ากด W หมายถึงผู้เล่นต้องเดินหน้าต่อ ถ้ายังกด W อยู่จากครั้งที่แล้ว และถ้ายังไม่ชนกำแพงก็ขยับตัวละครไปข้างหน้าต่อ ส่วนถ้าบอทมองเห็นตัวละครผู้เล่น ก็ให้ยิงกระสุนออกมา
- Set Polygons Position in Game World พอทุกอย่างลงตัว ก็เอาข้อมูลโลกจำลองในเกมทั้งหมด ไปสร้างออกมาเป็นโพลีกอนสามมิติ ตัดเอาเฉพาะส่วนที่อยู่ข้างหน้าของผู้เล่น (Culling) เตรียมส่งให้ GPU
- Send Data to GPU for Render ขพอข้อมูลโพลีกอนพร้อมแล้ว CPU ก็จะทำการส่งข้อมูลพวกนั้น แล้วก็ภาพ Texture ไปที่การ์ดจอ เพื่อให้การ์ดจอทำการประมวลผลออกมาเป็นภาพที่ผู้เล่นมองเห็นอีกที คือขั้นตอน Rasterization
การที่ Game Loop แบบนี้ ทำงานครบ 1 รอบ เรียกว่า 1 Frame ของเกม และการที่ Game Loop นี้ สามารถทำงานได้บ่อยๆ ใน 1 วินาที เราเลยเรียกว่า "Frames per Second" หรือ fps นั่นเอง จะเห็นว่า fps ไม่ได้ขึ้นกับการ์ดจอเพียงอย่างเดียว แต่ขึ้นกับความเร็วของ CPU ด้วย ถึงได้มีการพูดเรื่อง "คอขวด" เกิดขึ้น
ตรงนี้แหละ ที่เป็นที่มาของ Input Lag, Network Latency, Interpolation Delay ที่มีคนพูดถึงกัน และต่อเนื่องไปถึงการที่ว่าทำไม Clock Speed ของ CPU ถึงมีผลกับ fps ของเกม เพราะยิ่ง Clock Speed สูง Game Loop นี้ก็สามารถทำงานได้เร็วนั่นเอง และการที่ Intel กล้าบอกว่า CPU ของเขาเป็น "Best Gaming CPU" เพราะว่า Intel มี CPU ที่ Clock Speed สูง และแต่ละ Clock มีงานออกมาได้มากกว่า (หมายถึง IPC สูง - ซึ่งอาจจะไม่จริงเท่าไหร่แล้วในตอนนี้) และแต่ละ Core อยู่ด้วยกันหมด (Monolithic Design) จึงสามารถแชร์ข้อมูลกันได้เร็วกว่า ซึ่งออกจะดูขัดแย้งกับความรู้สึกซักหน่อย เนื่องจาก CPU AMD นั้น ให้จำนวน Core/Thread มากกว่า 30% และราคาก็เท่าๆ กัน Core เยอะกว่า ทำงานได้พร้อมกันมากกว่า ก็เกมควรจะเร็วกว่าจริงไหม
เสริมหน่อย จำนวน Core ของ CPU กับการเล่นเกม
(ภาพ: CPU AMD สถาปัตยกรรม Zen ที่ออกแบบเป็น "Chiplet" เอา Core หลายๆ ชิ้น ต่อกันบน Package เดียว ใน 1 ชิ้น มีตั้ง 4-8 Core แน่ะ)
โดยส่วนมากแล้ว เราจะไม่สามารถกระจายงานใน Game Loop ออกไปหลาย Core ได้ง่ายนัก เพราะว่างานมันต่อเนื่องกัน (มี Data Dependency) นั้นก็คือ เราส่งข้อมูลไป GPU ไม่ได้ จนกว่าจะกำหนดโพลีกอนเสร็จ และเราก็กำหนดโพลีกอนไม่ได้ นอกซะจากว่าจะรัน Game Rule เสร็จ และเราก็ไม่สามารถรัน Game Rule ได้ จนกกว่าจะอ่าน Input จบ เป็นต้น
จริงอยู่ที่ เราสามารถรัน AI สำหรับตัวละครหลายตัวพร้อมกัน โดยใช้ CPU หลาย Core ได้อยู่ แต่การกระจายงานแบบนี้ ก็มี Overhead อีก นั่นก็คือ เราต้องสร้างคนคุมงาน ให้มาเก็บงานและตามงานจาก CPU แต่ละ Core อีกอยู่ดีในตอนจบ (เรียกว่าการ Synchronization) รวมไปถึง AI แต่ละตัวก็สามารถ สร้างผลกระทบกับโลกภายในเกมได้ เราก็จะต้องเขียนโปรแกรมเพื่อให้ AI ทุกตัว ไม่ส่งกระทบถึงโลกในเกมพร้อมกัน (Mutial Exclusion) หรือต้องมีการจัดลำดับว่า อะไรจะเกิดก่อนหลัง
ส่วนเรื่องคอขวด ขอให้สบายใจ และอย่าไปกังวลกับมันมากนัก มันมีอยู่จริง แต่ไม่ได้มีผลกับเรามากนัก เนื่องจากเกมส่วนมากจะ GPU Bound แปลว่า การ์ดจอทำงานนานกว่า CPU ใน 1 Frame น้อยมากที่จะมีเกมที่ CPU Bound คือ CPU ทำงานมากกว่าการ์ดจอใน 1 Frame โดยเกมที่ CPU Bound มักจะเป็นเกมแนว Simulation, เกมวางแผน ที่ควบคุมทีละพันยูนิต อะไรแบบนี้ ถ้าย้อนกลับไปดู Game Loop น่าจะพอเข้าใจว่า กว่าจะเตรียมข้อมูลสำหรับเกมให้ GPU เสร็จ เกมวางแผน เกม Simulation มันจะต้องใช้เวลานานกว่าเกมชนิดอื่นๆ นั่นเอง
ถ้าเรามองเห็นคอขวด ก็คือ เล่นเกม แล้ว GPU มันไม่โหลด 100% (คือ GPU มันทำงานเสร็จเร็วเกินไป) ไม่ได้แปลว่า เราจะต้องเดินไปซื้อ CPU ใหม่มาใส่ แต่แปลว่าตอนนี้ เรายังใช้การ์ดจอไม่สุด ให้ไปปรับกราฟิกขึ้นอีก ใส่เข้าไป Anti-Alias 4x 8x, Ambient Occlusion เดี๋ยวมันก็ 100% เอง! ยกเว้นกรณีที่เราจะเล่นเกมที่ต้องการดัน fps สูงสุด อย่าง CS:GO อันนี้แหละที่จะต้องดูว่า Clock Speed เรายังสามารถเพิ่มได้มากกว่านั้นไหม และเป็นที่มา ว่าทำไมถ้าลูกค้าที่มองหาเครื่องเล่น CS:GO เราถึงแนะนำเป็น GXL ที่ใช้ CPU Desktop ที่มี Clock Speed สูงกว่า CPU Notebook ครับ
วิธีการที่จอแสดงผล
สำหรับจอภาพนั้น ทั้งจอสมัยก่อน และสมัยนี้ จำเป็นจะต้องมีการ Refresh ซึ่งก็คือการ "กระตุ้น" สารเคมีภายในตัวจอ ให้ยังคงมีภาพออกมาอยู่ สำหรับจอภาพแบบ LCD (หรือจอ LED ซึ่งคือจอ LCD ที่ใช้ไฟ LED ส่องสว่าง) ในยุคปัจจุบัน ยังคงต้องมีการถูกกระตุ้นอยู่เช่นกัน ถ้าไม่อย่างนั้นภาพมันจะเลือนลงไป เพียงแต่ว่าไม่จำเป็นต้อง Refresh บ่อย เท่ากับจอแบบ CRT เท่านั้นเอง แต่อันนี้ยกเว้นจอภาพชนิด e-ink ที่ไม่ต้องมีการ Refresh เลย
และด้วยการที่สารเคมีในหน้าจอต้องมีการถูกกระตุ้นอยู่ตลอดนี่เอง ก็เลยเป็นที่มาของการออกแบบว่า หน้าจอ จะต้องมีการ "Refresh" เกิดขึ้น นั่นก็คือ ต่อให้ภาพที่แสดงบนหน้าจอ Desktop เราจะเป็นภาพเดิมก็ตาม แต่การ์ดจอก็ยังคงจะต้องส่งภาพเดิมไปยังหน้าจอซ้้ำๆ กัน โดยอัตราการส่งภาพไปยังหน้าจอนี้ เรียกว่า "Refresh Rate" โดยมีอัตราคงที่เสมอ ขึ้นอยู่กับตัวหน้าจอ เช่น 60Hz, 75Hz, 120Hz, 144Hz เป็นต้น โดย Hz หรือ Hertz หมายถึง จำนวนครั้งต่อวินาที สำหรับ 60Hz ก็คือ มีการ Refresh ภาพ 60 ครั้งต่อวินาที นั่นเอง
สำหรับวิธีการที่หน้าจอนั้นแสดงผลภาพได้ จะเป็นการรับข้อมูลภาพ จากหน่วยความจำส่วนนึงบนการ์ดจอ ที่กันเอาไว้สำหรับให้หน้าจอ มาอ่านภาพออกไป (ในความเป็นจริง หน้าจอไม่ได้อ่านภาพออกมา เป็นตัวควบคุมจอภาพ หรือ Display Controller ที่อยู่ในการ์ดจอ ที่อ่านภาพนี้ แต่เพื่อความเข้าใจง่ายๆ เรียกว่า หน้าจอมาอ่านภาพออกไปแล้วกัน) เรียกว่า Framebuffer และการที่หน้าจออ่านภาพ เรียกว่า Scan ซึ่งจะเป็นการอ่านจากบนลงล่างเสมอ นั่นก็คือ ใน 1 วินาที สำหรับหน้าจอ 60Hz จะมีการอ่านภาพจาก Framebuffer นี้จากบนสุดไปล่างสุด 60 ครั้งวนไปเรื่อยๆ ถ้าใน Framebuffer มีภาพ Desktop ของ Windows อยู่ และเราไม่ขยับเมาส์ (และไม่เปิด Wallpaper Engine) เราก็จะเห็นภาพเดิมซ้้ำไปเรื่อยๆ แบบนี้จนเหมือนว่ามันเป็นภาพนิ่งอยู่บนหน้าจอ ทั้งที่หน้าจอมีการ Refresh อยู่ตลอดเวลาก็ตาม
ปัญหาจากการที่หน้าจอ กับเกม ทำงานไม่พร้อมกัน
ตัวอย่างง่ายที่สุดของปัญหา ให้ลองสังเกตเวลาเรานั่งรถยนต์ และเปิดไฟเลี้ยวติดอยู่ที่แยกบนถนน ก็คือไฟเลี้ยวในรถยนต์แต่ละคัน จะกระพริบในอัตราที่ไม่เท่ากัน แต่ถ้าเรานั่งมองไปเรื่อยๆ นานๆ มันก็จะมีจังหวะที่มากระพริบพร้อมกันซักทีนึง แต่กระพริบพร้อมกันได้สองหรือสามที สักพักเดี๋ยวมันก็จะค่อยๆ ห่างขึ้นเรื่อยๆ จนไปถึงในระดับที่กระพริบสลับกันเลย ก่อนจะค่อยๆ กระพริบใกล้เคียงกันเรื่อยๆ แล้วก็มาพร้อมกันอีก วนไปแบบนี้
Game Loop กับ Display Refresh ก็เป็นลักษณะเดียวกับไฟเลี้ยวนี่เหมือนกัน เนื่องจาก Game Loop และ Display Refresh ต่างคน ก็ต่างทำงาน (จะว่า ต่างคนต่างกระพริบก็ได้) เริ่มก็ไม่พร้อมกัน นานๆ ทีมันถึงจะมาพร้อมกันสักที แต่ส่วนมาก มันจะไม่พร้อมกันเลย เพื่อความเข้าใจที่ชัดเจนมากขึ้น ลองมาดูตัวอย่างไปพร้อมกันดีกว่า
สมมุติว่าหน้าจอ เป็นขนาด 1000x1000 พิกเซล (หรือ สูง 1000 เส้น) และมีอัตรารีเฟรชอยู่ที่ 100Hz นะ ตอนนี้หน้าจอเริ่มการ Refresh ไปแล้ว 20% นั่นก็คือ มีการอ่าน Framebuffer ไปแสดงบนหน้าจอแล้ว 200 เส้น
(ตัวเลขมาจากไหน? ก็มาจาก 1 วินาทีมี 1,000 มิลลิวินาที เอา 1000 หาร 100Hz ได้ออกมาเป็น 10 มิลลิวินาที หรือ 10ms และทุกๆ 1ms อ่านได้ 100 เส้น เนื่องจากหน้าจอสูง 1,000 เส้นครับ)
ปรากฏว่า ในขณะเดียวกัน Game Loop ทำงาน และใช้เวลาไป 1ms (แปลว่า เกมทำงานที่ความเร็ว 1000fps) ทำให้การ์ดจอมีการวาดภาพใหม่ของเกม ใส่ไปใน Framebuffer เรียบร้อย โดยใน 1ms ที่ผ่านไปนี้ หน้าจอก็อ่าน Framebuffer ไปอีกหน่อย คืออีก 100 เส้น รวมเป็นตอนนี้ หน้าจอแสดงผลไปแล้ว 300 เส้นจากด้านบน แต่ว่าภาพใน Framebuffer กลายเป็นภาพใหม่ไปซะแล้ว
ระหว่างนี้ Game Loop ก็ยังทำงานอยู่ แต่ทำงานช้าลงหน่อย กลายเป็นใช้เวลาเป็น 2ms และก็มีภาพที่ 3 อยู่ใน Framebuffer ส่วนหน้าจอ ก็อ่านไปได้อีก 200 เส้น สังเกตว่า ภาพบนหน้าจอ ตอนนี้มีทั้งสีฟ้าและสีส้มผสมกันแล้ว
Game Loop ก็ยังทำงานต่อไม่หยุด แต่ว่า เฟรมนี้ทำงานได้ช้าหน่อย กลายเป็นใช้เวลา 5ms ด้วยเวลา 5ms หน้าจอก็สามารถ Scan ได้จนจบ Framebuffer พอดี ครบ 1,000 เส้น
จากภาพตัวอย่าง จะเห็นว่าในหน้าจอของเรา ที่เรามองเห็นด้วยตา 1 ภาพ มีภาพจากเกมมากกว่า 1 ภาพ ปรากฏการณ์แบบนี้ คืออาการที่เรียกว่า Tearing นั่นเอง และจะเกิดขึ้นอย่างเลวร้ายที่สุด เมื่อ Game Loop (fps) กับ Refresh Rate ต่างกันมากๆ หารกันไม่ลงตัวมากๆ โดยอาการ Tearing จะแย่ที่สุดตอนที่มีการหันซ้ายขวา หรือวัตถุบนหน้าจอ มีการเคลื่อนที่ในแนวนอนครับ เราก็จะเห็นตัวละครในเกม แยกเป็นหลายๆ ท่อนเลย ในตัวอย่างนี่คือแค่ 1 ภาพจาก 1/100 วินาทีนะ ถ้าเป็นภาพแบบนี้ 100 ภาพต่อๆ กัน มันจะเละมากๆ
Double, Triple, Quad Buffer ช่วยได้ไหม
Double Buffering (หรือ Multiple Buffering) คือการให้การ์ดจอ กับหน้าจอ ทำการเขียน/อ่าน Framebuffer จากคนละที่กัน สำหรับกรณี Double Buffering ก็คือ จะมี Framebuffer 2 ชุด ชุดที่หน้าจอกำลังอ่านอยู่ เรียก Front Buffer ส่วนชุดที่การ์ดจอกำลังวาดภาพลงไป เรียกว่า Back Buffer เมื่อการ์ดจอทำการวาดภาพเสร็จแล้ว ก็จะทำการสลับ Buffer (Buffer Swap) เพื่อแลก Buffer กับหน้าจออีกที แต่ปัญหา Tearing ที่กล่าวถึง ก็ยังเกิดขึ้นอยู่ดี ไม่ว่าจะ Triple (3) หรือ Quad (4) ก็ตาม เพราะว่าสิ่งที่ Double Buffering ต้องการแก้ไขคือ ไม่ต้องการให้หน้าจอ แสดงภาพ ระหว่างที่มันกำลังถูกวาดมากกว่า และเดี๋ยวนี้เราจะมีการทำ Post-Processing Effects ด้วย ถ้าไม่มีการทำ Double Buffer แล้วละก็การ์ดจอจะไม่สามารถย้อนกลับไปปรับแสงปรับสีอะไรได้เลย เพราะวาดลงไปปุ๊บ จอภาพก็เอาไปแสดงผลทันที
ปัจจุบันนี้ ทุกอย่างที่เรามองเห็นบนหน้าจอคอมพิวเตอร์ ขั้นต่ำคือ ผ่านการทำ Double Buffering มาแล้วทั้งหมดนะ และยิ่ง Windows รุ่นใหม่ การวาดภาพหน้าจอเกม จะเป็นการวาดใส่ Buffer แล้วโยน Buffer กันไปมา โดย Windows เป็นคนจัดการการแสดงผลเอง จะไม่มี Exclusive Mode ที่เกมสามารถแย่งการแสดงผลหน้าจอไปได้ทั้งหมดแบบสมัยก่อนแล้ว
V-Sync
เทคนิคที่เกิดขึ้นเพื่อช่วยแก้ไขอาการ Tearing คือ Vertical Synchronization หรือที่เรียกกันว่า V-Sync โดยการเปิดออปชั่นนี้ในเกม จะเป็นการเปลี่ยนแปลง Game Loop เล็กน้อย (ในเชิงความเข้าใจ) ดังนี้
While Game is Running
● Read User Input
● Process Game Rule and AI
● Set Polygons Position
● Send Data to GPU for Render to Back Buffer
● Wait For Current Scan To Complete (Vertical Synchronization)
● Swap Buffer
Loop
นั่นก็คือ หลังจากเกมสั่งให้ GPU วาดภาพลง Buffer แล้ว จะต้องมีการรอจนกว่า หน้าจอ วาดภาพจนเสร็จก่อน แล้วจึงส่งภาพใหม่ไป (เกิด Buffer Swap) ดังนั้นไม่มีทางที่จะเกิด Tearing ได้เลย เพราะเกม จะต้อง "รอ" หน้าจอก่อน นั่นเอง
ปัญหาของ V-Sync
การเปิด V-Sync เป็นการแก้ปัญหา Tearing แต่ทำให้เกิดปัญหาใหม่ขึ้นมาแทน ก็คือ Input Lag นั่นก็คือ ในความรู้สึกของผู้เล่น หลังจากกดปุ่มไปแล้ว โดยเฉพาะปุ่มยิง กว่าจะเห็นภาพ Muzzle Flash หรือไฟที่ปลายกระบอกปืนบนหน้าจอ นั้น จะมีระยะเวลาเว้นว่างไปประมาณหนึ่ง (Delay) เพราะว่า เกมจะต้องหยุดรอหน้าจอ ยิ่งสำหรับกรณีของหน้าจอ 60Hz นั้น ทำงานได้ช้ากว่าเกมเป็นอย่างมาก Delay ที่นานที่สุดที่เป็นไปได้ (Worst Case Scenario) เลยคือ 16.67ms เลยทีเดียว คือนั่นก็คือการ์ดจอเรนเดอร์เสร็จ แล้วจอเพิ่งจะเริ่มอ่านเส้นที่ 1 ของ Frame ที่ผ่านมาพอดี ทุกอย่างก็ต้องหยุดรอจนกว่าจอจะ Scan ครบทุกเส้น
นอกจากนี้ ยังทำให้เกิดอีกปัญหาด้วย ก็คือ Stutter ก็คือการที่หน้าจอแสดงภาพเดิมซ้ำอีกรอบนึง เพราะว่ายังไม่มีภาพใหม่จากการ์ดจอส่งไป เนื่องจากว่า Game Loop ที่ผ่านมา อาจจะทำงานจบตอนช่วงที่หน้าจอเริ่ม Scan อีกรอบไปแล้ว
ขอยืมภาพเก่าของ Nvidia มาใช้อธิบายหน่อยเลยละกัน
ฟังดู 16ms อาจจะไม่เยอะ แต่ถ้าตอนนี้ ลองเปิดเว็บ Speed Test จะพบว่า เวลาที่สัญญาณจากเครื่องเรา ใช้ในการเดินทางไปหา Test Server ในกรุงเทพฯ และวิ่งกลับมา (Ping) นั้น อยู่ที่ 3ms และ Ping จากไทยไปกลับ Data Center สิงคโปร์ในเกม Overwatch อยู่ที่ประมาณ 20-30ms เองนะ!!!
จอภาพที่มีอัตรา Refresh สูง สามารถช่วยได้อย่างไร
อย่างที่ได้กล่าวไปแล้วว่า ถ้าเป็นเกมที่มีการตอบสนองไวมากๆ เราจะต้องปิด V-Sync (ไม่ใช่ควรนะ ต้อง เลย) แต่มันจะทำให้เกิด Tearing แทนอย่างที่ได้กล่าวไว้ตอนต้นแทน
แต่ด้วยความที่หน้าจอ มีอัตราการ Refresh ที่เร็วมาก โอกาสที่จะเกิด Tearing แบบขั้นร้ายแรง คือใน 1 ภาพบนจอ มีภาพจากในเกมย้อนหลังไปทีละ 3 ท่อนนั้น เลยมีน้อยลง เพราะ Refresh Rate กับ Fps เกม ต่างกันไม่มากนัก และด้วยความที่จอมัน Refresh เร็วมาก โอกาสที่เราจะสังเกตเห็น Tearing ได้ ก็น้อยลงไปด้วยเช่นกัน
และในทางกลับกัน สำหรับการเล่นเกม ที่อาจจะไม่ได้ต้องอาศัยความว่องไวในการตอบสนองขนาดนั้น เราก็สามารถเปิด V-Sync ได้ โดยไม่ทำให้ Input Lag มีมากจนเกินไป ภาพก็จะลื่นกว่า โดยสำหรับหน้าจอแบบ 144Hz นั้น ระยะเวลา Delay สูงสุดจะอยู่ที่เพียง 6.94ms หรือแทบจะเท่ากับความเร็วที่แท่ง Crystal ในหน้าจอ LCD หมุนได้อยู่แล้ว (Response Time) ส่วนหน้าจอแบบ 300Hz นั้น ระยะเวลา Delay จะอยู่ที่เพียง 3.33ms ตัวแท่ง Crystal มันแทบจะหมุนไม่ทันกันแล้วเลยทีเดียว~!!!
ส่วนอีกเรื่องที่ผมสังเกตเห็นก็คือ ในเครื่องที่หน้าจอ Refresh Rate สูง ต่อให้เกม ทำงานที่ fps ต่ำ ในความรู้สึก มันจะดูลื่นกว่า เพราะเวลาที่ Frame Rate ต่ำลงกว่าอัตราการ Refresh ของหน้าจอ มันจะเกิดอีกปัญหาขึ้นแทน คือ การเห็นภาพซ้ำ (Judder/Stutter) ก็คือระยะเวลาระหว่าง Frame ในเกม ห่างไม่เท่ากัน แต่อันนี้ขอเดาว่า ด้วยความทีภาพมัน Refresh เร็วมาก เราเลยมองไม่ออก เพราะจากที่เคยลองใส่หน้าจอ 120Hz ให้กับลูกค้าที่ใช้เครื่องที่เป็นการ์ดจอ 950M มันก็รู้สึกลื่นขึ้นจริงๆ ตอนที่เล่นเกม ทั้งที่ fps อยู่ที่ 30-40
แล้ว G-Sync / FreeSync ละ
G-Sync และ FreeSync เป็นเทคโนโลยีในกลุ่มที่เรียกว่า Variable Refresh Rate ซึ่งปัจจุบันมีการเพิ่มเข้ามาในมาตรฐาน HDMI 2.1 (HDMI VRR) เรียบร้อยแล้ว PS5, XBOX Series X ก็รองรับด้วยอีกต่างหาก ต่อไปหน้าจอที่รองรับ VRR น่าจะมีมากขึ้น
เทคโนโลยี VRR นี้ จะทำกลับกันกับ V-Sync ก็คือ แทนที่จะให้เกม รอหน้าจอวาดภาพจนเสร็จ ก็เปลี่ยนเป็น ให้หน้าจอ รอภาพจากเกมแทนแล้วค่อย Refresh โดยอาศัยว่า หน้าจอแบบ LCD นั้น ไม่จำเป็นต้องมีการ Refresh ตลอดเวลาก็ได้ มันสามารถคงภาพเดิมไว้ได้ประมาณนึง โดยอย่างทีวีที่ผมใช้อยู่ สามารถมี Refresh ต่ำสุดอยู่ที่ 24Hz และสูงสุดอยู่ที่ 120Hz นั่นก็คืออัตราการ Refresh มันไม่คงที่ (Variable) นั่นเอง
ถ้าท่านไหนเคยเล่นหน้าจอ FreeSync/G-Sync ก็น่าจะรู้สึกได้เลยว่ามันรู้สึกลื่นมาก แต่แน่นอนว่า เนื่องจากมันยังมีการ "Sync" กันอยู่ อะไรก็ตามที่อยู่ในการเขียนโปรแกรมแล้วต้องมีการ Sync ก็หมายถึงจะต้องเกิดการรอเสมอ การใช้หน้าจอ VRR เป็นแค่การ "ลด" Input Lag เท่านั้น (สังเกตว่าใน Slide ใช้คำว่า "Less" ไม่ใช่ No) แต่ว่าไม่ได้กำจัด Input Lag จากการรอภาพบนหน้าจอออกไป การปิด Sync ทุกอย่าง จะเป็นการกำจัดการรอพวกนี้ออกทั้งหมด
Refresh Rate สูงแค่ไหนถึงจะพอ
เมื่อเราปิดการ Sync ทุกอย่างแล้ว หน้าจอก็จะเหมือนกับว่าเป็นอุปกรณ์ในการ Sampling หรือ จับภาพข้อมูลจากในโลกของเกมออกมา ดังนั้น ยิ่งหน้าจอ สามารถ Sampling ได้บ่อย จากการที่มัน Refresh เราก็จะได้ข้อมูลที่เป็นปัจจุบันที่สุด ต้องอย่าลืมว่า สิ่งที่เรียกว่า fps นั้น เป็นค่าที่เป็นค่าประมาณ และเราไม่สามารถคำนวณ fps ในชั่วขณะนั้นได้ เพราะชื่อมันก็บอกอยู่ว่า มันคือ "Frames per second" (ค่า fps ที่เที่ยงตรง ก็จะต้องเป็นการรวบรวมข้อมูลไว้ว่า ใน 1 วินาที นั้น Game Loop ทำงานไปกี่ครั้ง ถ้าเลข fps มันขยับบ่อยๆ กว่า 1 ครั้งต่อวินาที ก็คือเป็นการประมาณเอาจากในช่วงเวลาที่สั้นกว่า 1 วินาที) Game Loop แต่ละ Loop นั้น ทำงานที่ความเร็วไม่เท่ากันเลย ทางเดียวที่เราจะได้เห็นข้อมูลจากในโลกเกมได้เร็วที่สุด ก็จะต้องเป็นการจับภาพให้บ่อยที่สุด เท่านั้นครับ นั่นก็คือการที่เราใช้หน้าจอที่ Refresh ช้า จะเกิด Display Lag แทน คือ เราเห็นภาพในเกม ช้ากว่า และมีภาพจาก Frame เก่า ปนอยู่ในจอ มากกว่า
สำหรับ Worst Case Scenario ของ Delay กว่าที่ข้อมูลจากเกม จะแสดงออกมาบนหน้าจอ ก็จะใช้วิธีคำนวณคล้ายกับ Input Lag ของ VSync ก็คือ
- 16.67ms สำหรับหน้าจอ 60Hz ซึ่งช้ากว่า Ping ไป Data Center กรุงเทพฯ และเกือบเท่า Round Trip ข้อมูลไปสิงคโปร์!
- 6.97ms สำหรับหน้าจอ 144Hz
- 3.33ms สำหรับหน้าจอ 300Hz
นอกจากนี้ ความที่ภาพที่เห็น กับสิ่งที่จิตใต้สำนักเราคาดหวัง มันต่างกันมาก เช่น หันแล้ว กว่าภาพจะหัน มันช้ากว่า จะทำให้เกิด Motion Sickness หรือ อาการเมารถ ได้ด้วย ถ้าท่านไหนเคยเล่น VR โดยเฉพาะเกมขับรถน่าจะพอเก็ท (ถ้าไม่เคยลอง ลองขับรถถอยหลังใน VR ดู เมาแทบจะทันที) ผมคิดว่าที่หลายท่านไม่สามารถเล่นเกม First Person Shooter ได้ อาจจะมาจากสาเหตุของ Delay ตรงนี้ด้วยส่วนนึง (และก็มีสมาชิกเพจเรา มาคอมเมนต์ว่า เขาประสบปัญหานี้จริงๆ และพอเปลี่ยนมาใช้หน้าจอ 144Hz ก็หาย เล่นได้)
ถ้าย้อนกลับมาดูวีดีโอของ Nvidia ที่ทำไว้อีกรอบ เขาจะพยายามพูดถึง "Latency" ด้วย คือเรื่องนี้แหละ
สำหรับหน้าจอในตอนนี้ ถ้าเป็นของ LEVEL51 เรามีให้เลือกทั้ง 120, 144, 240 (ใน SPECTRA/ROSHARN) และ 300Hz ถ้าให้แนะนำ ก็บอกเลยว่าอยู่ที่ความพอใจเป็นหลัก คือจาก 60 มา 120 มันชัดเจนมาก แต่ 120 ไป 240 ไป 300 มันไม่ว๊าวเท่า แต่ถ้าจะเล่นเกมที่ต้องเอาแพ้ชนะกัน อย่าง CS:GO, PUBG, CoD แบบนี้ หน้าจอที่ Refresh Rate สูง เราจะสามารถเห็นข้อมูลจากเกมได้เร็วกว่า
ลองมาดู Linus เขาทดสอบกันดีกว่า ว่าจอ 240 300 360 นี่ ตกลงมันได้ผลอะไรจริงไหม~!
แต่ต้องอย่าลืมว่า มันมีเรื่องของ Response Time เข้ามาเกี่ยวด้วย สำหรับจอที่ Refresh Rate สูง แต่ Response Time สูงด้วย (โดยส่วนใหญ่ IPS Panel จะ Response สูงกว่า VA และต่ำสุดจะเป็น TN) เวลาที่เคลื่อนไหวทั้งจอเร็วๆ อย่างเช่นการหันหน้าซ้ายขวาในเกม ถ้า Response Time สูง ภาพจะเห็นเป็นเงา เหมือนเปิด Motion Blur เอาไว้ (เรียกว่า Ghosting) ลองดูวีดีโอนี้กัน
และอีกส่วนที่ใช้ในการประกอบการตัดสินใจ ก็คือ ตัว sRGB Volume ด้วย หน้าจอที่มี sRGB Volume สูงกว่า จะสีสดกว่า เวลาเล่นเกมบางเกมจะไม่ค่อยมีผลเท่าไหร่ เพราะว่าเกมเขาก็มักจะจูนสีมาให้มันอยู่ในช่วงที่ไม่กว้างมากนัก เพื่อให้ผู้เล่นทุกคน ได้ภาพที่สีใกล้เคียงกัน แต่เวลาดู Netflix ฟินกว่าเยอะ ขอบอก!
ดังนั้น หน้าจอ 300Hz คู่ควรกับคุณครับ~
ขอขอบคุณที่อ่านมาจนถึงตรงนี้ หวังว่าจะเป็นประโยชน์นะ ถ้าถูกใจ ก็อย่าลืมแชร์ให้เพื่อนอ่านกันบ้างละ ขอบคุณคร๊าบ