Supongamos que tenemos una computadora direccionable por palabra de 64 bits y queremos programarla para que muestre un carácter de 5x7 almacenado como un mapa de bits de imagen binaria (como el siguiente) en una pantalla mapeada en memoria.
Como tenemos 5 x 7 = 35 píxeles por carácter, podríamos almacenar un carácter utilizando 35 bits en una sola palabra. Con el bit menos significativo de partida en el lado izquierdo de la palabra y con cada píxel de la imagen que está siendo representado por el n ésimo bit como se muestra arriba, el número "3" supra se almacena en la memoria como: 01110100010000100110000011000101110, seguido por 29 sin usar bits establecidos en 0.
¿Es así como los personajes fueron / son almacenados en las computadoras antiguas / modernas? ¿O utilizan un solo byte / palabra por píxel en su lugar?
Si se almacenan de esta manera, ¿qué utilizaría la rutina en el ensamblaje / código de máquina (usando nada más que instrucciones elementales tales como operaciones de transporte de datos, aritmética y bit a bit de la Arquitectura del conjunto de instrucciones de la computadora) para convertir estos datos en una imagen en se ve la pantalla? ¿Sería algo así como:
- Almacene las coordenadas de visualización x e y para el píxel actual que se actualizará en un determinado registro.
- Almacene los dos valores RGB elegidos (en este caso 0,255,0 para verde y 0,0,0 para negro) en otros dos registros separados.
- Haga que otros dos registros actúen como contadores inicializados en 5 y 7 para realizar un seguimiento de la fila y columna actuales de la imagen que se está representando.
- Pruebe si el registro de la columna no es 0. Si no lo es, pruebe si el LSB del mapa de bits está establecido en 1, luego AND el respectivo valor RGB se registra con el registro de coordenadas xey dependiendo del resultado, luego MOV ese resultado al registro de salida de pantalla.
- Disminuya el registro del contador de filas en 1, pruebe para ver si es 0. Si es así, vuelva a configurarlo en 5 e incremente la coordenada y en 1 y disminuya el contador de columna en 1.
- Desplace el registro sosteniendo el bitmap 1 bit hacia la izquierda.
- JMP a la instrucción 4.
¿Hay una manera más simple o más eficiente de hacer esto? Parece que incluso algo tan simple como representar un solo carácter de texto pequeño requiere una gran cantidad de operaciones y tomaría alrededor de 200 ciclos de CPU.
Finalmente, ¿hay algún buen libro o recurso sobre código de nivel de máquina para mostrar imágenes desde cero? ensamblador que usa macros, todos los cuales son "trampas" y no explican qué sucede fundamentalmente en el nivel más bajo.
fuente
Respuestas:
Debe distinguir el texto y los modos gráficos de la placa gráfica de su máquina.
En los viejos tiempos, principalmente el modo de texto era compatible. En este modo, el tablero se encargó de almacenar la definición de mapa de bits de los caracteres y mostrarlos en la posición actual del cursor. Todo lo que tenía que hacer era proporcionar el código ASCII del carácter (un byte por carácter) en un pequeño búfer de texto.
Hoy en día, se proporciona un búfer ráster de alta resolución, que es accesible a píxeles y al que se escribe información de color en algún formato compatible (en el modo "más alto", 3 bytes (RGB) por píxel, para un megapíxel o más).
Originalmente, se usaban mapas de bits binarios simples (empaquetados) de diferentes tamaños y se " enviaban " a la memoria ráster a través de una solicitud al controlador del dispositivo, con posible traducción de formato.
Hoy en día, los caracteres se definen principalmente como dibujos vectoriales , que son una descripción independiente de la resolución de los contornos, y deben someterse a un complejo proceso de representación que incluye antialiasing para obtener resultados suaves.
La salida renderizada se puede almacenar en caché para una visualización rápida, de nuevo al borrar.
El proceso general es complejo, puede ser acelerado por hardware y es manejado por el sistema operativo (administración de GUI) de manera transparente, junto con otras operaciones de dibujo primitivas gráficas.
fuente
La respuesta corta es SÍ, no puede evitar hacer mucha manipulación de bits si su formato lo necesita.
Dibujar un mapa de bits básicamente significa copiar un píxel de una fuente a un destino y debes hacer lo que sea necesario para hacerlo. (Citando al Capitán Obvio)
Una respuesta más larga es que si escribe un rasterizador de software, puede tener algún algoritmo y truco para ahorrarle tiempo de CPU (al saber qué parte NO NECESITA DIBUJAR (optimización de transparencia), al tener un formato de píxel de la misma fuente) como el destino (directamente o en forma de caché), realice una copia óptima de la memoria, etc. Considere básicamente el ciclo de dibujo de su rasterizador y vea cómo puede reestructurarlos para ahorrar tiempo de CPU (por ejemplo: podría generar en tiempo de ejecución un pieza de código de ensamblador solo específicamente para imprimir la letra A o tener meta en su información de mapa de bits de origen para decirle cómo omitir el área transparente, etc.) Cada caso de uso puede tener una solución diferente basada en el conjunto de instrucciones de la CPU, el formato del búfer, el algoritmo de su representación primitiva (¿rotativa? ¿estirando mapas de bits? ¿qué tipo de filtrado? etc ...), registro de CPU y caché, etc.
Así que sí, de todos modos, TOMÓ mucho ciclo de la CPU escribir un solo píxel en los viejos tiempos, cuando la codificación extraña y la pequeña memoria eran la norma. :-) Pero no prohibió que las máquinas de 16/32 bits con CPU de 8 MHZ hicieran cosas así: https://www.youtube.com/watch?v=GWwPJU6pp30 (Y también se utilizó una gran parte de la CPU para la musica)
En el caso de la representación de HW, HW realizará la conversión del formato de origen al formato de destino y, aunque no utilizará muchos de los trucos disponibles para el rasterizador de SW, su implementación genérica en HW probablemente superará la mayor parte de la implementación de SW.
fuente