Синхронизация. Причины появления, как работает, виды и различия.

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

И тут появляются свои сложности.

Причины необходимости синхронизации

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

Я думаю ни для кого не будет секретом то, что первые мониторы по своему внутреннему строению были очень похожи на телевизоры. И для того чтобы понять в чём тут может возникать проблема нужно в целом понять как работают телевизоры, как они принимают сигнал и как выводят его.

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

Пример схемы телевизора. Сигнал с антенны имеет только электрические преобразования для вывода его на экран

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

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

Схема состава электронно-лучевой трубки

А дальше — дело за линейным ускорителем электронов.

Безумнее самого факта отсутствие памяти у телевизоров было наличие прямых эфиров, когда сам эфир было намного проще провести, чем его сохранить.

Камеры для прямых эфиров

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

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

Жёсткая хардварная магия безо всяких компьютеров и любой логики и запоминающих устройств.

И все технические решения были направлены исключительно на обеспечение функционирования данной системы.

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

А скоростей было несколько.

Кадровая и строчная развёртка

Чтобы понять что это за скорости — разберёмся в работе кинескопа.

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

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

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

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

С тех пор прошёл примерно век, но базовые принципы никто изменить не решился.

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

В остальном — принципы по которым строяться вывод изображения не изменились.

А вот реалии вывода изображения — изменились.

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

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

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

Почему это не работает в компьютерах?

Теперь поговорим про компьютеры.

В чём сложность?

Сложность в том, что компьютер не выдает четкое количество кадров в секунду. Компьютер готовит кадры тогда, когда он смог.

А мониторы выдают кадры чётко когда им надо кадр за кадром с равным промежутком времени.

Из-за этого получается крайне неприятная особенность, когда на монитор выводятся куски разных кадров.

Называется это явление — тиринг.

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

Нажмите для увеличения

Подобное очень портит впечатление от игрового процесса. Особенно сильно когда FPS близок к развертке монитора.

И к слову — записать такие разрывы можно только картой захвата.

Если же я попытаюсь записать изображение программно, допустим, через ShadowPlay от nvidia, то разрывы изображения чудодейсвтенным образом испаряются.

Нажмите для увеличения

Естественно испаряются они только на записи видео, а я на мониторе видел их с разрывами и карта захвата видела их тоже с разрывами.

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

То есть мониторы по прежнему работают так как будто рассчитаны на равномерный вывод кадров, а видеокарты — нет.

Механизм возникновения тиринга

Современная видеокарта состоит из трёх различных устройств, собранных в единое целое.

Первое устройство — 3D ускоритель. В него сейчас входят все вычислительные ресурсы видеокарты.

Второе устройство — 2D ускоритель. Это части видеокарты отвечающие за кодирование и декодирование видео и некоторые другие аппаратные ускорения.

И третье устройство — это непосредственно та часть, которая отвечает за видеовывод.

Монитор же, что и логично, связан только с частью отвечающий за видеовывод в видеокарте.

И так — давайте разберёмся что работает не так как нам хотелось бы.

Для этого чуть подробнее рассмотрим часть отвечающую за видеовывод в видеокарте.

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

И на деле он разделён на несколько частей, где по отдельности храниться несколько кадров.

Мы для простоты рассказа будем считать, что кадровый буфер состоит из двух ячеек для кадров.

назовем их условно буферы 0 и 1.

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

Но, естественно, компьютер, как только завершил один кадр, начинает работать над следующим кадром.

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

Теперь видеокарта записывает новый кадр в буфер 1.

Но как только она это сделает — по идее нужен ещё один буфер ещё на один кадр и так до бесконечности.

На деле — буферов достаточно два.

Как только видеокарта записала второй кадр — названия буферов меняются между собой.

Обратите внимание, на прошлом слайде левый буфер был 1, правый — 0. На этом — наоборот.

То есть самый новый кадр опять оказывается в буфере 0, а старый кадр становиться в буфере 1. И видеокарта смело затирает первый буфер записывая в него новый кадр. И так до бесконечности. Записывается новый кадр — меняются буферы — затирается старый и записывается более новый.

И того получается, что буфер 0 всегда содержит наиболее новый из всех полностью готовых кадров и на монитор может быть передан самый свежий полностью отрисованный кадр. А буфер 1 постоянно перезаписывается, а из-за того что физически кадры между буферами не перемещаются, а меняются только названия буферов — замены кадров между этими буферами происходят мгновенно.

И, естественно, это никак не завязано на то когда монитор будет забирать кадр. то есть монитор живёт своей жизнью, видеокарта — своей.

Что в итоге получается. А получается, что монитор забирается пиксель за пикселем, строка за строкой один кадр,

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

Нажмите для увеличения

Так и получается, что пока монитор выводил картинку — кадры поменялись и в итоге на монитор выводятся куски из нескольких кадров. Если FPS сильно выше, чем частота обновления монитора то кусков кадров будет три и даже более.

И, естественно, если между кадров произошли сильные перемещения, то стыки кадров будут видны на мониторе. Это и есть тиринг.

Какие есть методы устранения тиринга

Остаётся только понять — почему же тогда на записи через шедоу плей — разрывов нет.

А всё просто — шадоуплей просто сразу копирует себе кадры из буфера по мере завершения отрисовки, а не когда прошёл какой-то определённый промежуток времени, как берут мониторы, а если кадры лишние — то есть кадров больше, чем FPS для видео — то эти лишние кадры выбрасываются.

Иными словами — если бы монитор брал изображения не в случайное время, а к моменту завершения отрисовки — то и монитор мог бы показывать поток без разрывов.

Либо видеокарта должна не менять кадры в буферах когда ей это нужно, а менять должна учитывая то когда монитор заканчивает забирать целый кадр.

Комбинация этих двух принципов или использование одного из них в чистом виде и называется синхронизацией.

Виды синхронизации

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

И как вы поняли — глобально техник синхронизации две, и они требуют принципиальной разницы для реализации.

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

Второй метод предполагает, что уже видеокарта будет подстраиваться под монитор.

Второй метод — сугубо программный, то есть не требует дополнительных аппаратных возможностей для мониторов.

Для каждого из методов существует несколько разновидностей логики работы.

Программные методы синхронизации

Начнём со второй группы методов — то есть программных, в которых монитор сохраняет постоянную кадровую развёртку, а видеокарта пытается сделать так чтобы не было тиринга.

Самый простой метод — вертикальная синхронизация, она же в настройках игр может называться vsync.

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

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

Допустим если частота монитора — 60 Гц, то есть он выводит 60 кадров в секунду, то это значит, что новый кадр должен быть отрисован в течении 16,7 мс пока выводиться текущий кадр, а если кадр был отрисован быстрее, то видекокарта не будет отрисовывать следующий. Таким образом — видеокарта подготавливает ровно столько кадров, сколько может вывести монитор. Это позволяет выводить на монитор ровно по одному кадру в каждое обновление монитора.

Но у такой стратегии есть два больших недостатка.

Первый недостаток заключается в том, что если видеокарта не успела подготовить новый кадр за время вывода на монитор старого — то выводить этой видеокарте на монитор будет нечего. Новый кадр подготовлен не был, буферы местами поменяты не были, а значит в новый цикл обновления монитора — видеокарта будет выводить тот же кадр, что был выведен в прошлый раз. Иными словами — мгновенный FPS падает в два раза. Один кадр выводился на 60 FPS, а соседний на 30 FPS, то есть в двое дольше.

А следующий уже опять может быть выведен на 60. И если возникает пограничное состояние, когда часть кадров выводяться на полной скорости, а часть на половинной, то это сильно влияет на ощущение от игры.

То есть вы включаете вертикалку — 60 FPS идут супер плавные, но если вдруг вы видите уже 59 или 58 FPS, то по ощущениям — это может выглядеть хуже, чем стабильные 30 FPS.

При этом если ситуация не пограничная и видеокарта стабильно может подготовить только один кадр в два обновления монитора — то естественным образом FPS падает до 30 на 60-ти герцовом мониторе и опять наступает равномерная плавность.

И это первая проблема.

Вторая проблема не менее значима.

И заключается в том, что увеличиваются задержки между вводимом игроком воздействии и выводом изображения на экран.

Когда синхронизация отключена как только кадр подготовлен его кусок сразу начинает выводиться на экран. Пусть это будет только кусок, но это будет новый кадр.

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

И естественно создаёт ощущение, что игра тупит, то есть управление не такое, как вам хочется.

В некоторых играх — это заметно сильно, в некоторых не очень. Тем не менее — вертикальная синхронизация — киселит управление.

Особенно это заметно, когда FPS в игре очень высокий. То есть условно у вас в CS было 500 FPS. Задержка от отрисовки будет 2 мс на обработку, около 5 мс на монитор и ещё будет какая-то часть от оставшегося куска 16,7 мс.

С вертикальной синхронизацией — у вас к этим всем задержкам добавляется ещё полноценные 16,7 мс. И это значительно. При этом от чёткости отклика некоторые думают и то, что появляется больше плавности на 300-400 FPS, в сравнении с 60 FPS, на 60 Гц мониторе. Естественно плавности больше не становиться, но из-за меньших задержек от высокого FPS улучшается отклик от игры, что ощущается как некое подобие плавности.

И в целом — обе описанные проблемы вертикальной синхронизации поддаются решению.

Причём так как вертикальная синхронизация — это программная штука, то и решения проблем — программные.

Более важная проблема — это пропуски кадров.

Есть специальный костыль, но вроде только у nvidia — это adaptiv vSync.

Суть в том, что если компьютер не вытягивает 60 FPS, то программно отключается синхронизация. Естественно возвращается тиринг, но зато нет проблем с очень высокими задержками и резким ухудшением плавности. Аналогов от AMD вроде нет.

Есть программные костыли и для уменьшения задержек.

У Nvidia это называется fast sync, а у AMD это называется enhanced sync. И у одной и у другой вариации общий смысл один и тот же и включается это в настройках фирменных утилит.

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

Хорошо работает это когда FPS очень высокий. Если он близок к 60-ти, то разницы по задержкам от вертикальной синхронизации практически нет.

Аппаратные методы синхронизации

Если же обратиться к методам в которых монитор подстраивается под видеокарту — тут уже одними программными методами не обойтись. Для того чтобы это работало монитор должен уметь подстраиваться под видеокарту, ну и видеокарта должна уметь работать именно с той технологией, что применяется в мониторе.

И есть два различных стандарта — AMD freesync и Nvidia g-sync.

Существует несколько вариаций Freesync и несколько вариаций G-sync. Freesync отличаются требованиями, самый простой — может быть на мониторах с низкой герцовкой, следующие варианты уже должны быть до 120 Гц и самая мощная версия уже идёт с дополнительными требованиями по качеству картинки, цветовому охвату и т.д. В общем — к синхронизации никакого отношения это всё уже не имеет.

С G-sync всё несколько веселее.

Ultimate так же как и FreeSync Premium Pro добавляет требования к качеству изображения, а G-sync Compatible на самом деле маркируются мониторы с FreeSync, которые гарантированно работают с видеокартами nvidia.

Но вернёмся чуть-чуть назад — к тому как это работает.

Суть технологий заключается в том, что монитор перестает выводить изображение с равной развёрткой, а меняет скорость вывода изображения в зависимости от того как быстро компьютер подготавливает новые кадры.

Вывод кадров без синхронизации
Вывод кадров с аппаратной синхронизацией

Если компьютер быстро может подготавливать кадры, то они быстро выводятся монитором, если компьютер не может быстро, то выводятся они медленно. Дальше ограничения уже самого монитора. Как правило мониторы поддерживают переменную скорость для смены частоты кадров от 48 Гц, то есть от 48 FPS. Если компьютер становиться медленнее, то все эти подстройки друг к другу выключаются. А если компьютер быстрее, чем максимальная герцовка монитора, то это начинает работать как вертикальная синхронизация.

Касаемо технологий — принципиальных отличий g-sync и freesync нет. А вот технически они есть. Для g-sync требуется в монитор добавлять специальный чип от nvidia и монитор с видеокартой общаются именно чип с чипом через видеопорт, используя служебные области потока данных для общения и конфигурирования монитора под каждый кадр на лету.

Для FreeSync используются стандартные обмены данных — внесенные в стандарт дисплей порта. То есть конфигурирование монитора под каждый кадр было изначально предусмотрено дисплей портом и специальный чип не нужен, нужна только поддержка этого конфигурирования со стороны монитора. И из-за этого FreeSync мониторы дешевле. И так как AMD начали активно сравнивать по цене не видеокарты, а пару видеокарта+монитор, и nvidia из-за этого плохо смотрелись, то nvidia пришлось прогнуться и тоже включить поддержку freesync, правда свою маркировку они всё же на это дело придумали так чтобы и там было название g-sync, хотя никакого чипа g-sync в таких мониторах — нет.

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

Программные методы — бесплатные, но более костыльные.

Видео на YouTube канале "Этот компьютер"

2 Comments on “Синхронизация. Причины появления, как работает, виды и различия.”

Добавить комментарий