С первых дней существования IBM PC и его клонов оборудование адаптера дисплея было очень простым: небольшой блок памяти был выделен для сетки ячеек символов (80x25 символов в стандартном режиме) с двумя байтами памяти для каждой ячейки. , Один байт выбирает символ, а другой - его "атрибуты" - цвета переднего плана и фона, а также управление мерцанием для цветовых адаптеров; полужирное, подчеркнутое, мигающее или обратное видео для монохромных адаптеров. Аппаратные средства искали пиксели в таблице символьных форм ПЗУ в соответствии с содержимым символьной памяти.
Чтобы обеспечить определенную степень аппаратной независимости, интерфейс BIOS к карте символов требует выполнения программного прерывания для установки ячейки из одного символа на экране. Это было медленно и неэффективно. Тем не менее, память символов также была напрямую адресована процессором, поэтому, если вы знали, какое оборудование присутствует, вы могли бы записывать данные непосредственно в память. В любом случае, после установки символ будет отображаться на экране до тех пор, пока не изменится, а общая память символов, с которой вам нужно было работать, составляла 4000 байт - размером с одну полноцветную текстуру 32x32!
В графических режимах ситуация была аналогичной; каждый пиксель на экране связан с определенным местом в памяти, и был установлен интерфейсный пиксель BIOS, но для высокопроизводительной работы требовалась запись непосредственно в память. Более поздние стандарты, такие как VESA, позволяли системе выполнять несколько медленных запросов на основе BIOS, чтобы узнать структуру памяти оборудования, а затем работать непосредственно с памятью. Именно так ОС может отображать графику без специального драйвера, хотя современные ОС также включают в себя базовые драйверы для оборудования каждого крупного производителя графических процессоров. Даже самая новая карта NVidia будет поддерживать несколько различных режимов обратной совместимости, вероятно, вплоть до IBM CGA.
Одним из важных отличий между 3D-графикой и 2D-графикой является то, что в 2D-графике обычно не требуется перерисовывать весь экран каждый кадр. В 3D, если камера движется даже чуть-чуть, каждый пиксель на экране может измениться; В 2D, если вы не прокручиваете, большая часть экрана будет неизменной от кадра к кадру, и даже если вы прокручиваете, вы можете обычно делать быструю копию из памяти в память вместо перекомпоновки всей сцены. Так что нет ничего лучше, чем выполнять INT 10h для каждого пикселя в каждом кадре.
Источник: я действительно старый