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

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

Переворачивание страницы [ править ]

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

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

Тройная буферизация [ править ]

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

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

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

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

Квадратная буферизация [ править ]

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

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

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

Двойная буферизация для DMA[ редактировать ]

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

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

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

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

См. Также [ править ]

  • Цепочка обмена
  • Вертикальная синхронизация
  • Стереоскопия
  • Очки LC с затвором
  • Nvidia 3D Vision
  • HD3D
  • Виртуальные службы DMA (VDS)

Ссылки [ править ]

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

Внешние ссылки [ править ]

  • Тройная буферизация: улучшите производительность вашего ПК в играх бесплатно , Майк Дулиттл (2007-05-24)
  • http://www.tweakguides.com/Graphics_10.html