Предотвращение мерцания: различия между версиями
Cool-T (обсуждение | вклад) м | Cool-T (обсуждение | вклад) | ||
Строка 3: | Строка 3: | ||
== Описание == | == Описание == | ||
− | При использовании метода "двойной буферизации", | + | При использовании метода "двойной буферизации", графика сначала выводится во вторичный буфер (в данном случае на [[AHI#Поверхности|поверхность]] в [[Видеопамять|видеопамяти]]), а затем проецируется из [[Видеопамять|видеопамяти]] на дисплей. |
+ | |||
+ | == Применение == | ||
+ | |||
+ | Перед началом вывода графики необходимо чтобы у нас был [[AHI#Контекст устройства|контекст устройства]] ('''dCtx'''), на которое будем выводить графику и две [[AHI#Поверхности|поверхности]] - экранная поверхность ('''sDisp''') и внеэкранная поверхность ('''sDraw'''). Если у нас их нет - смотрим [[AHI#Инициализация|здесь]] как их получить. | ||
+ | |||
+ | Итак, графика инициализирована. Можем приступать к работе. | ||
+ | |||
+ | <ol> | ||
+ | <li>'''Перед выводом графики мы меняем поверхность, на которой будем рисовать'''<br> | ||
+ | По-умолчанию этой поверхностью является экранная поверхность. Но для наших целей она не подходит. Переключаем поверхность вывода с помощью функции [[AhiDrawSurfDstSet]]: | ||
+ | <pre> | ||
+ | AhiDrawSurfDstSet(dCtx, sDraw, 0); | ||
+ | </pre> | ||
+ | </li> | ||
+ | |||
+ | <li>'''Собственно, выводим графику'''<br> | ||
+ | Выводим графику. Не забываем устанавливать [[Raster Operations|растровую операцию]] и цвет кисти: | ||
+ | <pre> | ||
+ | // Вспомогательная переменная для указания области экрана | ||
+ | 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); | ||
+ | </pre> | ||
+ | </li> | ||
+ | |||
+ | <li>'''Переносим изображение из поверхности в видеопамяти на экран'''<br> | ||
+ | Графика выведена в память, но теперь её нужно вывести на экран. Для этого мы выставляем растровую операцию в <tt>'''AHIROP_SRCCOPY'''</tt>, устанавливаем поверхность-источник в '''sDraw''' (там у нас находится то, что мы уже вывели), а поверхность-приёмник в '''sDisp''' (экранная поверхность) и копируем изображение с помощью функции [[AhiDrawBitBlt]]: | ||
+ | <pre> | ||
+ | // Устанавливаем растровую операцию | ||
+ | AhiDrawRopSet(hDC, AHIROP3(AHIROP_SRCCOPY)); | ||
+ | |||
+ | // Устанавливаем поверхность-источник | ||
+ | AhiDrawSurfSrcSet(hDC, sDraw, 0); | ||
+ | |||
+ | // Устанавливаем поверхность-приёмник | ||
+ | AhiDrawSurfDstSet(hDC, sDisp, 0); | ||
+ | |||
+ | // Копируем изображение | ||
+ | AhiDrawBitBlt(hDC, &rect, &point); | ||
+ | </pre> | ||
+ | </li> | ||
+ | |||
+ | </ol> | ||
+ | |||
+ | [[Категория:Эльфостроение]] |
Версия 05:54, 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);