什么是“ Scanline Racing”


13

我听说许多从事VR的人都在谈论扫描线赛车,它应该有助于改善运动到光子的延迟。但是,我不清楚如何使用OpenGL完成此操作。有人可以解释一下scanline racing如何工作,以及如何在现代GPU上实现它。

Answers:


14

当您的GPU在屏幕上显示新帧时,它会通过称为“扫描”的过程通过HDMI电缆(或任何种类)传输图像。像素以线性顺序发送,通常是从左到右和从上到下。该过程是定时的,因此需要刷新间隔的大部分时间来执行此操作。例如,在60Hz时,一帧为〜17 ms。每次扫描大约需要15-16毫秒,中间间隔1-2毫秒的vblank(具体值根据显示和视频模式而有所不同)。

传统上,渲染是双缓冲的,这意味着GPU内存中存储着两个缓冲区:一个正在被扫描出(“前缓冲区”),另一个正在被渲染(“后缓冲区”)。每个帧都被交换。GPU永远不会渲染到被扫描出的同一缓冲区,以防止由于可能看到不完整帧的某些部分而造成伪影。但是,这样做的副作用是增加了等待时间,因为每个帧在开始被扫描之前可能会在缓冲区中停留数毫秒。

VR对延迟非常敏感,因此这是不希望的。另一种方法是直接渲染到前缓冲区,但是要非常小心地超时,以便在扫描输出到达之前不久就渲染图像的每一行。这就是所谓的“扫描线赛车”或“赛车横梁”(“光束”回溯到昔日的CRT时代)。这或多或少要求您按照扫描线顺序(即像素被扫描出的顺序)渲染图像。从字面上看,不必一次渲染一行,它可以以几像素高的细条形式渲染,但是必须按顺序完成,因为您无法返回并编辑已经存在的像素。被扫描了。

这种方法有很多缺点。它具有非常严格的性能要求,必须非常谨慎地对vsync进行计时,并且使渲染过程变得非常复杂。但是从原则上讲,它可以将延迟减少几毫秒,这就是VR人士对此感兴趣的原因。


1
所以我的问题是我们如何在现代GPU上做到这一点?我认为没有任何方法可以查询扫描结果,在我看来,您真的不能提交每条扫描线的绘制调用。即使您可以-您有什么保证可以保证抽奖会在扫描之前到达那里?
Mokosha 2015年

1
@Mokosha正确,无法直接通过AFAIK查询扫描结果。充其量,您可以找出vsync的时间(通过某些OS信号),并通过相对于它的定时来估计扫描的位置(了解视频模式的详细信息)。对于渲染,您可以尝试找出在glFlush和渲染完成之间通常需要多长时间,并据此做出一些猜测。最终,如果出现错误(例如,在扫描之前保持2-3毫秒),您必须在时间上留一些时间,并接受可能偶尔出现的假象。
内森·里德

延迟增加的影响归因于vsync,这会导致前缓冲区和后缓冲区交换与监视器的vblank同步。双缓冲本身并不会单独导致此问题,这对减少闪烁很有用,因为像素在前缓冲中只能改变一次。
莫里斯·拉沃

我提出了一种无需扫描线查询就能准确预测栅格的准确方法,请参见下面的答案。
Mark Rejhon

0

伟大的事情是,我们最终可以在不访问每条扫描线查询的情况下最终预测出扫描线的精确光栅精度:

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

我想出了精确的微秒精度公式作为VSYNC偏移量,以预测撕裂线的位置。VSYNC OFF期间的撕裂线始终是精确的栅格,因此您可以通过重复的VSYNC OFF缓冲区交换,在条带级“模拟的前缓冲区渲染”期间将其移出可见性。

注意论坛主题-不断添加一些开源代码-https: //forums.blurbusters.com/viewtopic.php?f=10&p=32002


0

如果感兴趣的话,Dreamcast可以使用“竞赛光束”渲染模式,从而可以将相对较小的内存专用于帧缓冲像素(例如64条扫描线),并且可以依次渲染32行,与显示更新。但是,这仅用于节省内存。我怀疑有人会为显示器的后半部分生成“修改的”几何图形。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.