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

Изменения

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

1706 байт добавлено, 16:52, 12 июня 2010
Ссылка вику и подкорректировал определение
Двойная буферизация ({{lang-en|Double Buffering}}) — метод вывода графики на экран через драйвер, который применяется для предотвращения эффекта "мерцания"в приложениях, активно использующих вывод графики через [[AHI|драйвер дисплея]] в полноэкранном режиме. Используется как метод повышения производительности за счет избыточного использования [[видеопамяти]].
== Описание ==
== Применение ==
Перед началом вывода графики необходимо чтобы у нас был [[AHI#Контекст устройства|контекст устройства]] ('''dCtx'''), на которое будем выводить графику и две [[AHI#Поверхности|поверхности]] - экранная поверхность ('''sDisp''') и внеэкранная поверхность ('''sDraw'''). Если у нас их нет - смотрим [[AHI#Инициализация|здесь]] как их получить. Как только их получилиполучены поверхности, мы сохраняем их в дополнительные переменные '''sRealDisp''' и '''sRealDraw''', т.к. они нам ещё понадобятся.
Итак, графика инициализирована. Можем приступать к работе.
<li>'''Заменяем экранную поверхность'''<br>
Графика выведена во внеэкранную поверхность, но теперь её нужно вывести на экран. Для этого мы меняем местами экранную и внеэкранную поверхности и устанавливаем '''sDraw''' экранной поверхностью, а '''sDisp''' - поверхностью для рисованияи меняем местами значения переменных '''sDisp''' и '''sDraw''':
<pre>
AHISURFACE_T tSurface;
// Установка экранной поверхности
AhiDispSurfSet(dCtx, sDraw, 0);
// Установка поверхности для рисования
AhiDrawSurfDstSet(dCtx, sDisp, 0);
// Установка экранной поверхности
AhiDispSurfSet(dCtx, sDraw, 0);
// Изображение получено на экране
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
правки