“ Scanline Racing” คืออะไร


13

ฉันได้ยินผู้คนจำนวนมากที่ทำงานเกี่ยวกับ VR พูดคุยเกี่ยวกับการแข่งรถสแกนไลน์และมันควรจะช่วยปรับปรุงเวลาแฝงสำหรับการเคลื่อนไหวในโฟตอน อย่างไรก็ตามมันยังไม่ชัดเจนสำหรับฉันว่าจะสามารถทำสิ่งนี้กับ OpenGL ได้อย่างไร มีคนอธิบายได้ไหมว่าการแข่งรถสแกนไลน์ทำงานอย่างไรและสามารถนำไปใช้กับ GPU สมัยใหม่ได้อย่างไร

คำตอบ:


14

เมื่อ GPU ของคุณแสดงเฟรมใหม่บนหน้าจอมันจะถ่ายโอนภาพผ่านสาย HDMI (หรืออะไรก็ตาม) ในกระบวนการที่เรียกว่า "scanout" พิกเซลจะถูกส่งออกไปตามลำดับเชิงเส้นโดยปกติจากซ้ายไปขวาและจากบนลงล่าง กระบวนการหมดเวลาเพื่อให้ใช้เวลาส่วนใหญ่ของช่วงเวลาการรีเฟรชเพื่อทำสิ่งนี้ ตัวอย่างเช่นที่ 60Hz หนึ่งเฟรมคือ ~ 17 ms การสแกนแต่ละครั้งอาจใช้เวลาประมาณ 15-16 มิลลิวินาทีโดยใช้ vblank 1-2 มิลลิวินาที (ค่าที่แน่นอนจะแตกต่างกันไปตามโหมดการแสดงผลและโหมดวิดีโอ)

โดยปกติแล้วการเรนเดอร์เป็นแบบ double-buffered ซึ่งหมายความว่ามีบัฟเฟอร์สองตัวที่เก็บอยู่ในหน่วยความจำ GPU: อันที่ถูกสแกนออกมาในขณะนี้ แต่ละเฟรมทั้งสองสลับกัน GPU ไม่เคยแสดงผลในบัฟเฟอร์เดียวกันที่ถูกสแกนออกมาซึ่งป้องกันสิ่งประดิษฐ์เนื่องจากอาจเห็นบางส่วนของเฟรมที่ไม่สมบูรณ์ อย่างไรก็ตามผลข้างเคียงของสิ่งนี้คือความล่าช้าที่เพิ่มขึ้นเนื่องจากแต่ละเฟรมอาจนั่งในบัฟเฟอร์เป็นเวลาหลายมิลลิวินาทีก่อนที่จะเริ่มการสแกน

VR มีความไวต่อความล่าช้ามากดังนั้นจึงไม่เป็นที่ต้องการ วิธีอื่นคือการแสดงผลโดยตรงไปที่บัฟเฟอร์ด้านหน้า แต่เวลาหมดลงอย่างระมัดระวังเพื่อให้คุณแสดงผลแต่ละบรรทัดของภาพไม่นานก่อนที่การสแกนจะไปถึงที่นั่น ที่เรียกว่า "scanline racing" หรือ "racing the beam" ("beam" ซึ่งมีการย้อนกลับไปยังยุค CRT สมัยก่อน) คุณต้องแสดงภาพในลำดับสแกนไลน์มากขึ้นหรือน้อยลงนั่นคือลำดับเดียวกันกับที่พิกเซลถูกสแกนออกมา ไม่จำเป็นต้องมีการแสดงผลทีละบรรทัด - มันสามารถแสดงผลในแถบบาง ๆ สูงพิกเซลไม่กี่ แต่มันจะต้องทำตามลำดับเนื่องจากคุณไม่สามารถย้อนกลับและแก้ไขพิกเซลที่มีอยู่แล้ว ถูกสแกนออกมา

มีข้อเสียมากมายกับวิธีนี้ มีข้อกำหนดด้านประสิทธิภาพที่เข้มงวดมากต้องกำหนดเวลาอย่างระมัดระวังเทียบกับ vsync และทำให้กระบวนการเรนเดอร์มีความซับซ้อนอย่างมาก แต่โดยหลักการแล้วมันสามารถลดระยะเวลาในการตอบสนองการมิลลิวินาทีซึ่งเป็นสาเหตุให้คน VR สนใจ


1
ดังนั้นคำถามของฉันคือเราจะทำสิ่งนี้กับ GPU ที่ทันสมัยได้อย่างไร ฉันไม่คิดว่าจะมีวิธีการใด ๆ ที่จะค้นหาการสแกนและดูเหมือนว่าคุณจะไม่สามารถส่งการเรียกแบบดึงต่อการสแกนได้ แม้ว่าคุณจะทำได้ - คุณมีหลักประกันอะไรบ้างที่คุณเสมอที่จะได้รับก่อนการสแกน?
Mokosha

1
@Mokosha ถูกต้องไม่มีวิธีสืบค้นการสแกนโดยตรง AFAIK ที่ดีที่สุดคุณสามารถคิดออกเมื่อ vsync เป็น (ผ่านสัญญาณบางระบบปฏิบัติการ) และประมาณการว่าการสแกนคือการกำหนดเวลาเทียบกับที่ (รู้รายละเอียดของโหมดวิดีโอ) สำหรับการเรนเดอร์คุณสามารถทดลองเพื่อดูว่ามันใช้เวลานานแค่ไหนระหว่าง glFlush กับการเรนเดอร์และทำการเดาตามนั้น ท้ายที่สุดคุณต้องสร้างความหย่อนในช่วงเวลาของคุณในกรณีที่เกิดข้อผิดพลาด (เช่นอยู่ที่ 2-3 วินาทีก่อนการสแกน) และยอมรับว่าอาจมีสิ่งประดิษฐ์เป็นครั้งคราว
นาธานรีด

ผลกระทบของเวลาแฝงที่เพิ่มขึ้นนั้นเกิดจาก vsync ซึ่งทำให้การสลับหน้าและแบ็คบุ๊กเพื่อซิงโครไนซ์กับ vblank ของจอภาพ การบัฟเฟอร์สองครั้งจะไม่ทำให้เกิดปัญหานี้ด้วยตัวเองและมีประโยชน์ในการลดการกะพริบเนื่องจากพิกเซลสามารถเปลี่ยนแปลงได้เพียงครั้งเดียวในบัฟเฟอร์ด้านหน้า
Maurice Laveaux

ฉันคิดวิธีที่ถูกต้องในการทำนายแรสเตอร์โดยไม่ต้องมีแบบสอบถามแบบสแกนบรรทัดดูคำตอบด้านล่าง
Mark Rejhon

0

สิ่งที่ยอดเยี่ยมคือในที่สุดเราสามารถทำนายความแม่นยำแรสเตอร์เส้นการสแกนได้โดยไม่ต้องเข้าถึงคิวรีแบบสแกนต่อบรรทัด:

https://www.youtube.com/watch?v=OZ7Loh830Ec

ฉันได้มาพร้อมกับสูตรที่แม่นยำระดับไมโครวินาทีในฐานะออฟเซ็ต VSYNC เพื่อทำนายตำแหน่งของรอยฉีกขาด Tearlines ในช่วง VSYNC OFF จะเป็นแบบ raster ที่แน่นอนดังนั้นคุณสามารถหลีกเลี่ยงการมองเห็นได้ในระหว่างแถบ "การจำลองการแสดงผลบัฟเฟอร์ด้านหน้า" ระดับแถบผ่านการสลับบัฟเฟอร์ VSYNC OFF ซ้ำ ๆ

ให้ความสนใจกับกระทู้ในฟอรัม - มีการเพิ่มโค้ดโอเพนซอร์สอย่างต่อเนื่อง - https://forums.blurbusters.com/viewtopic.php?f=10&p=32002


0

หากเป็นที่สนใจ Dreamcast มีโหมดการเรนเดอร์ "racing the beam" โดยที่มันสามารถอุทิศหน่วยความจำที่ค่อนข้างเล็กให้กับ framebuffer pixels (เช่น 64 scan lines) และมันจะแสดงแถวที่ 32 ด้วยกัน การอัพเดตจอแสดงผล อย่างไรก็ตามนี่ใช้เพื่อบันทึกหน่วยความจำเท่านั้น ฉันสงสัยว่าใครก็ตามกำลังสร้างรูปทรงเรขาคณิต "ดัดแปลง" สำหรับส่วนหลังของจอแสดงผล

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.