Множественная буферизация - Multiple buffering

Наборы 1, 2 и 3 представляют собой операции одинарной, двойной и тройной буферизации соответственно с вертикальная синхронизация (vsync) включен. На каждом графике время течет слева направо. Обратите внимание, что 3 показывает цепочка обмена с тремя буферами; исходное определение тройной буферизации отбрасывает кадр C, как только кадр D завершается, и начинает рисовать кадр E в буфер 1 без задержки. Набор 4 показывает, что происходит, когда для рисования кадра (в данном случае B) требуется больше времени, чем обычно. В этом случае обновление кадра пропускается. В чувствительных ко времени реализациях, таких как воспроизведение видео, весь кадр может быть пропущен. С цепочкой подкачки из трех буферов в комплекте 5отрисовка кадра B может начаться, не дожидаясь, пока кадр A будет скопирован в видеопамять, что снижает вероятность того, что задержанный кадр пропустит обратный ход по вертикали.

В Информатика, множественная буферизация использование более чем одного буфер для хранения блока данных, чтобы «читатель» увидел полную (хотя, возможно, старую) версию данных, а не частично обновленную версию данных, созданную "писатель". Он также используется, чтобы избежать необходимости использовать двухпортовая RAM (DPRAM), когда читатели и писатели - разные устройства.

Описание

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

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

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

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

Сеть Петри с двойной буферизацией

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

В Сеть Петри на иллюстрации показано, как работает двойная буферизация. Переходы W1 и W2 представляют собой запись в буфер 1 и 2 соответственно, в то время как R1 и R2 представляют чтение из буфера 1 и 2 соответственно. Вначале включен только переход W1. После срабатывания W1 оба R1 и W2 включаются и могут работать параллельно. Когда они заканчивают, R2 и W1 продолжаются параллельно и так далее.

Таким образом, после начального переходного процесса, когда срабатывает только W1, эта система является периодической, и переходы разрешены - всегда попарно (R1 с W2 и R2 с W1 соответственно).

Двойная буферизация в компьютерной графике

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

Программе сложно нарисовать дисплей так, чтобы пиксели не менялись более одного раза. Например, при обновлении страницы текста намного проще очистить всю страницу и затем нарисовать буквы, чем каким-то образом стереть только пиксели, которые используются в старых буквах, но не в новых. Однако это промежуточное изображение воспринимается пользователем как мерцание. Кроме того, компьютерные мониторы постоянно перерисовывать видимую страницу видео (обычно около 60 раз в секунду), поэтому даже идеальное обновление может быть видно на мгновение как горизонтальный разделитель между «новым» изображением и неперерисованным «старым» изображением, известным как разрывание.

Программная двойная буферизация

В программной реализации двойной буферизации все операции рисования сохраняют свои результаты в некоторой области системы. баран; любую такую ​​область часто называют «обратным буфером». Когда все операции рисования считаются завершенными, вся область (или только измененная часть) копируется в видео RAM («передний буфер»); это копирование обычно синхронизируется с монитором растр балка во избежание разрывов. Программные реализации двойной буферизации обязательно требуют больше памяти и процессорного времени, чем одинарная буферизация, из-за системной памяти, выделенной для заднего буфера, времени для операции копирования и времени ожидания синхронизации.

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

Листание страницы

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

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

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

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

При тройной буферизации программа имеет два обратных буфера и может сразу начать отрисовку в том, который не участвует в таком копировании. Третий буфер, передний буфер, считывается видеокартой для отображения изображения на мониторе. После того, как изображение отправлено на монитор, передний буфер переворачивается (или копируется из) заднего буфера, содержащего самое последнее полное изображение. Поскольку один из задних буферов всегда заполнен, видеокарте никогда не приходится ждать завершения работы программного обеспечения. Следовательно, программное обеспечение и видеокарта полностью независимы и могут работать в своем собственном темпе. Наконец, отображаемое изображение было запущено без ожидания синхронизации и, следовательно, с минимальной задержкой.[1]

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

Альтернативный метод, иногда называемый тройной буферизацией, - это цепочка обмена три буфера длиной. После того, как программа отрисовывает оба обратных буфера, она ждет, пока первый не будет помещен на экран, прежде чем рисовать другой обратный буфер (т.е. это трехкратный буфер). первым пришел-первым вышел очередь). Большинство игр для Windows используют этот метод при включении тройной буферизации.[нужна цитата ]

Четырехкратная буферизация

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

Четырехъядерная буферизация требует специальной поддержки в драйверах видеокарты, которая отключена для большинства потребительских карт. AMD Radeon HD 6000 Series и более новые поддерживают его [1].

Стандарты 3D, такие как OpenGL[3] и Direct3D поддержка четырехъядерной буферизации.

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

Период, термин двойная буферизация используется для копирования данных между двумя буферами для прямой доступ к памяти (DMA) переводы, нет для повышения производительности, но для удовлетворения конкретных требований к адресации устройства (особенно 32-разрядных устройств в системах с более широкой адресацией, предоставляемой через Расширение физического адреса ).[4] ДОС и Windows драйверы устройств это место, где, вероятно, будет использоваться термин «двойная буферизация». Исходный код Linux и BSD называет их «буферами отказов».[5]

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

Другое использование

Двойная буферизация также используется для облегчения переплетение или же деинтерлейсинг видеосигналов.

Смотрите также

Рекомендации

  1. ^ «Тройная буферизация: почему нам это нравится». AnandTech. 26 июня 2009 г.. Получено 2009-07-16.
  2. ^ Смит, Райан. «Обзор NVIDIA GeForce GTX 1080 и GTX 1070 Founders Editions: начало поколения FinFET». Получено 2017-08-01.
  3. ^ Спецификация OpenGL 3.0, глава 4
  4. ^ «Расширение физического адреса - память PAE и Windows». Центр разработки оборудования Microsoft Windows. 2005 г.. Получено 2008-04-07.
  5. ^ Горман, Мел. «Общие сведения о диспетчере виртуальной памяти Linux, буферы отказов 10.4».

внешняя ссылка