вторник, 4 марта 2014 г.

Эксперименты с DirectDraw. Прямой доступ к видеопамяти в наше время.

Всем привет. Я таки вышел из зимней спячки и готов к подвигам чуть более чем нифига :) .Ну да ладно, сделаю все что смогу. Сегодня я хочу поведать о такой мифической вещи как видеопамять.



Любой программист (или даже скриптер) может влиять на оперативную память. Но далеко не каждый может записать в видеопамять.

Когда небо было голубое...

Нет, когда то это было легко. Во времена DOS все, что записывается после адреса 0xB800, транслировалось в видеопамять, а оттуда - на экран. Нужно было лишь позаботится о правильном порядке записи, видеорежиме и собственно алгоритме рендеринга. Если использовался программный рендеринг, то генерация картинки ложилась на плечи процессора, который должен был обработать 307200 пикселей (при разрешений 640 * 480, тогда это было одно из популярных) и каждому из них присвоить свой байт цвета. Кстати о цветах: 32 битного True Color цвета тогда небыло. В основном все рисовали по палитре из 256 цветов, ибо один байт может определить только 255 значений (0 - черный цвет, поэтому 256). Но не смотря на все эти ограничения люди умудрялись удивлять (тогда - тем более!) неплохими графическими абстракциями.


 
Смотреть с 1:34

 К слову программы которые рисуют "чудеса" на компьютере прозвали демками. Некоторые из них действительно поражают воображение. Но меня уже уволокло не туда.

Наше время.

Но вот пришел windows, про DOS нынешнее поколение узнает только по учебникам, а вместо процессорного режима Real Mode пришел Protected Mode. И этот самый защищеный режим уже не даст вот так вот...


Но на помощь пришел DirectX. А если быть точнее - один из его компонентов. И имя этому Гендальфу : DirectDraw.

Без геморроя не обойдется - нужно его инициализировать, указать режим, кооперацию, написать функции рендеринга, свап буферов (двойной буфер, да). Но в итоге мы таки получаем доступ к участку памяти куда можно записать наши пиксели.
Все было ничего но.... кхэм... DirectDraw считается жутко устаревшей технологией. Единственная возможность получить полноценный прямой доступ к видеопамяти более не поддерживается современным DirectX. Конечно в DirectX остались часть функции DirectDraw, но в урезаном виде. На то было несколько причин:
  1. Такая возможность потеряла актуальность, ибо вся графика рисовалась через текстуры и спрайты, да и вообще 3D наше все
  2. Прямой доступ к видеопамяти немного нарушает концепцию защищеного режима. Если неправильно пользоваться DirectDraw может повесить графическую систему. Кроме того, работа DirectDraw немного нарушает работу современного DirectX.
Но несмотря на все эти риски даже на современных системах осталась поддержка приложений написанных на DirectDraw API. Но заголовки и программные библиотеки были скоро удалены из официального DirectX SDK. Однако библиотека ddraw.dll осталась даже в Windows 8.1
Если запускается приложение использующее DirectDraw, то Windows 7 начинает подготавливать анус готовится к худшему. Чуть что - и включается режим совместимости, и внешний вид Windows становится болезненный :) . Но для того чтобы почувствовать АБСОЛЮТНУЮ ВЛАААААСТЬ, оно того стоит ;) .


Комментариев нет:

Отправить комментарий