Тройная буферизация
Тройная буферизация (англ. Triple Buffering) — это, Анонимус, не когда ты пытаешься одновременно открыть три бутылки пенного, а хитрая технология из мира графония и высоких фреймрейтов, призванная якобы спасти твои глазки от ужасов разрывов экрана и одновременно не дать твоему кремниевому другу впасть в спячку от ожидания вертикальной синхронизации. По сути, очередной костыль для вечно кривого рендеринга, возведенный в ранг магического заклинания для посвященных.
Суть шаманства[править]
Чтобы понять всю глубину глубин, для начала надо осознать, как работает эта ваша графика. В простейшем, доисторическом случае (одинарная буферизация), видяха рисовала кадр прямо туда, откуда его читал монитор. Результат немного предсказуем: ты видел наполовину старый, наполовину новый кадр, что выглядело как эпилептический припадок у экрана. Это назвали разрывом и быстро поняли, что так жить нельзя.
Тогда придумали двойную буферизацию. Магия проста: есть два буфера (участка видеопамяти). Один (передний, front buffer) кажет картинку на монитор, второй (задний, back buffer) в это время наполняется новым кадром силами неутомимой видяхи. Когда кадр готов, буферы меняются местами — ррраз! И готово. Красота? Почти.
Проблема выползает, когда включается VSync (вертикальная синхронизация). Эта штука заставляет видяху ждать, пока монитор полностью обновит картинку, прежде чем подсовывать ему новый кадр. Цель благая — убрать те самые разрывы. Но если видяха рисует быстрее, чем обновляется монитор (например, 100 FPS на 60 Гц мониторе), ей приходится… ждать. Курить бамбук. Простаивать. В результате FPS падает до ближайшего делителя частоты обновления (60, 30, 20…), и появляются неприятные подлагивания и задержка ввода, когда фреймрейт скачет туда-сюда. Ты жмешь кнопку — а герой реагирует спустя вечность. Знакомо? То-то же.
Тут-то на сцену и выползает наш герой — тройная буферизация. Идея столь же гениальна, сколь и очевидна: а давайте добавим третий буфер! Теперь схема такая:
- Буфер 1 кажет картинку (фронт).
- Буфер 2 уже нарисован и ждет VSync для показа.
- А Буфер 3 уже рисуется видяхой, не дожидаясь никаких синхронизаций!
Как только Буфер 1 отработал, на его место встает Буфер 2. Видяха закончила рисовать Буфер 3? Отлично, он становится в очередь на показ, а освободившийся Буфер 1 идет под рисование следующего кадра. GPU почти всегда при деле, не простаивает в ожидании монитора. В теории, это позволяет сохранить плавность VSync (нет разрывов) и избежать резких просадок FPS и дикой задержки ввода, характерных для двойной буферизации с VSync, когда производительность плавает выше частоты обновления монитора.
Звучит как магия? Это она и есть! Черная магия драйверописателей и игровых движков.
А оно надо?[править]
Так что, включать везде и всегда? Как бы не так. Во-первых, эта радость жрет больше видеопамяти. Не критично по нынешним меркам, но все же. Во-вторых, реализация этой самой тройной буферизации — та еще лотерея. В OpenGL и Vulkan она обычно есть и работает (если дрова не подкачали). А вот в мире DirectX все сложно: часто она либо не работает вовсе, либо работает как-то через задницу, либо требует специальных утилит или настроек в панели управления видеокарты, которые могут конфликтовать с игрой. Некоторые игры имеют свою встроенную опцию, которая может называться как угодно, но делать именно это. Или не делать. Или делать что-то другое.
Более того, тройная буферизация имеет смысл только при включенном VSync и только когда твоя печка способна выдавать FPS выше частоты обновления монитора. Если фреймрейт и так ниже герцовки, то TB не даст ровным счетом ничего, кроме чуть большей (на 1 кадр) задержки ввода по сравнению с VSync+Double Buffering. А если VSync выключен, то обсуждать вообще нечего — буферы и так меняются как бешеные, порождая те самые разрывы, от которых мы пытались убежать.