Desde os primórdios do IBM PC e de seus clones, o hardware do adaptador de vídeo era muito simples: um pequeno bloco de memória era dedicado a uma grade de células de caracteres (80x25 caracteres no modo padrão), com dois bytes de memória para cada célula . Um byte selecionou o caractere e o outro selecionou seus "atributos" - cores de primeiro e segundo plano, além de controle de piscada para adaptadores de cores; vídeo em negrito, sublinhado, piscando ou reverso para adaptadores monocromáticos. O hardware procurou pixels em uma tabela ROM de formas de caracteres de acordo com o conteúdo da memória de caracteres.
Para oferecer um certo grau de independência de hardware, a interface do BIOS para o mapa de caracteres exigia a execução de uma interrupção do software para definir uma célula de caractere na tela. Isso foi lento e ineficiente. No entanto, a memória de caracteres também era endereçável diretamente pela CPU; portanto, se você soubesse qual hardware estava presente, poderia escrever diretamente na memória. De qualquer maneira, uma vez definido, o caractere permaneceria na tela até ser alterado, e a memória total de caracteres com a qual você precisava trabalhar era de 4000 bytes - aproximadamente o tamanho de uma única textura de 32x32 em cores!
Nos modos gráficos, a situação era semelhante; cada pixel na tela está associado a um local específico na memória, e havia uma interface de conjunto de pixels do BIOS, mas o trabalho de alto desempenho exigia a gravação direta na memória. Padrões posteriores, como o VESA, permitem que o sistema faça algumas consultas lentas com base no BIOS para aprender o layout da memória do hardware e, em seguida, trabalhar diretamente com a memória. É assim que um sistema operacional pode exibir gráficos sem um driver especializado, embora os sistemas operacionais modernos também incluam drivers básicos para o hardware de todos os principais fabricantes de GPUs. Até a mais nova placa NVidia suporta vários modos de compatibilidade com versões anteriores, provavelmente desde o IBM CGA.
Uma diferença importante entre gráficos 3D e 2D é que, em 2D, geralmente não é necessário redesenhar a tela inteira a cada quadro. Em 3D, se a câmera se mover um pouquinho, todos os pixels na tela poderão mudar; em 2D, se você não estiver rolando, a maior parte da tela permanecerá inalterada quadro a quadro, e mesmo se estiver rolando, geralmente é possível fazer uma cópia rápida de memória em memória em vez de recompor a cena inteira. Portanto, não é nada como ter que executar INT 10h para cada pixel em cada quadro.
Fonte: Eu sou muito velho