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

Изменения

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

5041 байт добавлено, 16:52, 12 июня 2010
Ссылка вику и подкорректировал определение
Двойная буферизация ({{lang-en|Double Buffering}}) — метод вывода графики на экран через драйвер, который применяется для предотвращения эффекта "мерцания"в приложениях, активно использующих вывод графики через [[AHI|драйвер дисплея]] в полноэкранном режиме. Используется как метод повышения производительности за счет избыточного использования [[видеопамяти]].
== Описание ==
При использовании метода "двойной буферизации", графика сначала выводится во вторичный буфер (в данном случае на [[AHI#Поверхности|поверхность]]), а затем первичный буфер подменяется на вторичный.
== Применение ==
Перед началом вывода графики необходимо чтобы у нас был [[AHI#Контекст устройства|контекст устройства]] ('''dCtx'''), на которое будем выводить графику и две [[AHI#Поверхности|поверхности]] - экранная поверхность ('''sDisp''') и внеэкранная поверхность ('''sDraw'''). Если у нас их нет - смотрим [[AHI#Инициализация|здесь]] как их получить. Как только получены поверхности, мы сохраняем их в дополнительные переменные '''sRealDisp''' и '''sRealDraw''', т.к. они нам ещё понадобятся.
На данный момент статья ещё Итак, графика инициализирована. Можем приступать к работе. <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(dCtx, ATI_565RGB(0,0,255)); // Ярко-синий // Зададим прямоугольник на экране, который будет залит нашим цветомrect.x1 = 0;rect.y1 = 0;rect.x2 = 64;rect.y2 = 64; // Нарисуем прямоугольник rectAhiDrawSpans(dCtx, &rect, 1, 0);</pre></li> <li>'''Заменяем экранную поверхность'''<br>Графика выведена во внеэкранную поверхность, но теперь её нужно вывести на экран. Для этого мы устанавливаем '''sDraw''' экранной поверхностью, а '''sDisp''' - поверхностью для рисования и меняем местами значения переменных '''sDisp''' и '''sDraw''':<pre>AHISURFACE_T tSurface; // Установка экранной поверхностиAhiDispSurfSet(dCtx, sDraw, 0);// Установка поверхности для рисованияAhiDrawSurfDstSet(dCtx, sDisp, 0); // Изображение получено на экране // Меняем поверхности местамиtSurface = sDisp;sDisp = sDraw;sDraw = tSurface;</pre> Далее повторяем все действия с первого пункта, пока необходимо выводить графику</li> <li>'''Возвращаем значения sDisp и sDraw'''<br>Перед выходом из эльфа '''ОБЯЗАТЕЛЬНО''' необходимо вернуть их значения, которые были выданы телефоном. Т.к. не написана до концаизвестно, в какой из двух переменных ('''sDisp''' или '''sDraw''') находится реальная экранная поверхность, мы воспользуемся переменными '''sRealDisp''' и '''sRealDraw''', о которых говорилось в самом начале. Если вам необходим пример <pre>// Установка экранной поверхностиAhiDispSurfSet(dCtx, sRealDisp, 0);// Установка поверхности для рисованияAhiDrawSurfDstSet(dCtx, sRealDraw, 0);</pre> И только тогда выходим из эльфа.</li> </ol> == См. также == * [[AHI]] - драйвер для чипов ATI* [[LdrDisplayCbkReg]] - функция для создания callback'ов для рисования поверх [[UIS]]* [[LdrDisplayCbkUnReg]] - функция для удаления callback'ов, созданных с помощью [[LdrDisplayCbkReg]]* [[Предотвращение мерцания]] - Классический метод предотвращения мерцания при выводе графики на дисплей, вы можете перейти по этой ссылке == Ссылки ==[http://ru.wikipedia.org/wiki/Двойная_буферизация Wikipedia(RU): Двойная буферизация]  [[Предотвращение мерцанияКатегория:Эльфостроение]]
84
правки