Un framebuffer ( frame buffer , o a veces framestore ) es una parte de la memoria de acceso aleatorio (RAM) [1] que contiene un mapa de bits que controla una pantalla de video. Es un búfer de memoria que contiene datos que representan todos los píxeles en un cuadro de video completo . [2] Las tarjetas de video modernas contienen circuitos de framebuffer en sus núcleos. Este circuito convierte un mapa de bits en memoria en una señal de video que se puede mostrar en un monitor de computadora.
En informática , un búfer de pantalla es una parte de la memoria de la computadora que utiliza una aplicación informática para la representación del contenido que se mostrará en la pantalla de la computadora . [3] El búfer de pantalla también puede denominarse búfer de vídeo , búfer de regeneración o búfer regen para abreviar. [4] Los búferes de pantalla deben distinguirse de la memoria de vídeo . Para este fin, también se utiliza el término búfer fuera de pantalla .
La información del búfer normalmente consta de valores de color para cada píxel que se mostrará en la pantalla. Los valores de color se almacenan habitualmente en formatos binarios de 1 bit (monocromo), de 4 bits con paleta , de 8 bits con paleta, de color de alta definición de 16 bits y de color verdadero de 24 bits . A veces se utiliza un canal alfa adicional para retener información sobre la transparencia de los píxeles. La cantidad total de memoria necesaria para el búfer de cuadros depende de la resolución de la señal de salida y de la profundidad de color o el tamaño de la paleta.
Los investigadores informáticos [¿ quiénes? ] habían discutido durante mucho tiempo las ventajas teóricas de un framebuffer, pero no pudieron producir una máquina con suficiente memoria a un costo económicamente viable. [ cita requerida ] [5] En 1947, la computadora Manchester Baby utilizó un tubo Williams , más tarde el tubo Williams-Kilburn, para almacenar 1024 bits en una memoria de tubo de rayos catódicos (CRT) y mostrarlos en un segundo CRT. [6] [7] Otros laboratorios de investigación estaban explorando estas técnicas y el Laboratorio Lincoln del MIT logró una pantalla de 4096 en 1950. [5]
A finales de los años 1960 se implementó una pantalla escaneada en color, llamada Brookhaven RAster Display (BRAD), que utilizaba una memoria de tambor y un monitor de televisión. [8] En 1969, A. Michael Noll de Bell Labs implementó una pantalla escaneada con un búfer de cuadros, utilizando una memoria de núcleo magnético . [9] Más tarde, el sistema de Bell Labs se amplió para mostrar una imagen con una profundidad de color de tres bits en un monitor de televisión en color estándar.
A principios de la década de 1970, el desarrollo de chips de circuitos integrados de memoria MOS ( memoria de semiconductor de óxido metálico ), en particular chips DRAM ( memoria dinámica de acceso aleatorio ) de alta densidad con al menos 1 kb de memoria, hizo posible la creación, por primera vez, de un sistema de memoria digital con framebuffers capaces de almacenar una imagen de vídeo estándar. [10] [11] Esto llevó al desarrollo del sistema SuperPaint por Richard Shoup en Xerox PARC en 1972. [10] Shoup pudo utilizar el framebuffer SuperPaint para crear un sistema de captura de vídeo digital temprano. Al sincronizar la señal de salida con la señal de entrada, Shoup pudo sobrescribir cada píxel de datos a medida que se desplazaba. Shoup también experimentó con la modificación de la señal de salida utilizando tablas de colores. Estas tablas de colores permitieron al sistema SuperPaint producir una amplia variedad de colores fuera del rango de los datos limitados de 8 bits que contenía. Este esquema se convertiría más tarde en algo común en los framebuffers de ordenador.
En 1974, Evans & Sutherland lanzó el primer framebuffer comercial, el Picture System, [12] con un coste de unos 15.000 dólares. Era capaz de producir resoluciones de hasta 512 por 512 píxeles en escala de grises de 8 bits , y se convirtió en una bendición para los investigadores gráficos que no tenían los recursos para construir su propio framebuffer. El Instituto de Tecnología de Nueva York crearía más tarde el primer sistema de color de 24 bits utilizando tres de los framebuffers de Evans & Sutherland. [13] Cada framebuffer estaba conectado a una salida de color RGB (una para rojo, una para verde y una para azul), con una minicomputadora PDP 11/04 de Digital Equipment Corporation que controlaba los tres dispositivos como uno solo.
En 1975, la empresa británica Quantel produjo el primer framebuffer de transmisión comercial a todo color, el Quantel DFS 3000. Se utilizó por primera vez en la cobertura televisiva de los Juegos Olímpicos de Montreal de 1976 para generar una inserción de imagen en imagen de la antorcha olímpica encendida mientras el resto de la imagen mostraba al corredor entrando al estadio.
La rápida mejora de la tecnología de circuitos integrados hizo posible que muchos de los ordenadores domésticos de finales de los años 70 tuvieran un framebuffer de baja profundidad de color. Hoy en día, casi todos los ordenadores con capacidades gráficas utilizan un framebuffer para generar la señal de vídeo. Los ordenadores Amiga , creados en los años 80, se caracterizaban por una atención especial en el diseño al rendimiento gráfico e incluían un framebuffer Hold-And-Modify único capaz de mostrar 4096 colores.
Los framebuffers también se hicieron populares en las estaciones de trabajo de alta gama y en las placas de sistema arcade a lo largo de la década de 1980. SGI , Sun Microsystems , HP , DEC e IBM lanzaron framebuffers para sus estaciones de trabajo en este período. Estos framebuffers eran generalmente de una calidad mucho mayor que la que se podía encontrar en la mayoría de las computadoras domésticas, y se usaban regularmente en televisión, impresión, modelado por computadora y gráficos 3D. Sega también usó framebuffers para sus placas arcade de alta gama , que también eran de una calidad superior a la de las computadoras domésticas.
Los framebuffers utilizados en la informática personal y doméstica suelen tener conjuntos de modos definidos en los que pueden funcionar. Estos modos reconfiguran el hardware para generar distintas resoluciones, profundidades de color, diseños de memoria y tiempos de frecuencia de actualización .
En el mundo de las máquinas y los sistemas operativos Unix , estas comodidades solían evitarse en favor de la manipulación directa de la configuración del hardware. Esta manipulación era mucho más flexible, ya que se podía alcanzar cualquier resolución, profundidad de color y frecuencia de actualización, limitada únicamente por la memoria disponible en el búfer de cuadros.
Un efecto secundario desafortunado de este método era que el dispositivo de visualización podía ser llevado más allá de sus capacidades. En algunos casos, esto resultó en daño de hardware a la pantalla. [14] Más comúnmente, simplemente produjo una salida confusa e inutilizable. Los monitores CRT modernos solucionan este problema mediante la introducción de circuitos de protección. Cuando se cambia el modo de visualización, el monitor intenta obtener un bloqueo de señal en la nueva frecuencia de actualización. Si el monitor no puede obtener un bloqueo de señal, o si la señal está fuera del rango de sus limitaciones de diseño, el monitor ignorará la señal del búfer de cuadros y posiblemente le presentará al usuario un mensaje de error.
Los monitores LCD suelen contener circuitos de protección similares, pero por diferentes motivos. Dado que la pantalla LCD debe muestrear digitalmente la señal de visualización (emulando así un haz de electrones), cualquier señal que esté fuera de rango no se puede mostrar físicamente en el monitor.
Los framebuffers tradicionalmente han admitido una amplia variedad de modos de color. Debido al gasto de memoria, la mayoría de los primeros framebuffers usaban profundidades de color de 1 bit (2 colores por píxel), 2 bits (4 colores), 4 bits (16 colores) u 8 bits (256 colores). El problema con profundidades de color tan pequeñas es que no se puede producir una gama completa de colores. La solución a este problema fue el color indexado , que agrega una tabla de búsqueda al framebuffer. Cada color almacenado en la memoria del framebuffer actúa como un índice de color. La tabla de búsqueda sirve como una paleta con un número limitado de colores diferentes, mientras que el resto se usa como una tabla de índice.
A continuación se muestra una imagen típica indexada de 256 colores y su propia paleta (mostrada como un rectángulo de muestras):
En algunos diseños también era posible escribir datos en la tabla de búsqueda (o cambiar entre paletas existentes) sobre la marcha, lo que permitía dividir la imagen en barras horizontales con su propia paleta y, de este modo, generar una imagen con una paleta mucho más amplia. Por ejemplo, al ver una fotografía tomada al aire libre, la imagen se podía dividir en cuatro barras: la superior con énfasis en los tonos del cielo, la siguiente con tonos de follaje, la siguiente con tonos de piel y ropa, y la inferior con colores de fondo. Esto requería que cada paleta tuviera colores superpuestos, pero, si se hacía con cuidado, permitía una gran flexibilidad.
Si bien se accede a los framebuffers comúnmente a través de una asignación de memoria directa al espacio de memoria de la CPU, este no es el único método por el cual se puede acceder a ellos. Los framebuffers han variado ampliamente en los métodos utilizados para acceder a la memoria. Algunos de los más comunes son:
La organización del framebuffer puede ser de píxeles compactos o plana . El framebuffer puede tener todos los puntos direccionables o tener restricciones sobre cómo se puede actualizar.
Las tarjetas de video siempre tienen una cierta cantidad de RAM. Una pequeña porción de esta RAM es donde se almacenan en búfer los datos de imagen en mapa de bits para su visualización. Por lo tanto, el término búfer de cuadros se usa a menudo indistintamente cuando se hace referencia a esta RAM.
La CPU envía actualizaciones de imagen a la tarjeta de video. El procesador de video de la tarjeta forma una imagen de la pantalla y la almacena en el búfer de cuadros como un mapa de bits grande en la RAM. La tarjeta utiliza el mapa de bits en la RAM para actualizar continuamente la imagen de la pantalla. [15]
Muchos sistemas intentan emular la función de un dispositivo framebuffer, a menudo por razones de compatibilidad. Los dos framebuffers virtuales más comunes son el dispositivo framebuffer de Linux (fbdev) y el framebuffer virtual de X ( Xvfb ). Xvfb se agregó a la distribución X Window System para proporcionar un método para ejecutar X sin un framebuffer gráfico. El dispositivo framebuffer de Linux se desarrolló para abstraer el método físico para acceder al framebuffer subyacente en un mapa de memoria garantizado al que los programas puedan acceder fácilmente. Esto aumenta la portabilidad, ya que no se requiere que los programas se ocupen de sistemas que tienen mapas de memoria desarticulados o requieren conmutación de bancos .
Un buffer de cuadros puede estar diseñado con suficiente memoria para almacenar dos cuadros de datos de video. En una técnica conocida generalmente como doble buffer o más específicamente como cambio de página , el buffer de cuadros usa la mitad de su memoria para mostrar el cuadro actual. Mientras se muestra esa memoria, la otra mitad de la memoria se llena con datos para el siguiente cuadro. Una vez que el buffer secundario está lleno, el buffer de cuadros recibe instrucciones de mostrar el buffer secundario en su lugar. El buffer primario se convierte en el buffer secundario y el buffer secundario en el primario. Este cambio se realiza a menudo después del intervalo de borrado vertical para evitar el desgarro de la pantalla donde la mitad del cuadro anterior y la mitad del nuevo se muestran juntas.
El cambio de página se ha convertido en una técnica estándar utilizada por los programadores de juegos de PC .
A medida que aumentó la demanda de mejores gráficos, los fabricantes de hardware crearon una forma de disminuir la cantidad de tiempo de CPU necesario para llenar el búfer de cuadros. Esto se denomina comúnmente aceleración de gráficos . Los comandos de dibujo de gráficos comunes (muchos de ellos geométricos) se envían al acelerador de gráficos en su forma original. Luego, el acelerador rasteriza los resultados del comando en el búfer de cuadros. Este método libera la CPU para realizar otro trabajo.
Los primeros aceleradores se centraron en mejorar el rendimiento de los sistemas GUI 2D . Si bien conservan estas capacidades 2D, la mayoría de los aceleradores modernos se centran en producir imágenes 3D en tiempo real. Un diseño común utiliza una biblioteca de gráficos como OpenGL o Direct3D que interactúa con el controlador de gráficos para traducir los comandos recibidos a instrucciones para la unidad de procesamiento gráfico (GPU) del acelerador . La GPU utiliza esas instrucciones para calcular los resultados rasterizados y los resultados se transfieren al búfer de fotogramas. La señal del búfer de fotogramas se produce luego en combinación con dispositivos de superposición de video integrados (generalmente utilizados para producir el cursor del mouse sin modificar los datos del búfer de fotogramas) y cualquier efecto especial final que se produzca modificando la señal de salida. Un ejemplo de dichos efectos especiales finales fue la técnica de anti-aliasing espacial utilizada por las tarjetas 3dfx Voodoo . Estas tarjetas agregan un ligero desenfoque a la señal de salida que hace que el aliasing de los gráficos rasterizados sea mucho menos obvio.
En un momento dado, hubo muchos fabricantes de aceleradores gráficos, entre ellos: 3dfx Interactive ; ATI ; Hercules ; Trident ; Nvidia ; Radius ; S3 Graphics ; SiS y Silicon Graphics . A partir de 2015, [actualizar]el mercado de aceleradores gráficos para sistemas basados en x86 está dominado por Nvidia (que adquirió 3dfx en 2002), AMD (que adquirió ATI en 2006) e Intel .
Con un framebuffer, se ordena al haz de electrones (si la tecnología de visualización utiliza uno) que realice un escaneo de trama , de la misma manera que un televisor reproduce una señal de transmisión. La información de color para cada punto que se muestra en la pantalla se extrae directamente del framebuffer durante el escaneo, creando un conjunto de elementos de imagen discretos, es decir, píxeles.
Los framebuffers difieren significativamente de las pantallas vectoriales que eran comunes antes de la llegada de los gráficos rasterizados (y, en consecuencia, del concepto de framebuffer). Con una pantalla vectorial, solo se almacenan los vértices de las primitivas gráficas. Luego, se ordena al haz de electrones de la pantalla de salida que se mueva de vértice a vértice, trazando una línea a través del área entre estos puntos.
De la misma manera, los buffers de cuadros difieren de la tecnología utilizada en las primeras pantallas de modo texto , donde un buffer contiene códigos para caracteres, no píxeles individuales. El dispositivo de visualización de video realiza el mismo escaneo de trama que con un buffer de cuadros, pero genera los píxeles de cada carácter en el buffer a medida que dirige el haz.