Первая анимация
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. У этого метода только один параметр - область поверхности, которая должна быть разблокирована. Желательно разблокировать ту же область, что и блокировалась, чтобы случайно какой-то кусок не остался заблокированным. |