Fondamentalmente, come vengono visualizzate le bitmap 2D?


9

Supponiamo di avere un computer indirizzabile a parole a 64 bit e di voler programmarlo per generare un carattere 5x7 memorizzato come bitmap di immagine binaria (come quello sotto) su un display mappato in memoria.

inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine

Dato che abbiamo 5 x 7 = 35 pixel per carattere, potremmo memorizzare un carattere usando 35 bit in una sola parola. Con il bit meno significativo a partire dal lato sinistro della parola e ad ogni pixel dell'immagine è rappresentata dal n esimo bit come mostrato sopra, il numero "3" sopra dovrebbe essere memorizzati nella memoria, come: 01110100010000100110000011000101110, seguito da 29 inutilizzata bit impostati su 0.

È così che i personaggi erano / sono memorizzati nei computer vecchi / moderni? O usano invece un singolo byte / parola per pixel?

Se sono memorizzati in questo modo, quale sarebbe la routine nell'assembly / codice macchina (usando nient'altro che istruzioni elementari come operazioni bit a bit, aritmetiche e di trasporto dei dati dall'architettura del set di istruzioni del computer) utilizzate per convertire questi dati in un'immagine su il display sembra? Sarebbe qualcosa del tipo:

  1. Memorizza le coordinate di visualizzazione xey per il pixel corrente da aggiornare in un determinato registro.
  2. Memorizzare i due valori RGB scelti (in questo caso 0,255,0 per il verde e 0,0,0 per il nero) in altri due registri separati.
  3. Fai in modo che altri due registri fungano da contatori inizializzati su 5 e 7 per tenere traccia della riga e della colonna correnti dell'immagine renderizzata.
  4. Verifica se il registro di colonna non è 0. In caso contrario, verifica se l'LSB della bitmap è impostato su 1, quindi AND il rispettivo registro di valori RGB con il registro delle coordinate xey in base al risultato, quindi MOV quel risultato al registro di uscita del display.
  5. Diminuisci il registro contatori di riga di 1, verifica se è 0. Se lo è, quindi ripristinalo a 5 e incrementa la coordinata y di 1 e decrementa il contatore di colonne di 1.
  6. Sposta il registro tenendo la bitmap di 1 bit a sinistra.
  7. JMP all'istruzione 4.

Esiste un modo più semplice o più efficiente per farlo? Sembra che anche qualcosa di semplice come il rendering di un singolo carattere di testo richiede un numero piuttosto elevato di operazioni e richiederebbe circa 200 cicli di CPU.

Infine, ci sono buoni libri o risorse sul codice a livello di macchina per la visualizzazione di immagini da zero, perché non sono stato in grado di trovarne alcuno mentre si passano sopra questo particolare argomento o il codice è scritto in un linguaggio di alto livello o un assemblatore che utilizza macro, tutte "imbrogliate" e non spiegano cosa sta fondamentalmente succedendo al livello più basso.


3
Il Black Book di programmazione grafica è sicuramente un classico che vale la pena leggere. Molta magia nera della
vecchia scuola

Sì, secondo il libro di Michael Abrash. È un'ottima lettura. Ci sono molti altri trucchi nella manica di ciò che è scritto in questo libro, ma la filosofia che sta dietro è importante (fino ad oggi!)
Romain Piquois,

Risposte:


7

Devi distinguere le modalità di testo e grafiche della scheda grafica della tua macchina.

In passato, era supportata principalmente la modalità testo. In questa modalità la scheda si occupava di memorizzare la definizione bitmap dei caratteri e visualizzarli nella posizione corrente del cursore. Tutto quello che dovevi fare era fornire il codice ASCII del carattere (un byte per carattere) in un piccolo buffer di testo.

Oggi viene fornito un buffer raster ad alta risoluzione, che è accessibile ai pixel e al quale si scrivono informazioni sul colore in alcuni formati supportati (nella modalità "più alta", 3 byte (RGB) per pixel, per un megapixel o più).

Inizialmente, venivano utilizzate bitmap binarie semplici (impacchettate) di dimensioni diverse e " blittted " nella memoria raster tramite una richiesta al driver del dispositivo, con possibile traduzione del formato.

Al giorno d'oggi, i caratteri sono per lo più definiti come disegni vettoriali , che sono una descrizione dei contorni indipendente dalla risoluzione e devono essere sottoposti a un processo di rendering complesso che include l' antialias per risultati uniformi.

L'output di rendering può essere memorizzato nella cache per una visualizzazione rapida, sempre mediante blitting.

L'intero processo è complesso, può essere accelerato dall'hardware ed è gestito dal sistema operativo (gestione della GUI) in modo trasparente, insieme ad altre operazioni grafiche di disegno primitivo.


1

La risposta breve è SÌ, non puoi evitare di fare molta manipolazione se il tuo formato ne ha bisogno.

Disegnare una bitmap significa fondamentalmente copiare un pixel da una sorgente a una destinazione e devi fare ciò che serve per farlo. (Citando Captain Ovvio)

Una risposta più lunga è che se scrivi un rasterizzatore software, puoi avere un algoritmo e un trucco per farti risparmiare tempo cpu (sapendo quale parte NON DEVI DISEGNARE (ottimizzazione della trasparenza), avendo un formato pixel della sorgente lo stesso come destinazione (direttamente o in una forma di cache), eseguire in modo ottimale la memcopia, ecc ... Fondamentalmente considera il ciclo di disegno del tuo rasterizzatore e vedi come puoi ristrutturarli per risparmiare tempo sulla CPU. (es: potresti generare in fase di esecuzione un pezzo di codice assembler appositamente per stampare la lettera A o avere meta per le informazioni bitmap sorgente per dirti come saltare l'area trasparente, ecc.) Ogni caso d'uso può avere una soluzione diversa basata sul set di istruzioni della CPU, sul formato del buffer, sul algoritmo del tuo rendering primitivo (rotazione? stretching bitmap? che tipo di filtro? ecc ...), registro CPU e cache ecc ...

Quindi sì, ci è voluto un sacco di ciclo della CPU per scrivere un singolo pixel ai vecchi tempi quando la codifica strana e la piccola memoria erano la norma. :-) Ma non ha vietato alle macchine a 16/32 bit con CPU da 8 MHZ di fare cose del genere: https://www.youtube.com/watch?v=GWwPJU6pp30 (E è stata usata anche una grossa fetta della CPU per la musica)

Nel caso del rendering HW, HW eseguirà la conversione dal formato di origine al formato di destinazione e mentre non utilizzerà molti dei trucchi disponibili per il rasterizzatore SW, la sua implementazione generica in HW supererà molto probabilmente la maggior parte dell'implementazione SW.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.