Установка логической длины строки развертки

Страницы видеопамяти отображаются на экран последовательно, друг за другом. При этом на экран отображается только некоторая часть видеопамяти. Другая, невидимая часть, может использоваться как вспомогательная: для "прокрутки" изображения, для хранения шрифтов и масок, для z-буферизации и пр.

================

| |

| |--- видимая часть видеопамяти

| |

================

| |

| |

| |--- невидимая часть

| |

| |

----------------

Однако, если ширина экрана в пикселах не равна 2N (256, 512, 1024 или 2048), то концы страниц не будут совпадать с концами ви­деострок, что порождает множество проблем - при вычерчивании, к примеру, линии на экране, придется при выводе каждой точки выпол­нять проверку пересечения границы страницы, и, при необходимости, переключать страницу.

Постоянный контроль границы страницы и частое программное (через VESA-BIOS) переключение страниц чудовищно замедляет вывод информации на экран (в сотни или тысячи раз).

Эту проблему можно частично разрешить, реорганизуя видеопа­мять таким образом, чтобы логическая длина строки (длина строки видеопамяти) была больше физической (экранной) и стала кратной 2N:

видимая область

|

================---------

| | |

| | |

| | |

================ |

| |--- невидимая область

| |

-------------------------

Установка новой логической длины строки выполняется вызовом прерывания 10h с номером функции 4F065h. В регистр BL нужно запи­сать 0, в регистр CX - требуемую ширину строки в пикселах.

Например, устанавливаем длину строки равной 1024 пиксела:

mov AX,4F06h

mov BL,0

mov CX,1024

int 10h

В 8-битовом режиме (256 цветов) на одну точку приходится 1 байт данных, в 32-битовом режиме True Color - 4 байта. Если логи­ческая длина строки равна 1024 пиксела, то на одну страницу будет приходиться соответственно 64 строки в 256-цветном режиме и 16 строк - в режиме True Color.

Более радикальный способ используется в программах трехмер­ной графики, где каждую точку в каждом кадре приходится перезапи­сывать по несколько раз. Видеопамять работает медленнее ОЗУ и намного медленнее кэш-памяти. Поэтому (с точки зрения скорости работы) выгодно выделить в ОЗУ буфер кадра (от 2 до 8 Мб), пост-

роить там изображение и переписать готовый кадр в память видео­карты.

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

 

ПРИКЛАДНОЕ ПРОГРАММИРОВАНИЕ В ТЕХНИЧЕСКИХ СИСТЕМАХ

ЛЕКЦИЯ N10