Стэн Трухильо - Графика для Windows средствами DirectDraw

Тут можно читать онлайн Стэн Трухильо - Графика для Windows средствами DirectDraw - бесплатно полную версию книги (целиком) без сокращений. Жанр: comp-programming. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    Графика для Windows средствами DirectDraw
  • Автор:
  • Жанр:
  • Издательство:
    неизвестно
  • Год:
    неизвестен
  • ISBN:
    нет данных
  • Рейтинг:
    4.88/5. Голосов: 81
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 100
    • 1
    • 2
    • 3
    • 4
    • 5

Стэн Трухильо - Графика для Windows средствами DirectDraw краткое содержание

Графика для Windows средствами DirectDraw - описание и краткое содержание, автор Стэн Трухильо, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

Графика для Windows средствами DirectDraw - читать онлайн бесплатно полную версию (весь текст целиком)

Графика для Windows средствами DirectDraw - читать книгу онлайн бесплатно, автор Стэн Трухильо
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

// переключение страниц)

int x, y;

BOOL newclick=FALSE;

int count=mouseclickqueue.GetCount();

while (count--) {

MouseClickData mc=mouseclickqueue.RemoveTail();

if (mc.button==0) {

x=mc.x;

y=mc.y;

newclick=TRUE;

}

}

critsection.Unlock();

//------ Конец синхронизированной секции -------

//------ Сделать паузу в соответствии с выбранной задержкой ----

if (delay_value[dm_index]!=0) Sleep(delay_value[dm_index]);

//------ Обновить меню задержки --------

if (newclick) {

int max_index=sizeof(delay_value)/sizeof(int)-1;

int menux=screen_width-dm_width+dm_margin;

int menuw=dm_width-dm_margin*2;

if (x>=menux && x<=menux+menuw) {

int index=(y-dm_header)/dm_entrysize;

if (index>=0 && index<=max_index && index!=dm_index) {

dm_index=index;

UpdateDelaySurface();

}

}

}

}

Функция DrawScene()состоит из семи этапов:

1. Проверка клавиши Escape.

2. Подготовка нового кадра во вторичном буфере.

3. Обновление курсора (также во вторичном буфере).

4. Переключение страниц.

5. Проверка очереди событий мыши.

6. Проверка очереди событий мыши.

7. Обновление поверхности меню задержки.

Первый этап выполняется функцией GetDeviceState()интерфейса DirectInputDevice. Если будет обнаружено нажатие клавиши Escape, функция посылает сообщение WM_CLOSE, сигнализируя о завершении приложения.

Подготовка вторичного буфера (этап 2) включает его стирание и последующее копирование в него внеэкранной поверхности. Для перебора поверхностей из массива coilиспользуется статическая целая переменная (массив coilподготавливается функцией CustomSurfaces(), которую мы не рассматриваем).

На этапах 3, 4 и 5 программа обращается к ресурсам, используемым потоком ввода, поэтому необходимо воспользоваться критической секцией. Объект класса CCriticalSection( critsection), объявленный в классе CursorWin(см. листинг 7.1), блокируется функцией Lock(). Эта функция пытается получить доступ к критической секции. Если попытка оказывается удачной, функция захватывает критическую секцию и завершается. После этого можно смело работать с совместными ресурсами — поток заведомо обладает монопольным правом доступа к ним. Если функции Lock()будет отказано в доступе (из-за того что критическая секция в данный момент захвачена потоком ввода), функция Lock()блокирует основной поток до освобождения критической секции.

На этапе 3 мы сохраняем содержимое области вторичного буфера, занятой курсором, а затем рисуем курсор в буфере. Обе операции выполняются функцией BltFast()интерфейса DirectDrawSurface.

На этапе 4 выполняется переключение страниц, однако оно происходит сложнее, чем обычно. Это связано с тем, что функция Flip()интерфейса DirectDrawSurfaceна самом деле не выполняет переключения. Она лишь приказывает видеокарте переключить страницы и после этого завершается. Фактическое переключение страниц происходит после того, как будут закончены все ранее начатые операции блиттинга во вторичный буфер. Для наших целей этого недостаточно. Нам нужно, чтобы переключение страниц было закончено до кода критической секции, потому что в противном случае поток ввода сможет обновить первичную поверхность во время переключения страниц. С помощью цикла whileи функции GetFlipStatus()интерфейса DirectDrawSurfaceмы опрашиваем DirectDraw до тех пор, пока переключение страниц не закончится (в DirectDraw не предусмотрена блокировка по этой операции, но даже если бы она и была, переключение страниц происходит слишком быстро и не оправдывает блокировки потока).

На этапе 5 мы проверяем очередь событий мыши. Элементы извлекаются из очереди, пока она не опустеет. Координаты левой (нулевой) кнопки мыши сохраняются для дальнейшего использования.

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

Этап 6 не требует синхронизации, поэтому мы вызываем функцию CCriticalSection::Unlock(). Если к этому моменту поток ввода был заблокирован и ожидал доступа к своей критической секции, вызов Unlock()позволит ему войти в нее.

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

Теперь мы знаем, как происходит обновление экрана в основном потоке. Давайте посмотрим, как работает поток ввода.

Поток ввода

Если не считать двух вспомогательных функций, весь поток ввода реализован в виде одной функции. Функция MouseThread()приведена в листинге 7.5.

Листинг 7.5. Функция MouseThread()

DWORD CursorWin::MouseThread(LPVOID p) {

TRACE("starting mouse thread\n");

CursorWin* win=(CursorWin*)p;

while(TRUE) {

CMultiLock mlock((CSyncObject**)mouse_event, 2);

DWORD event=mlock.Lock(INFINITE, FALSE);

if (event-WAIT_OBJECT_0==quit_event_index) {

TRACE("got quit message: quitting mouse thread\n");

return 0;

}

critsection.Lock();

oldcurx=curx;

oldcury=cury;

BOOL buffer_empty=FALSE;

while (!buffer_empty) {

DIDEVICEOBJECTDATA data;

DWORD elements=1;

if (mouse==0) {

TRACE("invalid pointer: quitting mouse thread\n");

return 0;

}

HRESULT r=mouse->GetDeviceData(sizeof(data), &data, &elements, 0);

if (r==DI_OK && elements==1) {

static MouseClickData mc;

switch data.dwOfs) {

case DIMOFS_X:

curx+=data.dwData;

break;

case DIMOFS_Y:

cury+=data.dwData;

break;

case DIMOFS_BUTTON0:

if (data.dwData & 0x80) {

mc.x=curx;

mc.y=cury;

mc.button=0;

mouseclickqueue.AddHead(mc);

}

break;

case DIMOFS_BUTTON1:

if (data.dwData & 0x80) {

mc.x=curx;

mc.y=cury;

mc.button=1;

mouseclickqueue.AddHead(mc);

}

break;

}

} else buffer_empty=TRUE;

}

if (curx<0) curx=0;

if (cury<0) cury=0;

if (curx>=screen_width-cursor_width) curx=screen_width-cursor_width-1;

if (cury>=screen_height-cursor_height) cury=screen_height-cursor_height-1;

if (curx==oldcurx && cury==oldcury) {

//----- обновление курсора не требуется ------

goto nevermind;

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Стэн Трухильо читать все книги автора по порядку

Стэн Трухильо - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




Графика для Windows средствами DirectDraw отзывы


Отзывы читателей о книге Графика для Windows средствами DirectDraw, автор: Стэн Трухильо. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x