Answers:
当您的GPU在屏幕上显示新帧时,它会通过称为“扫描”的过程通过HDMI电缆(或任何种类)传输图像。像素以线性顺序发送,通常是从左到右和从上到下。该过程是定时的,因此需要刷新间隔的大部分时间来执行此操作。例如,在60Hz时,一帧为〜17 ms。每次扫描大约需要15-16毫秒,中间间隔1-2毫秒的vblank(具体值根据显示和视频模式而有所不同)。
传统上,渲染是双缓冲的,这意味着GPU内存中存储着两个缓冲区:一个正在被扫描出(“前缓冲区”),另一个正在被渲染(“后缓冲区”)。每个帧都被交换。GPU永远不会渲染到被扫描出的同一缓冲区,以防止由于可能看到不完整帧的某些部分而造成伪影。但是,这样做的副作用是增加了等待时间,因为每个帧在开始被扫描之前可能会在缓冲区中停留数毫秒。
VR对延迟非常敏感,因此这是不希望的。另一种方法是直接渲染到前缓冲区,但是要非常小心地超时,以便在扫描输出到达之前不久就渲染图像的每一行。这就是所谓的“扫描线赛车”或“赛车横梁”(“光束”回溯到昔日的CRT时代)。这或多或少要求您按照扫描线顺序(即像素被扫描出的顺序)渲染图像。从字面上看,不必一次渲染一行,它可以以几像素高的细条形式渲染,但是必须按顺序完成,因为您无法返回并编辑已经存在的像素。被扫描了。
这种方法有很多缺点。它具有非常严格的性能要求,必须非常谨慎地对vsync进行计时,并且使渲染过程变得非常复杂。但是从原则上讲,它可以将延迟减少几毫秒,这就是VR人士对此感兴趣的原因。
伟大的事情是,我们最终可以在不访问每条扫描线查询的情况下最终预测出扫描线的精确光栅精度:
https://www.youtube.com/watch?v=OZ7Loh830Ec
我想出了精确的微秒精度公式作为VSYNC偏移量,以预测撕裂线的位置。VSYNC OFF期间的撕裂线始终是精确的栅格,因此您可以通过重复的VSYNC OFF缓冲区交换,在条带级“模拟的前缓冲区渲染”期间将其移出可见性。
注意论坛主题-不断添加一些开源代码-https: //forums.blurbusters.com/viewtopic.php?f=10&p=32002