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

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

(Применение)
(Применение)
Строка 29:Строка 29:
  
 
// Установим цвет кисти. Этим цветом будут выводиться наши графические примитивы
 
// Установим цвет кисти. Этим цветом будут выводиться наши графические примитивы
AhiDrawBrushFgColorSet(devCx, ATI_565RGB(0,0,255)); // Ярко-синий
+
AhiDrawBrushFgColorSet(dCtx, ATI_565RGB(0,0,255)); // Ярко-синий
  
 
// Зададим прямоугольник на экране, который будет залит нашим цветом
 
// Зададим прямоугольник на экране, который будет залит нашим цветом
Строка 38:Строка 38:
  
 
// Нарисуем прямоугольник rect
 
// Нарисуем прямоугольник rect
AhiDrawSpans( dCtx, &rect, 1, 0);
+
AhiDrawSpans(dCtx, &rect, 1, 0);
 
</pre>
 
</pre>
 
</li>
 
</li>
Строка 45:Строка 45:
 
Графика выведена в память, но теперь её нужно вывести на экран. Для этого мы выставляем растровую операцию в <tt>'''AHIROP_SRCCOPY'''</tt>, устанавливаем поверхность-источник в '''sDraw''' (там у нас находится то, что мы уже вывели), а поверхность-приёмник в '''sDisp''' (экранная поверхность) и копируем изображение с помощью функции [[AhiDrawBitBlt]]:
 
Графика выведена в память, но теперь её нужно вывести на экран. Для этого мы выставляем растровую операцию в <tt>'''AHIROP_SRCCOPY'''</tt>, устанавливаем поверхность-источник в '''sDraw''' (там у нас находится то, что мы уже вывели), а поверхность-приёмник в '''sDisp''' (экранная поверхность) и копируем изображение с помощью функции [[AhiDrawBitBlt]]:
 
<pre>
 
<pre>
 +
// Левый верхний угол поверхности рисования
 +
AHIPOINT_T  zpoint = {0, 0};
 +
// Область вывода на поверхность экрана
 +
AHIRECT_T  zrect = {0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT};
 +
 
// Устанавливаем растровую операцию
 
// Устанавливаем растровую операцию
AhiDrawRopSet(hDC, AHIROP3(AHIROP_SRCCOPY));
+
AhiDrawRopSet(dCtx, AHIROP3(AHIROP_SRCCOPY));
  
 
// Устанавливаем поверхность-источник
 
// Устанавливаем поверхность-источник
AhiDrawSurfSrcSet(hDC, sDraw, 0);
+
AhiDrawSurfSrcSet(dCtx, sDraw, 0);
  
 
// Устанавливаем поверхность-приёмник
 
// Устанавливаем поверхность-приёмник
AhiDrawSurfDstSet(hDC, sDisp, 0);
+
AhiDrawSurfDstSet(dCtx, sDisp, 0);
  
 
// Копируем изображение
 
// Копируем изображение
AhiDrawBitBlt(hDC, &rect, &point);
+
AhiDrawBitBlt(dCtx, &zrect, &zpoint);
 
</pre>
 
</pre>
 
</li>
 
</li>

Версия 06:09, 8 июня 2010

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

Описание

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

Применение

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

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

  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. Переносим изображение из поверхности в видеопамяти на экран
    Графика выведена в память, но теперь её нужно вывести на экран. Для этого мы выставляем растровую операцию в AHIROP_SRCCOPY, устанавливаем поверхность-источник в sDraw (там у нас находится то, что мы уже вывели), а поверхность-приёмник в sDisp (экранная поверхность) и копируем изображение с помощью функции AhiDrawBitBlt:
    // Левый верхний угол поверхности рисования
    AHIPOINT_T zpoint = {0, 0};
    // Область вывода на поверхность экрана
    AHIRECT_T zrect = {0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT};
    // Устанавливаем растровую операцию
    AhiDrawRopSet(dCtx, AHIROP3(AHIROP_SRCCOPY));
    // Устанавливаем поверхность-источник
    AhiDrawSurfSrcSet(dCtx, sDraw, 0);
    // Устанавливаем поверхность-приёмник
    AhiDrawSurfDstSet(dCtx, sDisp, 0);
    // Копируем изображение
    AhiDrawBitBlt(dCtx, &zrect, &zpoint);

Изображение получено на экране.

См. также