Открыть главное меню

Двойная буферизация

Двойная буферизация (англ. Double Buffering) — метод вывода графики на экран через драйвер, который применяется для предотвращения эффекта "мерцания".

Описание

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

Применение

Перед началом вывода графики необходимо чтобы у нас был контекст устройства (dCtx), на которое будем выводить графику и две поверхности - экранная поверхность (sDisp) и внеэкранная поверхность (sDraw). Если у нас их нет - смотрим здесь как их получить. Как только их получили, мы сохраняем их в дополнительные переменные sRealDisp и sRealDraw, т.к. они нам ещё понадобятся.

Итак, графика инициализирована. Можем приступать к работе.

  1. Перед выводом графики мы меняем поверхность, на которой будем рисовать
    По-умолчанию этой поверхностью является экранная поверхность. Но для наших целей она не подходит. Переключаем поверхность с помощью функции AhiDrawSurfDstSet:
    AhiDrawSurfDstSet(dCtx, sDraw, 0);
  2. Собственно, выводим графику
    Выводим графику. Не забываем устанавливать растровую операцию и цвет кисти:
    // Вспомогательная переменная для указания области экрана
    AHIRECT_T	rect;
    // Устанавливаем растровую операцию на применение кисти
    AhiDrawRopSet(dCtx, AHIROP3(AHIROP_PATCOPY));
    // Установим цвет кисти. Этим цветом будут выводиться наши графические примитивы
    AhiDrawBrushFgColorSet(dCtx, ATI_565RGB(0,0,255)); // Ярко-синий
    // Зададим прямоугольник на экране, который будет залит нашим цветом
    rect.x1 = 0;
    rect.y1 = 0;
    rect.x2 = 64;
    rect.y2 = 64;
    // Нарисуем прямоугольник rect
    AhiDrawSpans(dCtx, &rect, 1, 0);
  3. Заменяем экранную поверхность
    Графика выведена во внеэкранную поверхность, но теперь её нужно вывести на экран. Для этого мы меняем местами экранную и внеэкранную поверхности и устанавливаем sDraw экранной поверхностью, а sDisp - поверхностью для рисования:
    AHISURFACE_T	tSurface;
    // Установка поверхности для рисования
    AhiDrawSurfDstSet(dCtx, sDisp, 0);
    // Установка экранной поверхности
    AhiDispSurfSet(dCtx, sDraw, 0);
    // Изображение получено на экране
    // Меняем поверхности местами
    tSurface = sDisp;
    sDisp = sDraw;
    sDraw = tSurface;




На данный момент статья ещё не написана до конца. Если вам необходим пример предотвращения мерцания при выводе графики на дисплей, вы можете перейти по этой ссылке: Предотвращение мерцания