Тройная буферизация — что это такое?
- – Автор: Игорь (Администратор)
В рамках данного обзора, я расскажу вам что такое тройная буферизация, а так же про связанные с этим особенности.
Суть проблемы. При формировании изображения, оптимальным считается, что вначале вся область заменяется фоном (например, белым цветом или некой картинкой), а уже затем на нее наносятся отдельные фрагменты. Если же используется один буфер, с которого считывает и в который записываются данные, то вполне возможно возникновение таких проблем, как мерцание экрана или его отдельных элементов, появление разрывов (верхняя часть картинки из текущей, нижняя часть из старой) и прочих дефектов.
Одним из решений подобной проблемы, является двойная и тройная буферизация. Что это такое и зачем нужно, а так же как связано с вертикальной синхронизацией V-Sync, рассмотрим далее.
Тройная и двойная буферизация
Двойная буферизация
Двойная буферизация — это такой метод, который позволяет обеспечивать одновременную передачу готового результата и формирование следующего.
Как устроена двойная буферизация в компьютерной графике? Стоит отметить, что существует два варианта, оба из которых решают проблему мерцания и некоторых иных дефектов, но не решают проблему разрыва картинки. Первый, это когда изображение вначале формируется в оперативной памяти компьютера, а затем копируется в буфер монитора (из которого последний считывает и отображает картинку на экране). Второй, это когда видеокарта исходно поддерживает два буфера, которые она меняет без копирования данных, что существенно быстрее. В этом случаем, реже возникают разрывы.
Стоит знать, что под первичным буфером подразу
Какую проблему решает двойная или тройная буферизация в современных играх?
По сути, основная цель рендеринга состоит в том, чтобы каждый кадр, отображаемый на мониторе, представлял одно связное изображение. Существует несколько различных стратегий, которые использовались или использовались для достижения этой цели.
Далее я упоминаю «vsync». Vsync — это момент, когда монитор начинает рисовать новое изображение на экране; это точка, в которой «vblank» начинается на традиционном экране ЭЛТ, где линия сканирования на мгновение прекращает рисовать и возвращается к верхней части монитора. Этот момент очень важен для многих подходов к согласованности кадров.
«Разрыв» — это то, что мы называем этим, когда экран визуализируется из двух разных изображений в одном кадре. Если, например, я нарисовал два изображения экрана, которые должны отображаться одно за другим, но монитор вместо этого отобразил верхнюю половину первого кадра и нижнюю половину второго кадра, это «разрыв». Это происходит из-за изменения данных, которые считывает монитор во время рисования, а не во время vblank. (В современных программах это обычно происходит потому, что пользователь отключил ожидание vsync в своих настройках драйвера)
Zero-Buffer
На самом старом оборудовании часто не хватало памяти для размещения полноэкранного изображения, и поэтому вместо рисования изображения на экране вам нужно было указывать цвета для каждой линии сканирования отдельно, пока монитор находился в процессе рисования этой линии. Например, на Atari 2600 у вас было всего 76 циклов машинных инструкций, чтобы указать, какой цвет вошел в каждый пиксель линии развертки, прежде чем телевизор начал фактически рисовать эту линию развертки. И затем у вас было 76 циклов инструкций для предоставления содержимого для следующей
Single-Buffer
Рисуя в контексте «одного буфера», вы рисуете прямо в VRAM, которая читается монитором. При таком подходе вы «гоняете по сканлайну». Общая идея заключается в том, что когда сканлайн начинает рисовать содержимое предыдущего кадра в верхней части экрана, вы рисуете в VRAM за ним. Таким образом, пока линия сканирования рисует изображение экрана для последнего кадра, вы рисуете следующий кадр за линией сканирования.
В общем, вы пытаетесь закончить рисование изображения следующего кадра до того, как отсканирует вас линия сканирования, снова обойдя и обогнав пиксели, которые вы рисуете, а также чтобы никогда не опередить линию развертки или ваш новый кадр может нарисовать то, что должно было быть в предыдущем кадре.
По этой причине рендеринг в одном буфере, как правило, выполнялся путем рисования линий развертки сверху вниз и слева направо. Если вы нарисовали в каком-то другом порядке, вполне вероятно, что линия сканирования снова обернется и обнаружит фрагменты «следующего» изображения, которое вы еще не успели нарисовать.
Обратите внимание, что в современных операционных системах вы, как правило, никогда не имеете возможности рисовать с одиночной буферизацией, хотя это было довольно распространенным явлением тридцать лет назад. (черт возьми, я чувствую себя старым прямо сейчас — это то, чем я занимался, когда только начинал в разработке игр)
Дважды Buffer
Это намного, намного проще, чем любая из ранее разработанных стратегий.
В системе с двойной буферизацией у нас достаточно памяти для хранения двух разных изображений на экране, поэтому мы обозначаем одно из них как «передний буфер», а другое — «задний буфер». «Передний буфер» — это то, что отображается в данный момент, а «задний буфер» — то, где мы в данный момент рисуем.
После того, как мы закончили рисовать изображение экрана в заднем буфере, мы ждем до vsync, а затем поменяем местами два буфера. Таким образом, задний буфер становится передним буфером, и наоборот, и весь обмен произошел, когда монитор ничего не рисовал.
Одна проблема, часто возникающая при подходах с двойным буфером, заключается в том, что после того, как мы завершим рисование в задний буфер, нам нужно просто сидеть и ждать vsync, прежде чем мы сможем поменять местами буферы и продолжить работу; мы могли бы делать вычисления в течение этого времени! Более того, все время, пока мы ожидаем переключения между буферами, изображение в этом заднем буфере стареет и стареет, что увеличивает задержку, воспринимаемую пользователем.
В системах с тремя буферами мы создаем себе три буфера — один фронтальный буфер и два обратных буфера. Идея заключается в следующем:
Монитор отображает передний буфер, и мы рисуем в задний буфер # 1. Если мы закончим рисование в заднем буфере # 1 до того, как монитор завершит рисование переднего буфера, то вместо ожидания vsync мы немедленно начнем рисовать следующий кадр в задний буфер # 2. Если мы закончим, а vsync все еще не пришел, мы начнем рисовать обратно в задний буфер # 1 и так далее. Идея состоит в том, что когда vsync в конечном итоге произойдет, один или другой из наших обратных буферов будет завершен, и этот можно заменить на передний буфер.
Преимущество тройной буферизации состоит в том, что мы не теряем время, потраченное на ожидание vsync в подходе с двойной буферизацией, и изображение, помещенное в передний буфер, может быть «свежее», чем то, которое ожидало vsync для 8ms. Недостатком тройной буферизации является то, что нам нужна дополнительная память для хранения дополнительного изображения экрана, и что наше использование процессора / графического процессора будет выше (опять же, поскольку мы не замедляем ожидание vsync).
Как правило, современные драйверы часто выполняют тройную буферизацию прозрачно, за кадром. Вы пишете свой код для двойной буферизации, и драйвер фактически рано возвращает вам управление, и просто выполняет внутреннюю обработку переключения между любым количеством обратных буферов, которые он хочет использовать, даже если ваш код никогда не узнает об этом.
В настоящее время производители графических процессоров рекомендуют вам не реализовывать тройную буферизацию самостоятельно — драйвер сделает это автоматически.
Тройная буферизация OpenGl AMD что это такое — включать или нет? (Triple Buffering, tripleBuffering)
Тройная буферизация OpenGl AMD (Triple Buffering, tripleBuffering) — буферизация из трех уровней (буферов), в каждом формируются данные, которые потом используются программой без ожидания. В интернете много информации на эту тему, и я должен признать, даже мне было сложно понять с первого раза.
Суть проста — подготовка графических данных заранее. Включать при использовании VSync.
VSync — вертикальная синхронизация кадровой частоты в игре с частой развертки монитора. Результат — максимальный ФПС приравнивается к частоте монитора.
Принцип работы
В общих чертах примерно так:
- Процессор сообщает видеокарте данные для создания картинки.
- Видеокарта подготовила картинку и отобразила на мониторе.
- Монитор отображает эту картинку 60 раз в секунду — стандартная частота для ЖК-мониторов.
- Далее процессор посылает снова видеокарте данные для картинки — видеокарта готовит картинку. Но показ текущей картинки на мониторе еще не завершен.
- Процессор, видеокарта — ожидают завершения показа.
- При включенной буферизации ожидания не будет — процессор будет посылать команды, видеокарта создавать изображение.
- Пока идет показ, последующие изображения будут помещаться в специальную область (буфер).
- При завершении показа, следующая картинка будет извлекаться без ожидания из буфера. Таких буферов по умолчанию существует два и они всегда работают — процесс называется двойной буферизацией. Тройная буферизация ускоряет процесс, так как используется третий буфер, система работает по аналогии двойной буферизации.
Самое главное, что стоит понимать — 1 секунда для нас это мгновенье. Для процессора/видеокарты — значительное время. Именно поэтому в программировании если нужно поставить паузы, то использую как единицу не секунды, а миллисекунды.
Опция в программе AMD Radeon Settings:
Пример #2:
Включать или нет?
Включать необходимо в случае использования VSync в играх. При использовании VSync качество картинки повышается за счет удаления так называемого разрыва изображения, из-за этого может проседать ФПС. Результат — позволяет снизить к минимуму задержки в подготовки данных видеокартой. Особенно касается топовых процессоров/видеокарт.
Тройная буферизация доступна только в OpenGL, для активации в Direct3D играх можно воспользоваться программой RivaTuner.
RivaTuner предназначена для тонкой настройки видеокарт NVIDIA. Присутствуют недокументированные функции драйверов Detonator всех версий, низкоуровневый разгон GPU, исправление рефреша, модуль диагностики.
В обычных условиях тройная буферизация дает повышение производительности, уменьшение количества микрофризов.
Если данный тип буферизации плохо влияет на игру — возможно дело в драйверах. Можно попробовать поставить другие драйвера, предыдущие. Совет — перед установкой сделайте точку восстановления. Если вы недавно устанавливали драйвера, тогда сделайте наоборот — попробуйте восстановить состояние ПК до установки новой версии.
Тройная буферизация и WorldOfTanks
Информация была актуальна на 2014 год для WoT 9.0.
Перед внесением правок рекомендуется создать точку восстановления!
Данная информация не претендует на полезную, однако, в некоторых глюках/лагах возможно станет полезной.
Для лучшей производительности в WorldOfTanks также необходимо задать параметру triplebuffering значение false (то есть отключить). Особенно это касается не очень производительных ПК.
За буферизацию отвечает параметр tripleBuffering в конфигурационном файле:
- При включенной вертикальной синхронизации — тройную буферизацию необходимо включить. Задать в tripleBuffering = true.
- При отключенной — выключить. tripleBuffering = false.
Мини-инструкция:
- Открываем папку:
C:\Users\USER_NAME\AppData\Roaming\wargaming.net\WorldOfTanks\
USER_NAME — имя вашей учетной записи.
- Находим файл preferences.xml.
- Открываем в блокноте, лучше в редакторе Notepad++.
- Находим параметр tripleBuffering (секция).
- Изменяем значение, пример:
- Сохраняем изменения.
Дополнительно
Название | Описание |
---|---|
Flip Queue Size | Количество заранее подготавливающихся кадров. Включение может снизить/исключить провалы ФПС. Рекомендуемое значение — 2. При наличии многоядерного процессора значение 0 может снизить производительность. |
Anisotropic/Trilinear Filtering Optimizations | Оптимизация анизотропной и трилинейной фильтрации. Включение повысит скорость, снижение качества картинки вы вряд ли заметите. Актуально для топовых моделей видеокарт. |
Адаптивное сглаживание | Сглаживание обьекта (anti-aliasing) происходит не полностью, а только по краям. Эффект достигается использованием сильных сторон мультисемплинга (MSAA) и суперсемплинга (SSAA). |
Поддержка сжатия DXT | Сжатие текстур без потерь в целях экономии пропускной способности. Рекомендуется включать. |
Заключение
- Суть — подготовка данных для будущего изображения, во время показа текущего.
- Тройная буферизация OpenGl от AMD необходимо использовать при включенной VSync.
- Производительность игры должна возрасти. Особенно на топовых ПК.
Тройная буферизация — это… Что такое Тройная буферизация?
Тройная буферизация в компьютерной графике — разновидность двойной буферизации; метод вывода изображения, позволяющий избежать или уменьшить количество артефактов.
Тройная буферизация позволяет увеличить скорость вывода изображения по сравнению с двойной буферизацией. В реальных приложениях это часто связано с попыткой абстрагировать операции формирования графики от синхронизации с частотой обновления монитора. Как правило, кадры рисуются с частотой ниже или выше частоты обновления экрана (с переменной частотой кадров) без обычных эффектов, которые это могло вызвать (а именно: мерцание, сдвиги, разрывы). Так как программе не требуется опрашивать оборудование для получения событий обновления экрана, алгоритм может свободно выполняться максимально быстро. Это не единственный доступный метод тройной буферизации, но преобладающий на архитектуре ПК, где скорость машины может сильно различаться.
Другой метод тройной буферизации включает в себя синхронизацию с частотой обновления экрана, используя третий буфер просто как способ предоставить свободное пространство для запросов на изменения в общем объёме выводимой графики. Здесь буфер используется в истинном смысле, когда он действует как хранилище. Такой метод предъявляет повышенные минимальные требования к аппаратному обеспечению, но обеспечивает согласованную (по сравнению с переменной) частоту кадров.
Тройная буферизация предполагает использование трёх буферов, но метод может быть расширен на любое количество буферов, нужное приложению. Обычно использование четырёх и более буферов не даёт каких-либо преимуществ.
Недостатки двойной буферизации
Если в системе есть два буфера: А и Б, она может отображать буфер Б, одновременно формируя новое изображение в буфере А. Когда изображение в буфере А готово, системе приходится ждать обратного хода луча монитора, чтобы сменить буферы. Этот период ожидания может составить несколько миллисекунд, в течение которых ни один из буферов не затрагивается. В момент завершения вертикальной развёртки можно либо обменять буферы А и Б, чтобы затем начать построение изображения в буфере Б (переключение страниц), или скопировать буфер А в буфер Б и рисовать в буфере А.
Преимущества тройной буферизации
Если в системе есть три буфера: А, Б и В, ей не нужно ждать смены буферов. Она может отображать буфер Б, формируя изображение в буфере А. Когда изображение в буфере А готово, она немедленно начинает построение изображения в буфере В. При наступлении паузы в вертикальной развёртке отображается буфер А, а буфер Б освобождается для повторного использования.
Ограничения тройной буферизации
Если система всегда заполняет буферы за меньшее время, чем требуется для отображения буфера на экране, компьютер будет всегда ожидать сигнала монитора независимо от количества буферов. В этом случае тройная буферизация не имеет преимуществ перед двойной буферизацией.
Тройная буферизация — Википедия
Материал из Википедии — свободной энциклопедии
Тройная буферизация в компьютерной графике — разновидность двойной буферизации; метод вывода изображения, позволяющий избежать или уменьшить количество артефактов.
Тройная буферизация позволяет увеличить скорость вывода изображения по сравнению с двойной буферизацией. В реальных приложениях это часто связано с попыткой абстрагировать операции формирования графики от синхронизации с частотой обновления монитора. Как правило, кадры рисуются с частотой ниже или выше частоты обновления экрана (с переменной частотой кадров) без обычных эффектов, которые это могло вызвать (а именно: мерцание, сдвиги, разрывы). Так как программе не требуется опрашивать оборудование для получения событий обновления экрана, алгоритм может свободно выполняться максимально быстро. Это не единственный доступный метод тройной буферизации, но преобладающий на архитектуре ПК, где скорость машины может сильно различаться.
Другой метод тройной буферизации включает в себя синхронизацию с частотой обновления экрана, используя третий буфер просто как способ предоставить свободное пространство для запросов на изменения в общем объёме выводимой графики. Здесь буфер используется в истинном смысле, когда он действует как хранилище. Такой метод предъявляет повышенные минимальные требования к аппаратному обеспечению, но обеспечивает согласованную (по сравнению с переменной) частоту кадров.
Тройная буферизация предполагает использование трёх буферов, но метод может быть расширен на любое нужное приложению количество буферов. Обычно использование четырёх и более буферов не даёт каких-либо преимуществ.
Недостатки двойной буферизации
Если в системе есть два буфера, А и Б, она может отображать буфер Б, одновременно формируя новое изображение в буфере А. Когда изображение в буфере А готово, системе приходится ждать обратного хода луча монитора, чтобы сменить буферы. Этот период ожидания может составить несколько миллисекунд, в течение которых ни один из буферов не затрагивается. В момент завершения вертикальной развёртки можно либо обменять буферы А и Б, чтобы затем начать построение изображения в буфере Б (переключение страниц), или скопировать буфер А в буфер Б и рисовать в буфере А.
Преимущества тройной буферизации
Если в системе есть три буфера: А, Б и В, ей не нужно ждать смены буферов. Она может отображать буфер Б, формируя изображение в буфере А. Когда изображение в буфере А готово, она немедленно начинает построение изображения в буфере В. При наступлении паузы в вертикальной развёртке отображается буфер А, а буфер Б освобождается для повторного использования.
Ограничения тройной буферизации
Если система всегда заполняет буферы за меньшее время, чем требуется для отображения буфера на экране, компьютер будет всегда ожидать сигнала монитора независимо от количества буферов. В этом случае тройная буферизация не имеет преимуществ перед двойной буферизацией.
Тройная буферизация — Википедия. Что такое Тройная буферизация
Тройная буферизация в компьютерной графике — разновидность двойной буферизации; метод вывода изображения, позволяющий избежать или уменьшить количество артефактов.
Тройная буферизация позволяет увеличить скорость вывода изображения по сравнению с двойной буферизацией. В реальных приложениях это часто связано с попыткой абстрагировать операции формирования графики от синхронизации с частотой обновления монитора. Как правило, кадры рисуются с частотой ниже или выше частоты обновления экрана (с переменной частотой кадров) без обычных эффектов, которые это могло вызвать (а именно: мерцание, сдвиги, разрывы). Так как программе не требуется опрашивать оборудование для получения событий обновления экрана, алгоритм может свободно выполняться максимально быстро. Это не единственный доступный метод тройной буферизации, но преобладающий на архитектуре ПК, где скорость машины может сильно различаться.
Другой метод тройной буферизации включает в себя синхронизацию с частотой обновления экрана, используя третий буфер просто как способ предоставить свободное пространство для запросов на изменения в общем объёме выводимой графики. Здесь буфер используется в истинном смысле, когда он действует как хранилище. Такой метод предъявляет повышенные минимальные требования к аппаратному обеспечению, но обеспечивает согласованную (по сравнению с переменной) частоту кадров.
Тройная буферизация предполагает использование трёх буферов, но метод может быть расширен на любое нужное приложению количество буферов. Обычно использование четырёх и более буферов не даёт каких-либо преимуществ.
Недостатки двойной буферизации
Если в системе есть два буфера, А и Б, она может отображать буфер Б, одновременно формируя новое изображение в буфере А. Когда изображение в буфере А готово, системе приходится ждать обратного хода луча монитора, чтобы сменить буферы. Этот период ожидания может составить несколько миллисекунд, в течение которых ни один из буферов не затрагивается. В момент завершения вертикальной развёртки можно либо обменять буферы А и Б, чтобы затем начать построение изображения в буфере Б (переключение страниц), или скопировать буфер А в буфер Б и рисовать в буфере А.
Преимущества тройной буферизации
Если в системе есть три буфера: А, Б и В, ей не нужно ждать смены буферов. Она может отображать буфер Б, формируя изображение в буфере А. Когда изображение в буфере А готово, она немедленно начинает построение изображения в буфере В. При наступлении паузы в вертикальной развёртке отображается буфер А, а буфер Б освобождается для повторного использования.
Ограничения тройной буферизации
Если система всегда заполняет буферы за меньшее время, чем требуется для отображения буфера на экране, компьютер будет всегда ожидать сигнала монитора независимо от количества буферов. В этом случае тройная буферизация не имеет преимуществ перед двойной буферизацией.
Тройная буферизация — Карта знаний
- Тройная буферизация в компьютерной графике — разновидность двойной буферизации; метод вывода изображения, позволяющий избежать или уменьшить количество артефактов.
Тройная буферизация позволяет увеличить скорость вывода изображения по сравнению с двойной буферизацией. В реальных приложениях это часто связано с попыткой абстрагировать операции формирования графики от синхронизации с частотой обновления монитора. Как правило, кадры рисуются с частотой ниже или выше частоты обновления экрана (с переменной частотой кадров) без обычных эффектов, которые это могло вызвать (а именно: мерцание, сдвиги, разрывы). Так как программе не требуется опрашивать оборудование для получения событий обновления экрана, алгоритм может свободно выполняться максимально быстро. Это не единственный доступный метод тройной буферизации, но преобладающий на архитектуре ПК, где скорость машины может сильно различаться.
Другой метод тройной буферизации включает в себя синхронизацию с частотой обновления экрана,
используя третий буфер просто как способ предоставить свободное пространство для запросов на изменения в общем объёме выводимой графики. Здесь буфер используется в истинном смысле, когда он действует как хранилище. Такой метод предъявляет повышенные минимальные требования к аппаратному обеспечению, но обеспечивает согласованную (по сравнению с переменной) частоту кадров.
Тройная буферизация предполагает использование трёх буферов, но метод может быть расширен на любое нужное приложению количество буферов. Обычно использование четырёх и более буферов не даёт каких-либо преимуществ.
Источник: Википедия
Связанные понятия
Двойная буферизация — в информатике метод подготовки данных, обеспечивающий возможность отдачи готового результата без прерывания процесса подготовки следующего результата. Буферизация (от англ. buffer) — способ организации обмена, в частности, ввода и вывода данных в компьютерах и других вычислительных устройствах, который подразумевает использование буфера для временного хранения данных. При вводе данных одни устройства или процессы производят запись данных в буфер, а другие — чтение из него, при выводе — наоборот. Процесс, выполнивший запись в буфер, может немедленно продолжать работу, не ожидая, пока данные будут обработаны другим процессом, которому они предназначены… В информатике бу́фер (англ. buffer), мн. ч. бу́феры — это область памяти, используемая для временного хранения данных при вводе или выводе. Обмен данными (ввод и вывод) может происходить как с внешними устройствами, так и с процессами в пределах компьютера. Буферы могут быть реализованы в аппаратном или программном обеспечении, но подавляющее большинство буферов реализуется в программном обеспечении. Буферы используются, когда существует разница между скоростью получения данных и скоростью их обработки…Подробнее: Буфер (информатика)
Кольцевой буфер, или циклический буфер (англ. ring-buffer) — это структура данных, использующая единственный буфер фиксированного размера, как будто бы после последнего элемента сразу же снова идет первый. Такая структура легко предоставляет возможность буферизации потоков данных. Орель БК-08 — бытовой компьютер производства Днепровского Машиностроительного Завода. Переполнение буфера (англ. Buffer Overflow) — явление, возникающее, когда компьютерная программа записывает данные за пределами выделенного в памяти буфера. Универсальный асинхронный приёмопередатчик (УАПП, англ. Universal Asynchronous Receiver-Transmitter, UART) — узел вычислительных устройств, предназначенный для организации связи с другими цифровыми устройствами. Преобразует передаваемые данные в последовательный вид так, чтобы было возможно передать их по одной физической цифровой линии другому аналогичному устройству. Метод преобразования хорошо стандартизован и широко применяется в компьютерной технике (особенно во встраиваемых устройствах и системах… Кэш или кеш (англ. cache, от фр. cacher — «прятать»; произносится — «кэш») — промежуточный буфер с быстрым доступом к нему, содержащий информацию, которая может быть запрошена с наибольшей вероятностью. Доступ к данным в кэше осуществляется быстрее, чем выборка исходных данных из более медленной памяти или удаленного источника, однако её объём существенно ограничен по сравнению с хранилищем исходных данных. Неблокирующая синхронизация — подход в параллельном программировании на симметрично-многопроцессорных системах, в котором принят отказ от традиционных примитивов блокировки, таких, как семафоры, мьютексы и события. Разделение доступа между потоками идёт за счёт атомарных операций и специальных, разработанных под конкретную задачу, механизмов блокировки. Бу́фер обме́на (англ. clipboard) — промежуточное хранилище данных, предоставляемое программным обеспечением и предназначенное для переноса или копирования между приложениями или частями одного приложения через операции вырезать, копировать, вставить. Руткит (англ. rootkit, то есть «набор root-а») — набор программных средств (например, исполняемых файлов, скриптов, конфигурационных файлов), обеспечивающих… Положительное выравнивание (битста́ффинг, англ. Bit stuffing) — вставка неинформационных битов в поток данных. Применяется при передаче данных и в телекоммуникации. Не следует путать с избыточными данными. Видеоредактор — компьютерная программа, включающая в себя набор инструментов, которые позволяют осуществлять нелинейный монтаж видео- и звуковых файлов на компьютере. Кроме того, большинство видеоредакторов позволяют создавать и накладывать титры, осуществлять цветовую и тональную коррекцию изображения, микшировать звук и создавать спецэффекты. Программы профессионального назначения позволяют синхронизировать звук с изображением по временному коду. Типы кадров видеопотока — способы кодирования и хранения информации об очередном кадре, отличающиеся друг от друга наличием или отсутствием зависимостей этого кадра от предыдущих и последующих. Дедупликация (также дедубликация; от лат. deduplicatio — устранение дубликатов) — специализированный метод сжатия массива данных, использующий в качестве алгоритма сжатия исключение дублирующих копий повторяющихся данных. Данный метод обычно используется для оптимизации использования дискового пространства систем хранения данных, однако может применяться и при сетевом обмене данных для сокращения объема передаваемой информации. Параллакс-скроллинг (также Параллаксная прокрутка) — техника в компьютерной графике, когда фоновые изображения перемещаются относительно виртуальной камеры медленнее, чем изображения переднего плана, что создает иллюзию глубины двумерной сцены и ощущение погружения в виртуальный мир. Эта техника стала развитием техники многоплоскостной камеры, использовавшейся а традиционной анимации с 1930-х годов. Параллакс-скроллинг получил популярность в двумерной компьютерной графике и, в частности, в компьютерных… Подкачка страниц (англ. paging; иногда используется термин swapping от swap, /swɔp/) — один из механизмов виртуальной памяти, при котором отдельные фрагменты памяти (обычно неактивные) перемещаются из ОЗУ во вторичное хранилище (жёсткий диск или другой внешний накопитель, такой как флеш-память), освобождая ОЗУ для загрузки других активных фрагментов памяти. Такими фрагментами в современных ЭВМ являются страницы памяти. Видеока́рта (также видеоада́птер, графический ада́птер, графи́ческая пла́та, графи́ческая ка́рта, графи́ческий ускори́тель) — устройство, преобразующее графический образ, хранящийся как содержимое памяти компьютера (или самого адаптера), в форму, пригодную для дальнейшего вывода на экран монитора. Первые мониторы, построенные на электронно-лучевых трубках, работали по телевизионному принципу сканирования экрана электронным лучом, и для отображения требовался видеосигнал, генерируемый видеокартой… Компенсация движения (англ. Motion Compensation) — один из основных алгоритмов, применяемых при обработке и сжатии видеоданных. Структурированная обработка исключений (англ. SEH — Structured Exception Handling) — механизм обработки программных и аппаратных исключений в операционной системе Microsoft Windows, позволяющий программистам контролировать обработку исключений, а также являющийся отладочным средством. Переключение банков — способ увеличения количества используемой памяти по сравнению с количеством, которое процессор может адресовать напрямую. Этот способ может использоваться чтобы изменять конфигурацию системы: например ПЗУ, требующееся для загрузки системы с дискеты, может быть отключено, когда оно больше не нужно. В игровых приставках переключение банков позволяет разработать игры большего размера для использования на текущем поколении консолей. В информатике асинхронный ввод/вывод является формой неблокирующей обработки ввода/вывода, который позволяет процессу продолжить выполнение не дожидаясь окончания передачи данных. Вёрстка веб-страниц — создание структуры гипертекстового документа на основе HTML разметки, как правило, при использовании таблиц стилей и клиентских сценариев, таким образом, чтобы элементы дизайна выглядели аналогично макету. Поле ввода текста — элемент (виджет) графического интерфейса пользователя, предназначенный для ввода небольшого объёма текста без переноса строк. Выглядит как небольшой прямоугольник, заполненный цветом фона (обычно — белым), а при получении фокуса ввода в нём появляется курсор, приглашая ввести текст в поле. Удалённый прямой доступ к памяти (англ. remote direct memory access, RDMA) — аппаратное решение для обеспечения прямого доступа к оперативной памяти другого компьютера. Такой доступ позволяет получить доступ к данным, хранящимся в удалённой системе без привлечения средств операционных систем обоих компьютеров. Является методом пересылки данных с высокой пропускной способностью и низкой задержкой сигнала, и особенно полезен в больших параллельных вычислительных системах — кластерах. Медиаконтейнер, мультимедиаконтейнер (англ. Media container) — формат файла или потоковый формат (поток, в отличие от файла, не является предметом хранения), чьи спецификации определяют только способ представления данных (а не алгоритм кодирования) в пределах одного файла. Медиаконтейнер определяет размер и структуру представляемых данных, вместе с тем он не определяет никакую кодификацию самих данных. Медиаконтейнер фактически является метаформатом, так как он хранит данные и информацию о том, как… Текстовый видеорежим — режим компьютерного видеоадаптера, в котором экран представлен в виде решётки знакомест (а не пикселей, в отличие от графических режимов). В каждом из знакомест может находиться один символ из ограниченного набора. Сте́ковый кадр (фрейм) (англ. stack frame) — механизм передачи аргументов и выделения временной памяти (в процедурах языков программирования высокого уровня) с использованием системного стека; ячейка памяти в стеке. Цифровой сигнальный процессор (англ. digital signal processor, DSP, цифровой процессор обработки сигналов (ЦПОС)) — специализированный микропроцессор, предназначенный для обработки оцифрованных сигналов (обычно, в режиме реального времени). Резидентная программа (или TSR-программа, от англ. Terminate and Stay Resident — «завершиться и остаться резидентной») — в операционной системе MS-DOS программа, вернувшая управление оболочке операционной системы (command.com), либо надстройке над операционной системой (Norton Commander и т. п.), но оставшаяся в оперативной памяти персонального компьютера. Резидентная программа активизируется каждый раз при возникновении прерывания, вектор которого эта программа изменила на адрес одной из своих процедур… Лаг (от англ. lag, — «запаздывание», «задержка») — задержка в работе компьютерного приложения, когда оно не реагирует на пользовательский ввод вовремя. Производное от него «лагать» широко используются пользователями интернета для обозначения задержек в работе различных интернет-сервисов, онлайн-игр. Также геймеры используют слово «лаг» применительно к задержкам самой программы. Видеокодек — программа/алгоритм сжатия (то есть уменьшения размера) видеоданных (видеофайла, видеопотока) и восстановления сжатых данных. Кодек — файл-формула, которая определяет, каким образом можно «упаковать» видеоконтент и, соответственно, воспроизвести видео. Также возможно кодирование кроме видео и аудиоинформации, добавления субтитров, векторных эффектов и т. п. Вы́леты развёртки (англ. Overscan) — внешняя часть телевизионного растра, не отображаемая на большинстве кинескопных телевизоров из-за наличия пустой области и возможных искажений в этой части изображения. В аналоговом телевидении выполняют функцию, аналогичную печатным вылетам в полиграфии. Дисциплина линии (англ. line discipline, ldisc) — это слой абстракции подсистемы терминальных устройств (tty) UNIX-подобных операционных систем, необходимый для имитации соответствующих возможностей аппаратного терминала. Этот слой расположен между драйвером консоли и драйвером UART. Последовательное скачивание (англ. progressive download, также используется термин псевдостриминг) — это передача файлов с медиа-данными от веб-сервера веб-клиенту в основном с использованием протокола HTTP по запросу с клиентского компьютера. Потребитель может начать воспроизведение контента ещё до того, как он скачается полностью. Основное отличие от потоковой передачи — это то, как цифровые данные получаются и хранятся на устройстве конечного пользователя. Отображение файла в память (на память) — это способ работы с файлами в некоторых операционных системах, при котором всему файлу или некоторой непрерывной его части ставится в соответствие определённый участок памяти (диапазон адресов оперативной памяти). При этом чтение данных из этих адресов фактически приводит к чтению данных из отображенного файла, а запись данных по этим адресам приводит к записи этих данных в файл. Отображать на память часто можно не только обычные файлы, но и файлы устройств… Дефрагмента́ция — процесс перераспределения фрагментов файлов и логических структур файловых систем на дисках для обеспечения непрерывной последовательности кластеров. Синхронная цифровая иерархия (СЦИ: англ. SDH — Synchronous Digital Hierarchy, SONET) — это система передачи данных, основанная на синхронизации по времени передающего и принимающего устройства. Стандарты СЦИ определяют характеристики цифровых сигналов, включая структуру фреймов (циклов), метод мультиплексирования, иерархию цифровых скоростей и кодовые шаблоны интерфейсов и т. д. Композитный менеджер окон — менеджер окон, использующий возможности окружения (например, опциональной функции Composite X11-сервера или средств Windows Aero) по задействованию аппаратного ускорения для отображения прозрачности, отрисовки теней, отображения текстур, трёхмерных эффектов, анимации, экранных луп. Прямой доступ к памяти (англ. direct memory access, DMA) — режим обмена данными между устройствами компьютера или же между устройством и основной памятью, в котором центральный процессор (ЦП) не участвует. Так как данные не пересылаются в ЦП и обратно, скорость передачи увеличивается. Масштабируемый интерфейс пользователя (англ. Zooming User Interface или Zoomable User Interface, сокр. ZUI)) — графический интерфейс пользователя, где рабочее пространство представляет собой большую или неограниченную плоскость, на которой расположены основные элементы, свойства и содержимое которых становятся доступны по мере их «приближения» путём увеличения. Дальнейшее приближение содержимого делает доступным более глубокие уровни. Мультизагрузка (англ. Multi-boot) это техническая возможность выбора, при включении компьютера, операционной системы для запуска. Для настройки такой возможности может потребоваться специальный загрузчик операционной системы и разбиение диска на несколько разделов. Предвыборка кода — это выдача запросов со стороны процессора в оперативную память для считывания инструкций заблаговременно, до того момента, как эти инструкции потребуется исполнять. В результате этих запросов, инструкции загружаются из памяти в кэш. Когда инструкции, потребуется исполнять, доступ к ним будет осуществляться значительно быстрее, так как задержка при обращении в кэш на порядки меньше, чем при обращении в оперативную память. Gaze Based Passwords — типы паролей, которые пользователь вводит взглядом. Аутентификация с помощью gaze based паролей представляет собой динамическую аутентификацию на основе последовательности движений глаза человека и является менее уязвимой, чем аутентификация с помощью текстовых паролей, к таким атакам, как shoulder surfing. При такой аутентификации используются биологические параметры глаза, поэтому, чтобы пройти аутентификацию необходимо не только знать gaze based пароль но и быть действительно…Подробнее: Вводимые взглядом пароли
После́довательный порт (англ. serial port, COM-порт, англ. communications port) — сленговое название интерфейса стандарта RS-232, которым массово оснащались персональные компьютеры. Порт называется «последовательным», так как информация через него передаётся по одному биту, последовательно бит за битом (в отличие от параллельного порта). Несмотря на то, что некоторые интерфейсы компьютера (например, Ethernet, FireWire и USB) тоже используют последовательный способ обмена информацией, название «последовательный… Hard reset, аппаратный сброс — жёсткая перезагрузка, вызываемая электронной схемой устройства, как правило путём нажатия специальной кнопки на корпусе устройства. При этом электронная схема устройства перезапускается, аналогично как если бы питание устройства было выключено, а затем включено. Профиль модема — набор установок модема (конфигурация), используемых для его оптимального функционирования для тех или иных целей, в различных условиях: при разном состоянии телефонной линни, частотной характеристики линии, зашумлённости, наличии частых искровых помех и т. д. Акустический процессор (англ. «Sound system processor») — электронное устройство или программный комплекс, предназначенный для управления многокомпонентными звукоусилительными системами. Появление этого класса приборов связано с достижениями в разработках техники звукоусиления, где требуется большое количество устройств для корректной маршрутизации сигнала, разделения его по частотным полосам и другой обработки в соответствии с применяемыми акустическими компонентами сложной системы и окружающими… В информатике под алгоритмами кэширования (часто называемыми алгоритмами вытеснения или политиками вытеснения, а также «алгоритмами/политиками замещения») понимают оптимизацию инструкций — алгоритмы — особая компьютерная программа или аппаратно поддерживаемая структура, способная управлять кэшем информации, хранимой в компьютере. Когда кэш заполнен, алгоритм должен выбрать, что именно нужно удалить из него, чтобы иметь возможность записи (в кэш) новой, более актуальной информации.Подробнее: Алгоритмы кэширования
Что такое двойная буферизация, vsync и тройная буферизация?
Что такое двойная буферизация, vsync и тройная буферизация?
Когда компьютеру нужно отобразить что-то на мониторе, он рисует изображение того, как должен выглядеть экран, и отправляет это изображение (которое мы будем называть буфером) на монитор. Раньше был только один буфер, и он непрерывно тянулся и отправлялся на монитор. У этого подхода есть некоторые преимущества, но есть и очень большие недостатки.В частности, когда объекты на дисплее обновлялись, они часто мерцали.
Компьютер загружается по мере отправки содержимого.
Все иллюстрации любезно предоставлены Лаурой Уилсон.
Для решения проблем, связанных с чтением из одного буфера при отрисовке, используется как минимум двойная буферизация. Идея двойной буферизации заключается в том, что компьютер использует только один буфер (называемый «задний» буфер) и отправляет другой буфер (называемый «передним» буфером) на экран.После того, как компьютер заканчивает рисование заднего буфера, программа, выполняющая рисование, выполняет то, что называется «подкачкой» буфера. Эта подкачка ничего не перемещает: подкачка меняет только имена двух буферов: передний буфер становится задним буфером, а задний буфер становится передним буфером.
Компьютер отводится назад, монитор отводится вперед.
После замены буфера программное обеспечение может начать рисование в новый задний буфер, и компьютер отправит новый передний буфер на монитор, пока не произойдет следующая замена буфера.И все хорошо. Ну во всяком случае почти все.
В этой форме двойной буферизации своп может произойти в любое время. Это означает, что пока компьютер отправляет данные на монитор, обмен может происходить. Когда это происходит, остальная часть экрана отрисовывается в соответствии с тем, что содержит новый передний буфер. Если новый передний буфер достаточно отличается от старого переднего буфера, можно увидеть визуальный артефакт, известный как «разрыв». Этот тип проблемы часто можно увидеть в играх с FPS с высокой частотой кадров, когда нужно как можно быстрее повернуть за угол.Из-за быстрого движения каждый кадр очень отличается, когда во время рисования происходит замена, расхождение велико и может отвлекать.
Наиболее распространенный подход к борьбе с разрывом изображения — это дождаться замены буферов, пока монитор не будет готов для другого изображения. Монитор готов после того, как полностью отрисовал то, что ему было отправлено, и вот-вот начнется следующий цикл вертикального обновления. Sync хронизирует замену буфера с обновлением V , которое называется vsync.
Хотя включение vsync действительно устраняет разрывы, он также устанавливает внутреннюю частоту кадров в игре не более чем на частоту обновления монитора (обычно 60 Гц для большинства ЖК-панелей).Это может снизить производительность, даже если игра не работает со скоростью 60 кадров в секунду, поскольку все равно будут добавляться искусственные задержки для синхронизации. Производительность можно снизить почти вдвое, когда каждый кадр занимает чуть больше 16,67 мс (1/60 секунды). В таком случае частота кадров упадет до 30 кадров в секунду, несмотря на то, что игра должна работать со скоростью чуть менее 60 кадров в секунду. Однако устранение разрывов и постоянство частоты кадров вносят свой вклад в дополнительную плавность, которую двойная буферизация без vsync просто не может обеспечить.
Задержка ввода также становится более серьезной проблемой при включенной vsync. Это связано с тем, что введенная искусственная задержка увеличивает разницу между тем, когда что-то действительно произошло (когда кадр был нарисован), и тем, когда он отображается на экране. Задержка ввода всегда существует (невозможно мгновенно отобразить то, что в данный момент происходит на экране), но хитрость заключается в том, чтобы минимизировать ее.
Наши варианты с двойной буферизацией — это выбор между возможными визуальными проблемами, такими как разрыв без vsync, и искусственная задержка, которая может отрицательно повлиять на производительность и может увеличить задержку ввода при включенной vsync.Но не волнуйтесь, есть вариант, который сочетает в себе лучшее из обоих миров без ущерба для качества или реальной производительности. Этот вариант — тройная буферизация.
У компьютера есть два задних буфера, между которыми нужно переключаться, в то время как монитор отправляет передний буфер.
Название говорит о многом: тройная буферизация использует три буфера вместо двух. Этот дополнительный буфер дает компьютеру достаточно места, чтобы держать буфер заблокированным во время его отправки на монитор (чтобы избежать разрывов), а также не препятствует тому, чтобы программное обеспечение рисовало так быстро, как это возможно (даже с одним заблокированным буфером все еще есть два что программное обеспечение может переключаться между ними).Программное обеспечение перемещается между двумя задними буферами и (в лучшем случае) при каждом обновлении передний буфер заменяется задним буфером, содержащим последний завершенный полностью визуализированный кадр. Это действительно занимает дополнительное место в памяти на видеокарте (примерно от 15 до 25 МБ), но с современной видеокартой, на которой не менее 512 МБ, это дополнительное пространство больше не является реальной проблемой.
Другими словами, с тройной буферизацией мы получаем такую же высокую фактическую производительность и аналогичное уменьшение входной задержки при отключенной настройке vsync, при этом достигая визуального качества и плавности при включенной vsync.
Теперь важно отметить, что если вы посмотрите на «частоту кадров» игры с тройной буферизацией, вы не увидите фактической «производительности». Это связано с тем, что счетчики кадров, такие как FRAPS, подсчитывают только количество раз, когда передний буфер (тот, который в настоящее время отправляется на монитор) был выгружен. При двойной буферизации это происходит с каждым кадром, даже если следующие кадры выполняются после того, как монитор завершил прием и отрисовку текущего кадра (это означает, что он может вообще не отображаться, если другой кадр будет завершен до следующего обновления).При тройной буферизации подкачки переднего буфера происходят не чаще одного раза за vsync.
Программное обеспечение все еще рисует все время за кулисами на двух задних буферах при тройной буферизации. Это означает, что когда происходит подкачка переднего буфера, в отличие от двойной буферизации и vsync, у нас нет искусственной задержки. И в отличие от двойной буферизации без vsync, как только мы начинаем отправлять на монитор полностью визуализированный кадр, мы не переключаемся на другой кадр в середине.
Этот последний пункт действительно затрагивает одну проблему с тройной буферизацией.Кадр, который завершается через крошечный бит после обновления, когда двойная буферизация без vsync, разорвется в верхней части, а остальная часть кадра будет нести немного меньшую задержку для большей части этого обновления, чем тройная буферизация, которая должна была бы завершить отрисовку кадр уже начался. Однако даже в этом случае, по крайней мере, часть кадра будет точно такой же для вывода с двойной и тройной буферизацией, и задержка не будет значительной, и она не будет иметь никакого эффекта переноса на будущие кадры, например, включение vsync на двойном буферизация делает.И даже если вы считаете это преимуществом двойной буферизации без vsync, преимущество проявляется только ниже потенциального разрыва.
Давайте поможем донести идею до дома на примере сравнения рендеринга с использованием каждого из этих трех методов.
,Triple Buffering — Драйверы для Windows
- 2 минуты на чтение
В этой статье
Увеличение числа буферов, которые могут содержать первичную поверхность, увеличивает производительность дисплея.Желательно иметь как минимум три переворачиваемых поверхности (в некоторых играх их пять и более). Когда есть только две поверхности и происходит переворот страницы, отображение задерживается до завершения вертикального обратного хода монитора. Задержка необходима, чтобы гарантировать, что обратный буфер не будет записан до того, как он будет отображен. При тройной буферизации третья поверхность всегда доступна для записи, потому что это задний буфер, который можно использовать немедленно (как показано на следующем рисунке). В игре, в которой не используется память спрайтов, 3D-рендеринг с тройной буферизацией на 20–30 процентов быстрее, чем с двойной буферизацией.
Структуры переворачивания на предыдущем рисунке такие же, как и в Tearing, только теперь используются три буфера. Один буфер почти всегда доступен для записи (поскольку он не участвует в перевороте), поэтому драйверу не нужно ждать завершения сканирования дисплея, прежде чем разрешить повторную запись в задний буфер.
Ниже приводится краткое объяснение переворачивания и побуждения в системе с тройной буферизацией с использованием меток из предыдущего рисунка. Пример начинается с отображения памяти 11 пикселей поверхности.Это основная поверхность, на которую указывает передний буфер ( fpVidMem в примере кода, поставляемом с комплектом разработки драйверов Microsoft Windows [DDK]). В какой-то момент становится желательным перейти на поверхность в памяти пикселей 22. Поскольку fpVidMem указывает на поверхность, начинающуюся с 11 (а не с 22), и статус переворота ложный (на запрошенной поверхности переворота не происходит), blt можно продолжить. Драйвер блокирует поверхность, пишет на нее, а затем разблокирует. Чтобы отобразить эту поверхность, должен произойти переворот.
Объект переднего буфера DirectDraw теперь может изменять значение fpVidMem (указатель отображаемой памяти), чтобы сделать поверхность в точке 22 основной поверхностью. Поскольку никаких отложенных переворотов не происходит, указатели дисплея меняются местами (см. Нижнюю половину предыдущего рисунка), и статус переворота устанавливается на ИСТИНА . Передний буфер теперь указывает на память 22 пикселей поверхности, задний буфер указывает на память 33 пикселей поверхности, а третий буферный объект указывает на память 11 пикселей поверхности (старая первичная поверхность).В отличие от двойной буферизации, DirectDraw в настоящее время может свободно записывать данные в задний буфер. Другими словами, DirectDraw может записывать в память 33 поверхностных пикселей, потому что нет ожидающих переворотов. Этот процесс кругового переворачивания продолжается бесконечно, чтобы обеспечить плавную анимацию и более быструю игру и воспроизведение видео для приложений, использующих DirectDraw.
,Заключение — тройная буферизация: за что мы его любим
Завершение
Итак, вот оно. Тройная буферизация дает вам все преимущества двойной буферизации без включения vsync в дополнение ко всем преимуществам включения vsync. Получаем ровные полные кадры без разрывов. Эти кадры меняются местами в передний буфер только при обновлении, но у них такая же небольшая задержка ввода, как и двойная буферизация без vsync в начале вывода на монитор. Несмотря на то, что «производительность» не всегда правильно сообщается с тройной буферизацией, графическое оборудование работает так же напряженно, как и с двойной буферизацией и без vsync, и конечный пользователь получает все преимущества без потенциальных недостатков.Тройная буферизация требует небольшого количества дополнительной памяти на графическом оборудовании, но на современном оборудовании это не является существенной проблемой.
Напомним, что из нашего предыдущего примера, вот три кадра, которые мы рассматривали при рендеринге, располагаются рядом друг с другом.
Тройная буферизация
Двойная буферизация
Двойная буферизация с vsync
Мы представили качественный аргумент и количественный аргумент в поддержку тройной буферизации.Итак, теперь вопрос: меняют ли эти данные ситуацию? Собираются ли люди сейчас искать эту тройную буферизацию чаще, чем без этой информации? Давайте разберемся.
{опрос 135: 300}
Независимо от результатов, мы надеемся, что эта статья оказалась полезной как для объяснения часто упускаемого из виду варианта. Хотя это может быть не то, что мы тестируем из-за проблем с измерением производительности, тройная буферизация — это настройка, с которой мы предпочитаем играть. Мы надеемся, что помогли показать нашим читателям, почему им также следует попробовать тройную буферизацию.
Мы также надеемся, что больше разработчиков начнут делать тройную буферизацию опцией по умолчанию в своих играх, поскольку она обеспечит наилучшие впечатления для игроков, заинтересованных как в качестве, так и в производительности. Есть лишь несколько игр, которые включают тройную буферизацию в качестве встроенной опции, а драйверы NVIDIA и AMD в настоящее время позволяют только принудительную тройную буферизацию в играх OpenGL. Это действительно нужно изменить, поскольку нет причин, по которым мы не должны видеть сегодня повсеместную тройную буферизацию.
ОБНОВЛЕНИЕ : В комментариях было много дискуссий о различиях между методом перелистывания страниц, который мы обсуждаем в этой статье, и реализациями очереди опережающего рендеринга.При предварительном рендеринге кадры нельзя отбрасывать. Это означает, что когда очередь заполнена, то, что отображается, может иметь намного большее отставание. Microsoft не реализует тройную буферизацию в DirectX, они реализуют опережающий рендеринг (от 0 до 8 кадров, 3 по умолчанию).Основным отличием описанной здесь техники является возможность отбрасывать кадры, когда они устарели. Рендеринг вперед заставляет отображать старые кадры. Очереди могут помочь сглаживанию и заиканиям, поскольку несколько действительно быстрых кадров, за которыми следует медленный, в конечном итоге выравниваются и распределяются по большему количеству кадров.Но цена, которую вы платите, выражается в задержке (чем больше кадров в очереди, тем больше времени требуется для очистки очереди и тем старше отображаются кадры).
Чтобы сохранить плавность и уменьшить задержку, можно удерживать ограниченное количество кадров, если они нужны, но отбрасывать их, если они не нужны (если они становятся слишком старыми). Это требует более интеллектуального управления уже визуализированными кадрами и выходит за рамки данной статьи.
Некоторые разработчики игр реализуют короткую очередь опережающего рендеринга и называют ее тройной буферизацией (потому что она использует три полных буфера).Их, конечно, нельзя обвинить в этом, так как возникла большая путаница по этому поводу, и при определенных обстоятельствах эта настройка будет работать так же, как тройная буферизация, как мы ее описали (но определенно не тогда, когда частота кадров выше, чем частота обновления).
Оба метода позволяют видеокарте продолжать работу, ожидая вертикального обновления, когда один кадр уже завершен. При использовании двойной буферизации (и без очереди рендеринга), когда включена вертикальная синхронизация, после завершения одного кадра больше ничего не может быть отрисовано, что может вызвать остановку и снизить фактическую производительность.
Когда vsync не включен, для повышения производительности не требуется ничего, кроме двойной буферизации, но очередь рендеринга все равно может использоваться для сглаживания частоты кадров, если для этого требуется хранить несколько старых кадров. В некоторых случаях это может предотвратить падение мгновенной частоты кадров, но (даже при отключенной двойной буферизации и отключенной vsync) добавит задержку и задержку ввода. Даже без vsync для эффективной работы систем с несколькими графическими процессорами требуется предварительный рендеринг.
Итак, эта статья предназначена как для геймеров, так и для разработчиков.Если вы реализуете опережающий рендеринг (он же флип-очередь), пожалуйста, не называйте это «тройной буферизацией», так как это должно быть зарезервировано для техники, которую мы описали здесь, чтобы избежать путаницы. Существуют игры, в которых тройная буферизация указывается в качестве опции, когда на самом деле используется короткая очередь рендеринга. Мы понимаем, что это может вызвать путаницу, и очень надеемся, что эта статья и обсуждение помогут решить эту проблему.
,
Копаем глубже: скачущие лошади, пример
Копаем глубже: скачущие лошади, пример
Вместо того, чтобы тянуть кучу математических и традиционных временных диаграмм, мы решили составить более прямую презентацию. Диаграммы, которые мы будем использовать, показывают кадры реальной анимации, которая будет генерироваться с течением времени, а также то, что будет видно на мониторе для каждого метода. Надеюсь, это поможет проиллюстрировать количественные и качественные различия между подходами.
Наш пример представляет собой сфабрикованный пример (основанный на примере анимации, любезно предоставленный Википедией) «игры», визуализирующей лошадь, скачущую по экрану. Основы этой временной шкалы заключаются в том, что наша игра способна рендерить с частотой обновления, в 5 раз превышающей нашу (она может рендерить 5 разных кадров, прежде чем новый будет заменен на передний буфер). Постоянство частоты кадров также нереально, так как некоторые кадры будут занимать больше времени, чем другие. Мы сократили эти и другие переменные для простоты.Мы поговорим о времени и задержке более подробно, исходя из частоты обновления 60 Гц и производительности 300 кадров в секунду, но мы не хотели слишком загромождать диаграмму временем и метками. Очевидно, это теоретический пример, но он хорошо показывает идею того, что происходит.
Сначала рассмотрим двойную буферизацию без vsync. В этом случае буферы меняются местами, как только игра завершает рисование кадра. Это сразу же вытесняет то, что в данный момент отправляется на дисплей.Вот как это выглядит в этом случае:
Хорошая производительность, но с проблемами качества.
Временная шкала обозначена от 0 до 15, и для тех, кто ведет счет, каждый шаг составляет 3 и 1/3 миллисекунды. На временной шкале для каждого буфера есть изображение с интервалом 3,3 мс, в течение которого завершается кадр, соответствующий положению лошади и всадника в это время в реальном времени. Большие изображения внизу изображения представляют изображение, отображаемое при каждом вертикальном обновлении на мониторе.Единственные изображения, которые мы действительно видим, — это кадры, которые отправляются на дисплей. Преимущество всех остальных фреймов в том, чтобы минимизировать задержку ввода в этом случае.
В этом крайнем случае мы определенно можем увидеть, как может выглядеть плохой разрыв. Для этого быстрого и грязного примера я решил объединить только три кадра анимации, но на самом деле слез может быть больше или меньше. Количество различных кадров, отображаемых на экране, соответствует продолжительности времени, которое требуется графическому оборудованию для отправки кадра на монитор.Это произойдет за меньшее время, чем весь интервал между обновлениями, но я недостаточно хорошо разбираюсь в технологиях монитора, чтобы знать, как долго это длится. Я как бы бросил дротик примерно через половину интервала, потраченного на отправку кадра для целей этой иллюстрации (и, таким образом, отображаются части трех завершенных кадров). Если бы мне пришлось угадывать, я бы переоценил время, необходимое для отправки кадра на дисплей.
Для приведенного выше заявленная частота кадров FRAPS будет составлять 300 кадров в секунду, но фактическое количество полных изображений, которые вспыхивают на экране, всегда является максимумом частоты обновления (в этом примере 60 кадров в секунду).Задержка между окончанием рендеринга кадра и его появлением на экране (это задержка ввода) составляет менее 3,3 мс.
Когда мы включаем vsync, разрывание уходит, но наша реальная производительность падает, а задержка ввода увеличивается. Вот что мы видим.
Хорошее качество, но плохая производительность и задержка ввода.
Если мы рассмотрим каждую из этих диаграмм как системы, отображающие одно и то же, начиная с одного и того же времени, мы можем увидеть, насколько «отстает» этот рендеринг.Нет никаких разрывов, которые были очевидны в нашем первом примере, но мы расплачиваемся за это устаревшей информацией. Кроме того, фактическая частота кадров в дополнение к заявленной частоте кадров составляет 60 кадров в секунду. Компьютер, конечно, выполняет гораздо меньше работы, но это происходит за счет реализованной производительности, несмотря на то, что мы не можем видеть больше 60 изображений, которые монитор отображает каждую секунду.
Здесь цена, которую мы платим за устранение разрывов, — это увеличение задержки с максимального значения 3.От 3 мс до 13,3 мс. При использовании vsync на мониторе с частотой 60 Гц максимальная задержка между завершением рендеринга и его отображением составляет 1/60 секунды (16,67 мс), но эффективная задержка, которая может возникнуть, будет выше. Поскольку после завершения следующего отображаемого кадра рисование больше не может происходить до тех пор, пока он не будет заменен на передний буфер, реальный эффект задержки при использовании vsync будет больше, чем полное вертикальное обновление, когда для завершения рендеринга требуется больше одного обновления.
Переходя к тройной буферизации, мы можем увидеть, как она объединяет лучшие преимущества двух подходов двойной буферизации.
Лучшее из обоих миров.
И вот мы. Мы вернулись к максимальной задержке ввода 3,3 мс, но без разрывов. Наша реальная производительность составляет до 300 кадров в секунду, но счетчик кадров, который отслеживает только переключение переднего буфера, может неправильно сообщить об этом. Опять же, только 60 кадров фактически вставляются на монитор каждую секунду, но в этом случае эти 60 кадров являются самыми последними кадрами, полностью отрисованными перед следующим обновлением.
Хотя могут быть части кадров в двойной буферизации без vsync, которые «новее», чем соответствующие части кадра с тройной буферизацией, цена, которую за это платят, является потенциальным визуальным искажением. Настоящая особенность заключается в том, что, если вы на самом деле не видите разрывов в случае с двойной буферизацией, то эти частичные обновления не настолько отличаются от предыдущих кадров, чтобы в любом случае иметь визуальное значение. Другими словами, только когда вы видите слезу, вы действительно получаете новую полезную информацию.Но насколько полезна эта новая информация, если она идет только с разрывами?
,