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

Предотвращение мерцания: различия между версиями

м
 
Строка 3:Строка 3:
 
== Описание ==
 
== Описание ==
  
При использовании метода "двойной буферизации", изображение сначала выводится во вторичный буфер (в данном случае на [[AHI#Поверхности|поверхность]] в [[Видеопамять|видеопамяти]]), а затем проецируется из [[Видеопамять|видеопамяти]] на дисплей.
+
При использовании метода "двойной буферизации", графика сначала выводится во вторичный буфер (в данном случае на [[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). Если у нас их нет - смотрим здесь как их получить.

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

  1. Перед выводом графики мы меняем поверхность, на которой будем рисовать
    По-умолчанию этой поверхностью является экранная поверхность. Но для наших целей она не подходит. Переключаем поверхность вывода с помощью функции AhiDrawSurfDstSet:
    AhiDrawSurfDstSet(dCtx, sDraw, 0);
  2. Собственно, выводим графику
    Выводим графику. Не забываем устанавливать растровую операцию и цвет кисти:
    // Вспомогательная переменная для указания области экрана
    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);
  3. Переносим изображение из поверхности в видеопамяти на экран
    Графика выведена в память, но теперь её нужно вывести на экран. Для этого мы выставляем растровую операцию в AHIROP_SRCCOPY, устанавливаем поверхность-источник в sDraw (там у нас находится то, что мы уже вывели), а поверхность-приёмник в sDisp (экранная поверхность) и копируем изображение с помощью функции AhiDrawBitBlt:
    // Устанавливаем растровую операцию
    AhiDrawRopSet(hDC, AHIROP3(AHIROP_SRCCOPY));
    // Устанавливаем поверхность-источник
    AhiDrawSurfSrcSet(hDC, sDraw, 0);
    // Устанавливаем поверхность-приёмник
    AhiDrawSurfDstSet(hDC, sDisp, 0);
    // Копируем изображение
    AhiDrawBitBlt(hDC, &rect, &point);