BLOG

G-Sync vs V-Sync

โน๊ตบุ้ค LEVEL51 เรา มีจอ G-Sync ด้วย!? อะไรคือ G-Sync? ต่างกัน V-Sync ยังไง ผมขออนุญาตเล่าให้ฟังครับ

ก่อนที่เราจะทำความรู้จักกับ G-Sync และตอบคำถามว่า มันต่างจาก V-Sync ที่เห็นใน Option ของเกมทั่วๆ ไปอย่างไร ต้องรู้เรื่องเกี่ยวกับการทำงานของการ์ดจอ (GPU) พื้นฐานซักเล็กน้อย เพื่อให้เราเข้าใจว่า ปัญหามันเกิดจากอะไร จึงต้องมี G-Sync มาแก้ไขครับ

FRAME BUFFER, DOUBLE BUFFERING, TRIPPLE BUFFERING

เวลาที่ GPU นั้นทำการ Render ภาพ จากในเกม ซึ่งเป็นวัตถุ 3 มิติ ล่องลอยอยู่ในหน่วยความจำของมัน ซึ่งแน่นอนว่า เรามองไม่เห็นหรอกว่า มันหน้าตาเป็นอย่างไร มันจะต้องทำการ Project เอาวัตถุ 3 มิตินั้น ทาบลงไปบนแผ่นกระดานที่เป็นสองมิติ เพื่อคำนวณว่า ตกลงวัตถุนี้ จะอยู่ตำแหน่งไหนบนหน้าจอ และมันจะต้องแสดงออกมาเป็นสีอะไร มีขั้นตอนซับซ้อนมากมาย ที่ยังเก็บไว้เล่ากันได้อีกยาวๆ เลยละครับ

โดยแผ่นกระดานนี้ เราเรียกว่า "Frame Buffer" ซึ่งก็เป็น "Frame" เดียว กับคำว่า "Frames per Second" หรือ "Frame Rate" นั่นละครับ Frame Buffer นี้ จะอยู่บนหน่วยความจำหลักของ GPU อีกทีหนึ่ง กินพื้นที่บนหน่วยความจำเท่ากับจำนวน Pixel ที่ต้องแสดงผล คูณกับจำนวน Bit Per Pixel ของภาพที่ต้องการแสดงผลเลยทีเดียว อย่างหน้าจอ 1920x1080 ก็จะมีจำนวนพิกเซลอยู่ที่ 2,073,600 พิกเซล และถ้าเราแสดงผลด้วยสีแบบ 32-bit ก็จะใช้ที่บนหน่วยความจำ 2073600x32 = 66,355,200 bit หรือ 8,294,400 ไบต์ (8 MB โดยประมาณ)

แต่ละ "Frame" นี้เอง ก็คือภาพที่เรากำลังจะมองเห็นบนหน้าจอ ตัวคอนโทรลจอภาพจะนำเอาภาพที่อยู่ใน Frame Buffer นี้แหละ เอาไปแสดงผลอีกทีหนึ่ง

โดยปกติแล้ว เราจะไม่ให้ GPU กับจอภาพ ใช้ Frame Buffer ร่วมกัน เพราะว่า มันจะต้องแย่งกันใช้งาน คนนึงก็จะเขียนข้อมูลลงไป (Render) อีกคนนึงก็จะอ่านเอาไปแสดงผล ส่วนใหญ่แล้ว เรามักจะไม่ทำกัน เพราะว่า Bandwidth ของหน่วยความจำมีจำกัด จะต้องรอกันไปรอกันมา มันจะช้าเกินไป (แต่สมัยก่อน อาจจะทำแบบนี้ก็ได้นะ เพราะหน่วยความจำมีน้อย)

เพื่อแก้ปัญหานี้ จึงเกิดเทคนิค Double Buffering ขึ้นมา โดย GPU จะวาดลง "Back Buffer" หรือบางคนเรียก "Off-screen Buffer" คือ Frame Buffer ที่ไม่ได้ถูกเอาไปแสดงผล เพื่อให้ GPU วาด Frame ลงไปให้ครบ Frame ทีเดียว ซึ่งจะเร็วกว่าแย่งกันอ่านแย่งกันเขียน พอวาดครบ Frame แล้ว จึงค่อยสลับ (Buffer Swap) ให้ Back Buffer กลายเป็น Front Buffer เพื่อให้หน้าจอเอาไปแสดงผล และ Front Buffer กลายเป็น Back Buffer เพื่อเอา Frame ที่ถูกแสดงผลไปแล้ว กลับมารีไซเคิลใช้ใหม่ เอาให้ GPU มาวาดอีกที Tripple Buffering ก็ลักษณะคล้ายกัน แต่ว่าใช้ถึง 3 Buffer เลยทีเดียว

ทุกอย่างก็ดูดีไปหมด หน้าจอก็ได้ภาพเอาไปแสดงผลครบทั้งภาพอย่างรวดเร็ว ไม่ต้องแย่งกัน ไม่ต้องรอกัน จนกระทั่ง...

Tearing

เรื่องตลกก็คือ ความพยายามที่เราจะทำ Double, Tripple, Quadruple Buffering มันช่างสูญเปล่า เพราะว่าจริงๆ แล้ว ครั้งแรกสุดเลย คือเราต้องการจะลดอาการ Tearing เนี่ยแหละ

การที่มีแต่ Front Buffer อย่างเดียว จะทำให้คนที่นั่งมองภาพอยู่ เห็นเลยว่า ภาพมันค่อยๆ ถูกวาดขึ้นมาเป็นเส้นๆ จากบนลงล่าง ถ้าเกิดทันสมัยที่โปรแกรม Setup มีหน้าจอเป็นสีฟ้าไล่ไปหาสีดำ (Windows 95/98 นู่นแน่ะ) จะเห็นเลยว่า ตอนที่โปรแกรมมันเพิ่งเปิดขึ้นมา มันจะวาดสีฟ้าด้านบน วิ่งมาจนถึงด้านล่าง

แต่ทำไมทำ Double Buffer แล้ว ยังเกิดอาการ Tearing ละ!!!? ก็เพราะว่า สุดท้ายแล้ว ทุกอย่างมันก็ไปคอขวดที่ตัวจอภาพเองอยู่ที ลองนึกภาพว่า จอภาพก็คือ Frame Buffer ชนิดนึงที่ทำการ Project ข้อมูลสีในแต่ละ Pixel ออกมาเป็นแสงที่เรามองเห็นอีกที มันก็ไม่ต่างอะไรกับการที่เรามีแต่ Front Buffer นั่นแหละ

การที่จอภาพทำการแสดงสีออกมาให้เราเห็น มันจะทำการ Scan ภาพที่มันได้รับมาจากบนลงล่างทีละเส้น จากเส้นที่ 1 จนถึงเส้นที่ 1080 ซึ่งการ Scan ตั้งแต่เส้นที่ 1 จนถึงเส้นที่ 1080 บนจอภาพ 1920x1080 แบบ 60Hz ก็จะใช้เวลา 1 ใน 60 วินาทีพอดีเป๊ะ เท่ากันทุกครั้ง เรียกว่า "Refresh Rate"

แน่นอนว่า มันไม่เท่ากับอัตราที่ GPU ทำการ Render ชัวร์ เพราะ Frame Rate นั้น ยากที่จะคงที่ (ยกเว้นแต่เราจะเขียนโปรแกรมไว้ว่า ให้ทำงานที่ความเร็วคงที่นะ) บางทีมันอาจจะเร็วถึง 100fps (หรือ 100Hz) บางครั้ง มันก็อาจจะช้ากว่า เช่น 40fps (หรือ 40Hz) การที่ Frame Rate นั้นสูงกว่า Hz ของจอภาพ จะเป็นเหตุให้เกิด Tearing เพราะว่า หน้าจอมันยัง Scan ไม่ทันจบภาพแรกที่ GPU ส่งมา ปรากฏว่า GPU ส่งภาพที่สองมาอีกแล้ว และถ้าเกิด fps กับ Hz ต่างกันมาก เผลอๆ เราอาจจะเห็น 3 ภาพบนจอเดียวกัน อย่างภาพตัวอย่างด้านบนเลยทีเดียว

ถ้านึกไม่ออก ลองดูภาพประกอบจาก NVIDIA ได้ครับ

V-Sync

เลยมีการแก้ปัญหานี้ โดยให้ GPU กับหน้าจอ นัดกัน จริงๆ ก็ไม่เชิง เพราะว่า Display Controller มันอยู่บน GPU และ Frame Buffer ของหน้าจอ มันก็อยู่บน GPU เนี่ยแหละ ดังนั้นคนออกแบบการ์ดจอ ก็สามารถทำให้มันมีการ Sync กันได้ว่า ตกลงตอนนี้จอภาพ Scan จนถึงเส้นสุดท้ายหรือยัง ถ้ายัง ให้ GPU รอแป๊บ จะได้ไม่ส่งภาพไปซ้อนกัน จึงเป็นที่มาของคำว่า V-Sync ก็คือคำว่า "Vertical Synchronization" นั่นเอง

ทุกอย่างก็ดูลงตัวดีทีเดียว...ถ้าเกิดว่า GPU สามารถ Render ได้ที่ 60fps หรือมากกว่าตลอด...

แน่นอนว่า ไม่เสมอไป!!!

Stutter

V-Sync นั้น จะดีกับเรา ในกรณีที่ GPU นั้น ทำความเร็วได้สูงกว่าจอภาพ เช่น มันอาจจะใช้เวลาแค่ 12ms ในการวาดภาพ ในขณะที่หน้าจอใช้เวลา 16ms ต่อการ Scan 1 รอบ ตัว GPU ก็จะมีเวลา 4ms หยุดรอให้จอภาพ แสดงภาพก่อนหน้านี้ให้ครบก่อน (ซึ่งนับว่านานมากๆ สำหรับ GPU) จึงค่อย Swap Buffer ส่งไปแสดงผล (Scan 1) แต่มันเพิ่งรู้ตัวว่า มันควรจะเอาเวลา 4ms ตะกี้ มาวาดภาพที่สองซะยังจะดีกว่า เพราะภาพที่สอง มันใช้เวลานานกว่าภาพแรก แถมยังเกิน 16ms ด้วย ส่งไปหน้าจอไม่ทันรอบ V-Sync เพราะถ้าส่งไปเลย อาจจะเกิด Tearing มันก็เลยต้องหยุดรอให้ถึงรอบจังหวะ V-Sync อีกครั้ง จึงจะ Swap Buffer ได้

จังหวะที่ GPU ไม่ส่งภาพใหม่ไป หน้าจอ ก็ยังมี Frame Buffer ที่เป็นรูปเดิมอยู่ ตัว Controller ก็ไม่รู้หรอกว่า ภาพนี้มันคือภาพที่มันเคย Scan ไปรอบนึงแล้ว มันก็ยังคงต้องทำหน้าที่ของมัน คือ Scan Frame Buffer มาแสดงผล ผลก็คือ เราจะมองเห็นภาพเดิมซ้ำ 2 รอบ!

อาการภาพเดิมซ้ำสองรอบนี้ ฝรั่งเรียก Stuttering และเรื่องที่แย่ก็คือ อาการ Stutter นี้ ไม่แสดงออกใน fps ด้วย เพราะบางที fps นั้น ได้ 30-40fps ซึ่งถึงว่าโอเคแล้ว แล้ว แต่เรากลับรู้สึกว่า มันกระตุก หน่วงๆ โดยเฉพาะเวลาที่กล้องแพนไปแพนมาในเกม FPS (First Person Shooter) และเกมขับรถ ทีเราดูหนัง แค่ 24fps เรายังไม่รู้สึกว่ามันกระตุกเลย จริงมะ ความรู้สึกหน่วงๆ นี้แหละ คือ Stuttering

Adaptive V-Sync

เพื่อป้องกันปัญหานี้ ก่อนหน้านี้ NVidia จะมีตัวเลือกที่เรียกว่า Adaptive V-Sync คือ เอาข้อดีของการปิด V-Sync กับเปิด V-Sync มาอยู่ด้วยกัน โดย Driver จะปิด V-Sync ถ้าพบว่า fps ต่ำกว่า Hz ของหน้าจอ เพื่อลด Stuttering และ Input Lag และเปิด V-Sync ถ้าพบว่า fps สูงกว่า Hz ของหน้าจอ แต่มันก็ยังไม่ช่วยเท่าไหร่ มันแค่ลดลงเฉยๆ เพราะว่าไม่ได้แก้ไขที่ต้นเหตุคือ จอภาพควรจะแสดงภาพ หลังจากที่ GPU วาดเสร็จทันที จริงไหม!!!

G-Sync

เป็นเทคโนโลยีจากฝั่ง NVidia (ของ AMD เรียก Free Sync) ซึ่งแนวคิดก็คล้ายกัน คือ อาศัยการที่จอ LCD ไม่ต้องทำการ Refresh ภาพทุกครั้งก่อนแสดงผล ถ้าเราไม่ไปทำอะไรมัน มันก็จะเป็นภาพเดิมอยู่อย่างนั้นแหละ รู้อย่างนี้แล้วทำไมไม่เอาความสามารถนี้มาใช้ซะเลยล่ะ???

(จอแบบ CRT สมัยโบราณ มันจะต้อง Refresh ภาพตลอดเวลา เพราะถ้าไม่ Refresh ภาพจะหายไปจากจอ ซึ่งบางคนมองเห็นนะว่าจอมันกระพริบ และเป็นสาเหตุที่บางคนปวดตาเวลาเล่นคอม)

สรุปสั้นๆ ก็คือ ต่อไปนี้ หน้าจอไม่จำเป็นต้อง Refresh ด้วยอัตราคงที่อีกแล้ว ก็ถ้าเมื่อไหร่ GPU วาดภาพเสร็จ ก็แค่ส่งภาพไปที่หน้าจอ หน้าจอก็วาดจนจบ แล้วก็ค้างภาพรอไว้จนกว่าจะมีภาพใหม่ แค่นั้นแหละ!!!

แต่ในเบื้องลึก ก็ยังมีความซับซ้อนอีกเล็กน้อย เพราะว่าจอภาพแต่ละแบบ มีความสามารถต่างกัน จอภาพบางแบบ ถ้าไม่ Refresh มัน ภาพมันจะจางลง ดังนั้นมันก็ยังคงต้อง Refresh อยู่บ้างเพื่อกระตุ้นให้ภาพสว่างเท่าเดิม โดยเท่าที่เทียบกับหน้า WiKi ของ Free Sync จอภาพส่วนใหญ่ ก็ยังต้อง Refresh ที่ขั้นต่ำ 30 อยู่ ซึ่งถ้าเกิดว่าจังหวะที่ GPU ยังไม่ส่งภาพใหม่มา ระบบ G-Sync ก็จำเป็นจะต้องเอาภาพเก่าวาดลงไปก่อนเพื่อกระตุ้นจอภาพ แล้วถ้าเกิดว่าโชคไม่ดี วาดไปครึ่งทางแล้ว เกิดได้ภาพจาก GPU มาพอดี ภาพจาก GPU ก็อาจจะต้องรอเล็กน้อย เพื่อให้ภาพเก่าที่ส่งไปกระตุ้นจอภาพวาดครบก่อน จึงเอาภาพใหม่ส่งไปต่อ เชื่อว่า วิศวกรของ Nvidia คงมีเวทย์พอสมควร ที่จะคำนวณให้มันลงจังหวะกันพอดีได้ เพราะว่า หน้าจอ G-Sync ต้องผ่านการ Certify จาก Nvidia ด้วยนะ!!!

สรุปง่ายๆ ก็ตามใน Slide

  • No-Tearing ไม่มีอาการ Tearing อีกต่อไป เพราะว่า G-Sync ยังต้องรอให้ Scan จบก่อนจึงวาดได้ เหมือน V-Sync
  • No-Stutter อาการภาพเบิ้ลมีโอกาสเกิดน้อยลงมาก เพราะว่า G-Sync สามารถ Refresh หน้าจอเมื่อไหร่ก็ได้ หรืออาจจะสามารถควบคุม fps ของ GPU ได้ด้วย เพื่อเกลี่ยให้จังหวะการวาดภาพของ GPU กับหน้าจอสัมพันธ์กัน
  • Less Lag สังเกตว่า ไม่ใช่ "No Lag" เพราะว่ายังติดที่หน้าจอต้องการกระตุ้นอยู่บ้าง และยังต้องรอ Scan จบ ถ้าจังหวะมันไม่ตรงกันจริงๆ

In Real Life?

ในชีวิตจริงละ เป็นอย่างไร? ผมเองก็ลองใช้งานอยู่ พบว่า มันได้บางเกมครับ! อ้าว ทำไมไม่เชียร์ของตัวเองละ? เพราะว่าเราจริงใจ และ G-Sync มันปิดได้รายเกมเลยครับ

ที่พบก็คือ เกมประเภทที่ใช้งาน G-Sync ไม่ได้เลย คือ เปิดแล้วไม่ช่วยอะไร บางทีกลับแย่ลง คือเกมที่ Lock หรือ Cap fps เอาไว้ครับ เป็นการกระทำที่น่ารังเกียจมากๆเพราะการ Lock หรือ Cap fps ไว้ ไม่ว่าจะ 30 หรือ 60 มันทำให้เสียอารมณ์มากครับ คนที่มีจอ 144Hz ก็อยากเล่นที่ > 100fps จริงมะ แล้วคุณพระ เกมที่ Cap 30fps เนี่ยนะ!!!

สำหรับเกมที่ทำผมหัวเสียที่สุด เพราะนอกจากจะต่อเข้าไปเล่นยากแล้ว ยัง Cap Fps ไว้ที่ 30/60 อีก คือ The Crew ครับ ผมสังเกตว่า G-Sync จะทำงานได้ดีมาก ถ้าเกิดว่า fps มันขึ้นๆ ลงๆ ยิ่งช่วงกว้าง ยิ่งลื่น เพราะว่าอาการ Stutter แทบจะหายเป็นปลิดทิ้ง เข้าใจว่า Nvidia ตั้งใจออกแบบ G-Sync มา โดยมีสมมุติฐานว่า fps มันจะต้องขึ้นๆ ลงๆ แต่ว่า พอ fps สูงสุดมันคงที่จากการถูก Cap เหมือนว่าอัลกอริธีมมันจะงง กลายเป็นภาพดูหน่วงๆ กระตุกๆ ไป เพราะเท่าที่สังเกตดู G-Sync มันจะพยายามเกลี่ยให้ fps ไม่โดดมากเกินไป เพื่อให้ภาพดูลื่นด้วยครับ แน่นอนว่า ความลื่นไม่ลื่นนี่ มันเป็นความรู้สึกล้วนๆ คิดว่าต้องลองเล่นดูเองครับ

ขอฝากวีดีโอทดสอบจาก เว็บ Anandtech ครับ โดยภาพถูกทำให้ช้าลงครึ่งนึง เพื่อให้เห็นอาการ Stuttering กันชัดๆ และ G-Sync มันช่วยได้อย่างไร

และแน่นอน ถ้าเกิดเล่นแล้ว บางเกมมันแย่ลง คือมันหน่วงๆ อย่างที่บอก สามารถปิดได้รายเกม ใน Nvidia Control Panel ครับผม

ขอขอบคุณที่ติดตามอ่านมาถึงตรงนี้ครับ มีตรงไหนไม่เห็นด้วย มาคอมเม้นกันได้นะ

BLOG