Spec-Zone .ru
спецификации, руководства, описания, API
След: Премия
Урок: полноэкранный Монопольный API Режима
Двойная буферизация и Зеркальное отражение Страницы
Домашняя страница > Премия > Полноэкранный Монопольный API Режима

Двойная буферизация и Зеркальное отражение Страницы

Предположите, что необходимо нарисовать все изображение на экране, попиксельно или линию за линией. Если бы Вы должны были потянуть такую вещь непосредственно на экран (использующий, скажем, Graphics.drawLine), Вы, вероятно, заметили бы с большим разочарованием, что требуется немного времени. Вы, вероятно, даже заметите видимые артефакты того, как Ваше изображение рисуется. Вместо того, чтобы наблюдать вещи, оттягиваемые этим способом и в этом темпе, большинство программистов использует метод, названный двойной буферизацией.

Традиционное понятие двойной буферизации в приложениях Java является довольно прямым: создайте внеэкранное изображение, потяните к тому изображению, используя графический объект изображения, тогда, за один шаг, вызовите drawImage, используя графический объект целевого окна и внеэкранное изображение. Вы, возможно, уже заметили, что Swing использует этот метод во многих из его компонентов, обычно включаемых по умолчанию, используя метод setDoubleBuffered.

Экранная поверхность обычно упоминается как основная поверхность, и внеэкранное изображение, используемое для двойной буферизации, обычно упоминается как задний буфер. Действие копирования содержания от одной поверхности до другого часто упоминается как блочная передача строки, или блитирующий (blt обычно объявляется "копированием битового массива" и не должен быть перепутан с тестовой системой BLT).

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

Основной поверхностью обычно управляют через графический объект любого компонента показа; когда в полноэкранном режиме, любая работа, используя графику полноэкранного окна является непосредственным управлением памятью для хранения содержимого экрана. Поэтому можно использовать в своих интересах другие возможности в полноэкранном монопольном режиме, который может иначе быть недоступным из-за издержек системы управления окнами. Один такой метод, который только доступен в полноэкранном монопольном режиме, является формой двойной буферизации, названной зеркальным отражением страницы.

Зеркальное отражение страницы

У многих видеокарт есть понятие видео указателя, который является просто адресом в видеопамяти. Этот указатель говорит видеокарту, где искать содержание видео, которое будет выведено на экран во время следующего цикла обновления. В некоторых видеокартах и на некоторых операционных системах, этим указателем можно даже управлять программно. Предположите, что Вы создали задний буфер (в видеопамяти) точного width, height, и битовой глубины экрана, затем потянули к тому буферу тот же самый путь, как Вы будете, используя двойную буферизацию. Теперь вообразите то, что произошло бы, если бы, вместо того, чтобы блитировать Ваше изображение на экран как в двойной буферизации, Вы просто изменили видео указатель на свой задний буфер. Во время следующего обновления видеокарта теперь использовала бы Ваше изображение, чтобы вывести на экран. Этот переключатель вызывают зеркальным отражением страницы, и увеличение производительности по blt-на-основе двойной буферизации - то, что только единственный указатель должен быть перемещен в память в противоположность копированию всего содержания от одного буфера до другого.

Когда зеркальное отражение страницы происходит, указатель на старый задний буфер теперь указывает на основную поверхность, и указатель на старую основную поверхность теперь указывает на заднюю буферную память. Это устанавливает Вас автоматически для следующей работы ничьей.

Зеркальное отражение страницы

Иногда выгодно установить многократные задние буферы в зеркально отраженной цепочке. Это особенно полезно, когда потраченный рисунок количества времени больше чем частота обновления монитора. Зеркально отраженная цепочка просто два или больше назад буферы (иногда названа посредническими буферами) плюс основная поверхность (это иногда вызывают тройной буферизацией, буферизацией тетрады, и т.д.). В зеркально отраженной цепочке следующий доступный задний буфер становится основной поверхностью, и т.д., полностью вниз к последнему заднему буферу, который используется для рисования.

Преимущества Двойной буферизации и Зеркального отражения страницы

Если Ваша метрика производительности является просто скоростью, на которой двойная буферизация или зеркальное отражение страницы происходят против прямого рендеринга, Вы можете быть разочарованы. Можно найти, что Ваши числа для прямого рендеринга далеко превышают тех для двойной буферизации и что те числа далеко превышают тех для зеркального отражения страницы. Каждый из этих методов для используемого для того, чтобы улучшить воспринятую производительность, которая намного более важна в графических приложениях чем числовая производительность.

Двойная буферизация используется прежде всего, чтобы устранить видимые ничьи, которые могут подать заявку выглядеть дилетантской, вялой, или, казаться, мерцать. Зеркальное отражение страницы используется прежде всего, чтобы также устранить разрывание, эффект разделения, который происходит при рисовании с экраном, происходит быстрее чем частота обновления монитора. Более гладкий рисунок означает лучше воспринятую производительность и намного лучший пользовательский опыт.


Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Пассивный по сравнению с Активным Рендерингом
Следующая страница: BufferStrategy и BufferCapabilities