По сути, как отображаются 2D растровые изображения?

9

Предположим, у нас есть 64-битный адресно-словачный компьютер, и мы хотим запрограммировать его для вывода символа 5x7, хранящегося в виде двоичного изображения (например, приведенного ниже), на отображение с отображением в памяти.

введите описание изображения здесь введите описание изображения здесь

Поскольку у нас есть 5 x 7 = 35 пикселей на символ, мы можем сохранить символ, используя 35 бит в одном слове. С младшим значащим битом, начинающимся с левой стороны слова, и с каждым пикселем в изображении, представленным n- м битом, как показано выше, число «3» выше будет сохранено в памяти как: 01110100010000100110000011000101110, за которым следуют 29 неиспользованных биты установлены в 0.

Это как символы были / хранятся на старых / современных компьютерах? Или вместо этого они используют один байт / слово на пиксель?

Если они хранятся таким образом, то какая бы подпрограмма в сборке / машинном коде (использующая не более чем элементарные инструкции, такие как побитовые, арифметические операции и операции передачи данных из архитектуры набора команд компьютера) использовалась для преобразования этих данных в изображение на как выглядит дисплей? Будет ли это что-то вроде:

  1. Сохраните координаты отображения x и y для текущего пикселя, который будет обновлен в определенном регистре.
  2. Сохраните два выбранных значения RGB (в данном случае 0,255,0 для зеленого и 0,0,0 для черного) в двух других отдельных регистрах.
  3. Пусть еще два регистра действуют как счетчики, инициализированные 5 и 7, чтобы отслеживать текущую строку и столбец визуализируемого изображения.
  4. Проверьте, не равен ли регистр столбца 0. Если это не так, проверьте, установлен ли LSB для битовой карты на 1, затем И соответствующий регистр значений RGB с регистром координат x и y в зависимости от результата, затем MOV этот результат на дисплей выходного регистра.
  5. Уменьшите регистр счетчика строк на 1, проверьте, равен ли он 0. Если это так, установите его обратно в 5, увеличьте координату y на 1 и уменьшите счетчик столбцов на 1.
  6. Сдвиньте регистр, удерживающий растровое изображение на 1 бит влево.
  7. JMP к инструкции 4.

Есть ли более простой или эффективный способ сделать это? Кажется, что даже такая простая вещь, как рендеринг одного небольшого текстового символа, занимает довольно большое количество операций и занимает около 200 циклов ЦП.

Наконец, есть ли какие-нибудь хорошие книги или ресурсы по машинному коду для отображения изображений с нуля, потому что я не смог их найти, поскольку они либо затушевывают этот конкретный предмет, либо код написан на языке высокого уровня или ассемблер использует макросы, которые все «обманывают» и не объясняют, что в основном происходит на самом низком уровне.

user1735
источник
3
Графика Программирование Черная книга , безусловно , является классическим чтением стоит. В нем много старой школы черной магии;)
гламперт
Да, я вторая книга Майкла Абраша. Это отличное чтение. В рукаве есть гораздо больше трюков с тем, что написано в этой книге, но философия, стоящая за этим, важна (даже по сей день!)
Romain Piquois

Ответы:

7

Вы должны различать текстовый и графический режимы графической платы вашей машины.

В старые времена в основном поддерживался текстовый режим. В этом режиме доска позаботилась о сохранении растрового определения символов и отображении их в текущей позиции курсора. Все, что вам нужно было сделать, это предоставить ASCII-код символа (один байт на символ) в небольшом текстовом буфере.

В настоящее время предоставляется растровый буфер с высоким разрешением, доступный по пикселям и в который вы записываете информацию о цвете в некотором поддерживаемом формате (в «самом высоком» режиме, 3 байта (RGB) на пиксель, для мегапикселя или более).

Первоначально использовались простые (упакованные) двоичные растровые изображения разных размеров, которые « перетаскивались » в растровую память посредством запроса к драйверу устройства с возможным переводом формата.

В настоящее время символы в основном определяются как векторные рисунки , которые представляют собой независимое от разрешения описание контуров и требуют сложного процесса рендеринга, который включает сглаживание для получения плавных результатов.

Рендеринг вывода может быть кэширован для быстрого отображения, опять же, мигая.

Весь процесс сложен, может быть аппаратно ускорен и прозрачно обрабатывается операционной системой (управление графическим интерфейсом) вместе с другими графическими примитивными операциями рисования.

Ив Дауст
источник
1

Короткий ответ - ДА, вы не можете избежать большого количества битовых манипуляций, если это необходимо вашему формату.

Рисование растрового изображения в основном означает копирование пикселя из источника в место назначения, и вы должны сделать то, что нужно, чтобы сделать это. (Цитата капитана очевидна)

Более длинный ответ заключается в том, что если вы пишете программный растеризатор, вы можете иметь некоторый алгоритм и хитрость, чтобы сэкономить ваше время процессора (зная, какую часть вам НЕ НУЖНО рисовать (оптимизация прозрачности), имея одинаковый формат пикселя источника в качестве места назначения (непосредственно или в форме кэша), оптимально выполнять memcopy и т. д. В основном рассмотрите цикл рисования вашего растеризатора и посмотрите, как вы можете реструктурировать их, чтобы сэкономить время ЦП (например: вы можете генерировать во время выполнения a кусок кода на ассемблере, специально предназначенный для печати буквы А или наличия мета в информации о вашем растровом изображении, чтобы рассказать вам, как пропустить прозрачную область и т. д.). Каждый вариант использования может иметь свое решение, основанное на наборе инструкций ЦП, формате буфера, алгоритм вашего примитива рендеринга (вращение, растягивание растровых изображений, что за фильтрация? и т. д.), регистр процессора и кеш и т. д.

Так что да, в любом случае, это занимало много ЦП при записи одного пикселя в старые времена, когда странное кодирование и небольшая память были нормой. :-) Но это не запрещало 16/32-битным машинам с 8 МГц процессором делать такие вещи: https://www.youtube.com/watch?v=GWwPJU6pp30 (и также использовался большой кусок ЦП для музыки)

В случае рендеринга HW HW выполнит преобразование из исходного формата в формат назначения, и хотя он не будет использовать большую часть приемов, доступных растеризатору SW, его общая реализация в HW, скорее всего, превзойдет большую часть реализации SW.

Romain Piquois
источник