В информатике множественная буферизация — это использование более одного буфера для хранения блока данных , так что « читатель » увидит полную (хотя , возможно, и старую) версию данных вместо частично обновленной версии данных, создаваемой «писателем » . Это очень часто используется для компьютерных изображений. Это также используется, чтобы избежать необходимости использовать двухпортовую оперативную память (DPRAM), когда читатели и писатели — разные устройства.
Сеть Петри на рисунке демонстрирует двойную буферизацию. Переходы W1 и W2 представляют запись в буфер 1 и 2 соответственно, а R1 и R2 представляют чтение из буфера 1 и 2 соответственно. В начале включен только переход W1. После срабатывания W1 включены оба перехода R1 и W2, которые могут работать параллельно. Когда они заканчивают работу, R2 и W1 работают параллельно и так далее.
После начального переходного процесса, когда W1 срабатывает один, эта система становится периодической, и переходы включаются – всегда парами (R1 с W2 и R2 с W1 соответственно).
В компьютерной графике двойная буферизация — это метод рисования графики, при котором наблюдается меньше рывков, разрывов и других артефактов.
Программе сложно нарисовать дисплей так, чтобы пиксели не менялись более одного раза. Например, при обновлении страницы текста гораздо проще очистить всю страницу, а затем нарисовать буквы, чем каким-то образом стирать только пиксели, которые используются в старых буквах, но не в новых. Однако это промежуточное изображение воспринимается пользователем как мерцание . Кроме того, компьютерные мониторы постоянно перерисовывают видимую видеостраницу (традиционно около 60 раз в секунду), поэтому даже идеальное обновление может быть видно на мгновение как горизонтальный разделитель между «новым» изображением и неперерисованным «старым» изображением, что известно как разрыв .
Программная реализация двойной буферизации заставляет все операции рисования сохранять свои результаты в некоторой области системной оперативной памяти ; любая такая область часто называется «задним буфером». Когда все операции рисования считаются завершенными, вся область (или только измененная часть) копируется в видеопамять ( «передний буфер»); это копирование обычно синхронизируется с растровым лучом монитора , чтобы избежать разрывов. Программные реализации двойной буферизации обязательно требуют больше памяти и процессорного времени, чем одинарная буферизация, из-за системной памяти, выделенной для заднего буфера, времени на операцию копирования и времени ожидания синхронизации.
Композитные оконные менеджеры часто объединяют операцию «копирования» с « композицией », используемой для позиционирования окон, их трансформации с помощью эффектов масштабирования или деформации и создания прозрачных частей. Таким образом, «передний буфер» может содержать только составное изображение, видимое на экране, в то время как для каждого окна существует свой «задний буфер», содержащий несоставное изображение всего содержимого окна.
В методе переворота страницы вместо копирования данных оба буфера могут быть отображены. В любой момент времени один буфер активно отображается монитором, в то время как другой, фоновый буфер, отрисовывается. Когда фоновый буфер заполнен, роли этих двух буферов меняются. Переворот страницы обычно выполняется путем изменения аппаратного регистра в контроллере видеодисплея — значения указателя на начало отображаемых данных в видеопамяти.
Перелистывание страниц происходит намного быстрее, чем копирование данных, и может гарантировать, что разрывы не будут видны, пока страницы переключаются во время вертикального интервала гашения монитора — периода гашения, когда видеоданные не отрисовываются. Текущий активный и видимый буфер называется передним буфером , тогда как фоновая страница называется задним буфером .
В компьютерной графике тройная буферизация похожа на двойную буферизацию, но может обеспечить улучшенную производительность. При двойной буферизации программа должна ждать, пока законченный рисунок не будет скопирован или заменен, прежде чем начинать следующий рисунок. Этот период ожидания может составлять несколько миллисекунд , в течение которых ни один буфер не может быть затронут.
При тройной буферизации программа имеет два задних буфера и может немедленно начать рисовать в том, который не участвует в таком копировании. Третий буфер, передний буфер, считывается графической картой для отображения изображения на мониторе. После того, как изображение было отправлено на монитор, передний буфер переворачивается с задним буфером (или копируется с него), содержащим самое последнее полное изображение. Поскольку один из задних буферов всегда заполнен, графической карте никогда не приходится ждать завершения работы программного обеспечения. Следовательно, программное обеспечение и графическая карта полностью независимы и могут работать в своем собственном темпе. Наконец, отображаемое изображение было запущено без ожидания синхронизации и, таким образом, с минимальной задержкой. [1]
Из-за того, что программный алгоритм не опрашивает графическое оборудование на предмет событий обновления монитора, алгоритм может непрерывно рисовать дополнительные кадры так быстро, как оборудование может их визуализировать. Для кадров, которые завершаются намного быстрее, чем интервал между обновлениями, можно заменить кадры заднего буфера более новыми итерациями несколько раз перед копированием. Это означает, что кадры могут быть записаны в задний буфер, которые вообще никогда не используются, прежде чем будут перезаписаны последовательными кадрами. Nvidia реализовала этот метод под названием «Быстрая синхронизация». [2]
Альтернативный метод, иногда называемый тройной буферизацией, представляет собой цепочку обмена длиной в три буфера. После того, как программа нарисовала оба обратных буфера, она ждет, пока первый из них не будет помещен на экран, прежде чем нарисовать еще один обратный буфер (т. е. это очередь длиной в 3 буфера типа « первый пришел, первый вышел »). Большинство игр Windows, похоже, ссылаются на этот метод при включении тройной буферизации. [ необходима цитата ]
Термин «четырехкратная буферизация» означает использование двойной буферизации для каждого из изображений левого и правого глаза в стереоскопических реализациях, таким образом, всего четыре буфера (если бы использовалась тройная буферизация, то буферов было бы шесть ). Команда на замену или копирование буфера обычно применяется к обеим парам одновременно, поэтому ни в какой момент один глаз не видит более старое изображение, чем другой.
Для четырехкратной буферизации требуется специальная поддержка в драйверах видеокарт, которая отключена для большинства потребительских карт. Видеокарты AMD Radeon HD 6000 Series и более новые поддерживают ее. [3]
Стандарты 3D, такие как OpenGL [4] и Direct3D, поддерживают четырехкратную буферизацию.
Термин «двойная буферизация» используется для копирования данных между двумя буферами для передачи данных с прямым доступом к памяти (DMA), не для повышения производительности, а для соответствия определенным требованиям адресации устройства (особенно 32-битных устройств в системах с более широкой адресацией, предоставляемой через Physical Address Extension ). [5] Драйверы устройств DOS и Windows — это место, где, скорее всего, будет использоваться термин «двойная буферизация». Исходный код Linux и BSD называет их «буферами отскока». [6]
Некоторые программисты пытаются избежать такого рода двойной буферизации с помощью методов нулевого копирования .
Двойная буферизация также используется как метод, облегчающий чересстрочную развертку или деинтерлейсинг видеосигналов.