¿Cuál es la forma correcta de almacenar datos en un búfer de cuadros?

Estoy tratando de planificar un proyecto de procesador de gráficos que solo representará líneas. Utilizará el algoritmo de línea de Bresenhmam. Después de leer sobre el algoritmo, tiene sentido cómo funciona para calcular las ubicaciones de los píxeles que forman una línea. Lo que no está claro es cómo se mostrará esto en una pantalla. Tal vez, es probable que los datos se almacenen en una memoria externa, pero la forma obvia de hacerlo parece muy ineficiente.

Supongamos que tengo 10 líneas. Calculo los valores de píxel que forman cada una de estas líneas, ¿almaceno estos píxeles en algún FIFO interno para "despachar"? Luego, otra parte del diseño lee los valores de píxeles que se "enviarán", calcula en qué ubicación almacenarlos en la memoria y los escribe en la memoria. Esto debe hacerse para cada línea, lo que significa que una ubicación de memoria puede leerse y escribirse varias veces para un solo cuadro si varias líneas pasan una cerca de la otra. ¿Es esto correcto? Si es así, a medida que aumenta el número de líneas para dibujar, será más difícil escribir fotogramas completos en la memoria procesando todas las líneas antes de que se tenga que leer el siguiente fotograma, ya que la velocidad de fotogramas para la visualización de vídeo es fija.

Esto significa que no hay forma de pasar del píxel superior izquierdo de la pantalla al inferior derecho y averiguar si un píxel determinado es parte de una línea. No puedo encontrar una explicación simple sobre cómo implementar el búfer de cuadros para este tipo de sistema.

A menos que haya un número muy limitado de líneas, no estoy seguro de que este enfoque sea el más fácil. Tradicionalmente, un controlador de pantalla tiene un búfer de cuadros que representa todos los colores de los píxeles de forma independiente, y luego dibuja líneas dentro de este búfer. Pero hacer que el controlador se ocupe de la representación de líneas mientras se realiza la actualización es complicado, creo.
@ quantum231: necesitará doble búfer. Es decir, se procesa un búfer de pantalla mientras se lee el otro. Tan pronto como termine el renderizado, cambie los dos en el siguiente vsync. Es posible renderizar de acuerdo con la línea de trama actual (consulte las computadoras domésticas antiguas), pero impone muchas limitaciones.
usted no 'va desde la parte superior izquierda ... y descubre si un píxel es parte de una línea', para cada línea, empuja los píxeles que forman esa línea, mientras itera a lo largo de la línea, está generando automáticamente el direcciones de píxeles, no tiene que calcular nada, no si ha ordenado correctamente las direcciones de fila y columna. El trabajo se escala linealmente con la longitud total de la línea que debe renderizar.
¿Alguna vez te has preguntado por qué los juegos con gráficos complicados se ejecutan con velocidades de cuadro más bajas en computadoras peores? Ahora sabes exactamente por qué.

Respuestas (1)

A medida que calcula los píxeles en cada línea, calculará los bits en el búfer de cuadro para establecer para ese píxel. Esto dependería de la organización del búfer de cuadros y del número de bits por píxel. Como sugiere dibujar 10 líneas superpuestas, significa que se accede a la misma dirección varias veces y, nuevamente, a medida que aumenta la cantidad de líneas, es posible que no pueda dibujar todas las líneas antes del escaneo del cuadro.

Sin embargo, esto no afecta el proceso de dibujo y no necesita completar el proceso de renderizado antes de que el marco se envíe a la pantalla, pero dará como resultado un parpadeo. De hecho, comenzará a parpadear y aquí es donde se usaría un segundo búfer.

Imagen que ha dibujado una forma complicada en la pantalla que debe girarse 5 grados. A la pantalla se le envía la información del búfer 1. Usted calcula las nuevas líneas y las escribe en el búfer 2 mientras continúa mostrando el búfer 1. Una vez completa, espere a que se muestre la última línea del búfer 1 actual y cambie la lógica de visualización y así sucesivamente. el siguiente escaneo muestra buffer2. Todas las escrituras posteriores se realizan en el búfer 1 hasta que esté listo para volver.

Esta es la razón por la que en los puntos de referencia típicos de los juegos, puede ver que las velocidades de fotogramas caen a 12 fps en escenas complicadas. No porque la pantalla caiga de 60 fps, sino porque el mismo cuadro se muestra 5 veces antes de que el nuevo cuadro esté listo para dibujarse.