¿Qué es "Scanline Racing"?

13

He escuchado a muchas personas que trabajan en VR hablar sobre las carreras de scanline y que se supone que ayuda a mejorar la latencia del movimiento de fotones. Sin embargo, no está claro para mí cómo se puede hacer esto con OpenGL. ¿Podría alguien explicar cómo funciona el scanline racing y cómo se puede implementar en las GPU modernas?

Mokosha
fuente

Respuestas:

14

Cuando su GPU muestra un nuevo marco en la pantalla, transfiere la imagen a través del cable HDMI (o de cualquier tipo) en un proceso llamado "escaneo". Los píxeles se envían en orden lineal, generalmente de izquierda a derecha y de arriba a abajo. El proceso está cronometrado para que tome la mayor parte de la duración de un intervalo de actualización para hacer esto. Por ejemplo, a 60Hz, un cuadro es ~ 17 ms. Cada escaneo tomará probablemente alrededor de 15-16 ms, con 1-2 ms de vblank en el medio (los valores exactos varían según la pantalla y el modo de video).

Tradicionalmente, la representación tiene doble memoria intermedia, lo que significa que hay dos memorias intermedias almacenadas en la memoria de la GPU: una que se está escaneando actualmente ("memoria intermedia frontal") y otra que se está procesando en ("memoria intermedia posterior"). Cada cuadro, los dos se intercambian. La GPU nunca se procesa en el mismo búfer que se está escaneando, lo que evita los artefactos debido a la posibilidad de ver partes de un marco incompleto. Sin embargo, un efecto secundario de esto es el aumento de la latencia, ya que cada cuadro puede permanecer en el búfer durante varios ms antes de comenzar a escanearse.

La realidad virtual es muy sensible a la latencia, por lo que esto no es deseable. Un enfoque alternativo es renderizar directamente en el búfer frontal, pero agotar el tiempo con mucho cuidado para que haya renderizado cada línea de la imagen poco antes de que llegue el escaneo. Eso se llama "scanline racing" o "racing the beam" (el "haz" que se remonta a los días de CRT de antaño). Esto requiere más o menos que renderice la imagen en el orden de la línea de exploración, es decir, el mismo orden en que se escanean los píxeles. Literalmente, no tiene que procesarse una línea a la vez; podría representarse en tiras delgadas de unos pocos píxeles de altura, pero tiene que hacerse en orden, ya que no puede volver atrás y editar píxeles que ya sido escaneado

Hay muchas desventajas en este enfoque; tiene requisitos de rendimiento muy estrictos, debe sincronizarse con mucho cuidado contra vsync, y complica enormemente el proceso de renderizado. Pero, en principio, puede reducir milisegundos su latencia, razón por la cual la gente de VR está interesada en ella.

Nathan Reed
fuente
1
Entonces, mi pregunta es ¿cómo hacemos esto en las GPU modernas? No creo que haya ninguna forma de consultar el escaneo, y me parece que realmente no puede enviar llamadas de sorteo por línea de escaneo. Incluso si pudieras, ¿qué garantías tienes de que tus sorteos llegarán antes del escaneo?
Mokosha
1
@Mokosha Correcto, no hay forma de consultar el escaneo directamente AFAIK. En el mejor de los casos, puede averiguar cuándo vsync es (a través de alguna señal del sistema operativo) y estimar dónde está el escaneo cronometrando en relación con eso (conociendo los detalles del modo de video). Para el renderizado, puede experimentar para averiguar cuánto tiempo tarda generalmente entre glFlush y cuándo se realiza el renderizado, y hacer algunas suposiciones basadas en eso. En última instancia, debe tener cierta holgura en su tiempo en caso de error (por ejemplo, mantenerse 2-3 ms antes del escaneo) y aceptar que probablemente habrá artefactos ocasionales.
Nathan Reed
El efecto del aumento de la latencia se debe a vsync, que hace que los intercambios de búfer frontal y posterior se sincronicen con el vblank del monitor. El doble almacenamiento en búfer en sí mismo no causa este problema por sí mismo y es útil para minimizar el parpadeo porque un píxel solo puede cambiar una vez en el búfer frontal.
Maurice Laveaux
Se me ocurrió una forma precisa de predecir rásteres sin una consulta de línea de exploración, consulte la respuesta a continuación.
Mark Rejhon
0

Lo bueno es que finalmente podemos predecir la precisión exacta de la línea de exploración sin acceso a una consulta por línea de exploración:

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

He ideado las fórmulas exactas con precisión de microsegundos como un desplazamiento VSYNC, para predecir la posición de una línea de corte. Las líneas de corte durante VSYNC OFF siempre son exactas por trama, por lo que puede desviarlas de la visibilidad durante el "renderizado simulado del búfer frontal" a nivel de banda mediante el intercambio repetido del búfer VSYNC OFF.

Preste atención al hilo del foro: se agrega continuamente código fuente abierto: https://forums.blurbusters.com/viewtopic.php?f=10&p=32002

Mark Rejhon
fuente
0

Si es de interés, el Dreamcast tenía un modo de renderizado "racing the beam", en el que podía dedicar una fracción relativamente pequeña de memoria a los píxeles de framebuffer (por ejemplo, 64 líneas de exploración) y renderizaba filas de 32 a su vez, sincronizadas con La actualización de la pantalla. Sin embargo, esto solo se usó para ahorrar memoria. Dudo que alguien estuviera generando geometría "modificada" para las últimas partes de la pantalla.

Simon F
fuente