Первая анимация

Xakep, номер #045, стр. 045-063-1


Horrific aka Фленов Михаил smirnandr@mail.ru www.cydsoft.com/vr-online

Когда я еще программировал графику под DOS, единственным способом получить большую скорость было использование прямого доступа к видеопамяти. Это было достаточно просто, потому что видеопамять находилась по определенному адресу, а использование прерываний для вывода графики очень сильно тормозило систему. В Windows запрещен прямой доступ, поэтому тут есть проблемы. Но DirectDraw позволяет решить эту проблему.

Все "ЗА"

В некоторых случаях прямой доступ к видеопамяти - единственный способ повысить производительность системы. Хотя DirectDraw достаточно быстрая библиотека, она все же расходует некоторое процессорное время при выводе графики зря. Это связано с тем, что функции DirectDraw достаточно универсальны и имеют много возможностей. Каждая дополнительная возможность - это как дополнительный тормоз, а ведь в реальных условиях нам нужно максимум 50% доступных примочек. Когда ты обращаешься к видеопамяти напрямую, вывод в любом случае будет происходить быстрее, если ты сам не сделаешь глупость и не затормозишь свое творение.

Еще одно "за" использование прямого доступа - в DirectDraw нет нормальных средств для рисования графики, кроме как копирования изображений, с чем мы уже познакомились. А что если тебе надо нарисовать только точку посередине экрана или линию? Неужели все это надо представлять в виде отдельных изображений? Конечно же, нет, с помощью прямого доступа можно решить все. А для этого необходимо всего лишь немного знаний математики (школьного курса достаточно) и немного ловкости рук. Со всем этим я буду знакомить тебя благодаря Х. Я покажу тебе алгоритмы рисования линий, кругов и выходящих из всего этого последствий.

Теория

Для получения прямого доступа к поверхности нужно вызвать ее метод Lock. Этот метод блокирует поверхность и позволяет получить доступ непосредственно к ее данным. Во время блокировки поверхности происходит и блокировка системы, поэтому желательно блокировать на небольшие промежутки времени и после использования сразу разблокировать с помощью вызова Unlock. У метода Lock есть четыре параметра:

1. Область поверхности, к которой мы хотим получить доступ. Тип параметра - указатель на TRect. Если здесь указать nil, то доступ будет получен ко всей области.

2. Структура типа TDDSURFACEDESC2, куда будет записана инфа о поверхности.

3. Флаги. Можно указывать следующие:

а) DDLOCK_NOSYSLOCK - не блокировать систему (игнорируется при получении доступа к первичной поверхности);

б) DDLOCK_READONLY - заблокировать только для чтения;

в) DDLOCK_SURFACEMEMORYPTR - указывает на то, что надо получить правильный указатель на верхний угол области поверхности;

г) DDLOCK_WAIT - если сейчас блокировка невозможна, то подождать, пока поверхность не освободится;

д) DDLOCK_WRITEONLY - блокировать только для записи.

4. Последний параметр не используется и должен быть равен 0.

После использования поверхности нужно вызвать метод Unlock. У этого метода только один параметр - область поверхности, которая должна быть разблокирована. Желательно разблокировать ту же область, что и блокировалась, чтобы случайно какой-то кусок не остался заблокированным.

Содержание  Вперед на стр. 045-063-2