Предотвращение мерцания: различия между версиями
Cool-T (обсуждение | вклад) | Cool-T (обсуждение | вклад) (→Применение) | ||
Строка 13: | Строка 13: | ||
<ol> | <ol> | ||
<li>'''Перед выводом графики мы меняем поверхность, на которой будем рисовать'''<br> | <li>'''Перед выводом графики мы меняем поверхность, на которой будем рисовать'''<br> | ||
− | По-умолчанию этой поверхностью является экранная поверхность. Но для наших целей она не подходит. Переключаем поверхность | + | По-умолчанию этой поверхностью является экранная поверхность. Но для наших целей она не подходит. Переключаем поверхность с помощью функции [[AhiDrawSurfDstSet]]: |
<pre> | <pre> | ||
AhiDrawSurfDstSet(dCtx, sDraw, 0); | AhiDrawSurfDstSet(dCtx, sDraw, 0); | ||
Строка 60: | Строка 60: | ||
</ol> | </ol> | ||
+ | |||
+ | Изображение получено на экране. | ||
+ | |||
+ | == См. также == | ||
+ | |||
+ | * [[LdrDisplayCbkReg]] - функция для создания callback'ов для рисования поверх [[UIS]] | ||
+ | * [[LdrDisplayCbkUnReg]] - функция для удаления callback'ов, созданных с помощью [[LdrDisplayCbkReg]] | ||
[[Категория:Эльфостроение]] | [[Категория:Эльфостроение]] |
Версия 06:03, 8 июня 2010
Двойная буферизация (англ. Double Buffering) — метод вывода графики на экран через драйвер, который применяется для предотвращения эффекта "мерцания".
Описание
При использовании метода "двойной буферизации", графика сначала выводится во вторичный буфер (в данном случае на поверхность в видеопамяти), а затем проецируется из видеопамяти на дисплей.
Применение
Перед началом вывода графики необходимо чтобы у нас был контекст устройства (dCtx), на которое будем выводить графику и две поверхности - экранная поверхность (sDisp) и внеэкранная поверхность (sDraw). Если у нас их нет - смотрим здесь как их получить.
Итак, графика инициализирована. Можем приступать к работе.
- Перед выводом графики мы меняем поверхность, на которой будем рисовать
По-умолчанию этой поверхностью является экранная поверхность. Но для наших целей она не подходит. Переключаем поверхность с помощью функции AhiDrawSurfDstSet:AhiDrawSurfDstSet(dCtx, sDraw, 0);
- Собственно, выводим графику
Выводим графику. Не забываем устанавливать растровую операцию и цвет кисти:// Вспомогательная переменная для указания области экрана AHIRECT_T rect; // Устанавливаем растровую операцию на применение кисти AhiDrawRopSet(dCtx, AHIROP3(AHIROP_PATCOPY)); // Установим цвет кисти. Этим цветом будут выводиться наши графические примитивы AhiDrawBrushFgColorSet(devCx, ATI_565RGB(0,0,255)); // Ярко-синий // Зададим прямоугольник на экране, который будет залит нашим цветом rect.x1 = 0; rect.y1 = 0; rect.x2 = 64; rect.y2 = 64; // Нарисуем прямоугольник rect AhiDrawSpans( dCtx, &rect, 1, 0);
- Переносим изображение из поверхности в видеопамяти на экран
Графика выведена в память, но теперь её нужно вывести на экран. Для этого мы выставляем растровую операцию в AHIROP_SRCCOPY, устанавливаем поверхность-источник в sDraw (там у нас находится то, что мы уже вывели), а поверхность-приёмник в sDisp (экранная поверхность) и копируем изображение с помощью функции AhiDrawBitBlt:// Устанавливаем растровую операцию AhiDrawRopSet(hDC, AHIROP3(AHIROP_SRCCOPY)); // Устанавливаем поверхность-источник AhiDrawSurfSrcSet(hDC, sDraw, 0); // Устанавливаем поверхность-приёмник AhiDrawSurfDstSet(hDC, sDisp, 0); // Копируем изображение AhiDrawBitBlt(hDC, &rect, &point);
Изображение получено на экране.
См. также
- LdrDisplayCbkReg - функция для создания callback'ов для рисования поверх UIS
- LdrDisplayCbkUnReg - функция для удаления callback'ов, созданных с помощью LdrDisplayCbkReg