Чтобы не растечься мыслью по древу, ограничим исследование рендеринга следующими условиями: ПК, один Full HD монитор 32" или более, подсоединённый к компьютеру по HDMI. Нам потребуется плеер BE: в нём настройки и возможность тестирования рендеринга представлены полнее, чем в любых других плеерах.
Чтобы всё заработало идеально, тебе нужно установить Директ X энд-юзер рентаймс отсюда: [Для просмотра данной ссылки нужно зарегистрироваться]
Также плеер BE может потребовать установить Нет Фреймворк, если он у тебя ещё не установлен.
Рендеринг, в числе прочего, отвечает за два очень важных потребительских качества:
1. Алгоритм масштабирования изображения до разрешения монитора. Вот простой тест, и всё станет сразу понятно. Изображение сжато безпотерьным видео кодеком.
[Для просмотра данной ссылки нужно зарегистрироваться]
Пробуем различные рендеры. Просмотр ведём в полноэкранном режиме.
Системный рендер. В Win XP изображение масштабировалось по билинейному алгоритму. В Win 7 вообще произошёл откат на пиксельный алгоритм.
Самое лучшее масштабирование получается, если использовать Exchanged Video Renderer (custom presenter). Вот так, эти настройки будут оптимальны и для второго потребительского качества:
[Для просмотра данной ссылки нужно зарегистрироваться]
Пробуем. Видим, что изображение чёткое, приятное, без звона. Мне представляется, что поднимать A до -1 будет уже перебором.
Прогоним этот тестовый файл на других плеерах. Stereoscopic Player – билинейный алгоритм. Стандартный плеер от Билла, входящий в Win 7 – тоже билинейный алгоритм. KMP – ну это нужно видеть своими глазами, а то не поверишь. Попробуй также, если захочешь, на плеерах типа "дорогущий" и "навороченный". Любителей Win 10 прошу прогнать этот файл на BE с системным рендером и на встроенном в десятку плеере и отписаться, а ещё лучше приложить снимок полноэкранного режима.
Может показаться, что данный тест натянутый: реально видео с разрешением 50x50 не встречается. Тест на то и тест, чтобы явно высветить достоинства и недостатки. Лично я хорошо вижу разницу, когда фильм 720x576 масштабируется до HD разрешения монитора по бикубическому и билинейному алгоритму.
Замечу, что если мы сохраняем плеером BE кадр, используя Exchanged Video Renderer, то он будет отмасштабирован. Например, исходник 720x576 AR 16:9, то получим bmp 1024x576. Чтобы сохранить кадр с исходным разрешением, нужно переключиться на системный рендеринг.
Кое-где можно услышать бубн, что, типа, бикубический алгоритм при увеличении разрешения подчёркивает артефакты. Это о каких таких артефактах-то идёт речь? Если смотреть рип, то быть может. В фильмах же исходного DVD качества никаких артефактов, которые подчёркивал бы бикубический алгоритм, нет.
2. Синхронизация частоты кадров фильма с частотой обновления монитора. Вот на эту тему в русскоязычной Сети я вообще не нашёл толковых статей. Всё, что я обнаружил, является переводом трёх английских статей.
Поэтому попробуем разобраться сами.
В этих статьях и их переводах муссируется мысль, что если частота кадров фильма = 25, а частота обновления монитора = 60, то напрямую достичь качественной синхронизации невозможно. Для точной синхронизации авторы предлагают, имхо, некие совершенно левые замороченные подходы и программы, вплоть до ковыряния в мониторе. Я же покажу, как можно достичь идеальной синхронизации только комбинацией настроек плеера и сплиттера.
Итак, задача: монитор 60 Гц (для примера). Нужно, ничего не ковыряя в настройках монитора и в самом мониторе, выполнить настройки по принципу "установил и забыл". То есть задать такие параметры, которые обеспечат идеальную синхронизацию для фильма с любой частотой кадров. Я приведу эти настройки, а в конце статьи опишу тест, доказывающий, что мы достигли желаемого результата. Ещё раз хочу напомнить, что приведённые ниже настройки дадут идеальный результат для современного ЖК монитора типа Панасоник, подсоединённого по HDMI. Древнеегипетского старья VGA у меня просто нет, так что проверить действенность данных методов для VGA мне просто не на чём. Поехали.
В плеере BE существует Sync Video Renderer. В подсказках плеера BE можно прочитать, что Sync Video Renderer – это то же самое, что и Exchanged Video Renderer, но имеет дополнительные средства синхронизации. Однако это не так! Хотя бы потому, что у этих рендеров совершенно разные опции. Sync Video Renderer нам не потребуется. В природе также существует рендер MadVR, замороченный, имеющий массу не относящихся собственно к рендерингу прибамбасов. Он нам тоже не потребуется.
На вкладке "Видео" задаём Exchanged Video Renderer (custom presenter). Параметры выставляем, как показано на фото в первом пункте. Почему 8-bit Integer? Потому что, во-первых, практически все файлы на сегодняшний день имеют такую битность, а во-вторых, мой Панасоник только столько и берёт. Так зачем здесь делать больше, а потом где-то понижать? По этой же причине нет птицы у 10-bit. Если до этого был задан другой рендер, то, чтобы вкладка с настройками синхронизации стала активной, нужно нажать "OK" и снова войти в настройки.
Активируем вкладку "Синхронизация кадров". Перед началом действий немного теории.
Начальные сведения о том, что такое синхронизация и зачем она нужна, по-русски сносно изложены здесь:
[Для просмотра данной ссылки нужно зарегистрироваться]
VSync означает "вертикальная синхронизация". У термина "вертикальная синхронизация" два сходных значения. Первое значение – это те моменты времени, в которые нужно посылать изображение на монитор. Время между двумя вертикальными синхронизациями равно времени между обновлениями монитора. Например, для монитора 60 Гц время между вертикальными синхронизациями составляет 1/60 = 16,67 миллисекунд. Практически никогда тот момент времени, когда, исходя из fps, нужно воспроизводить кадр, не совпадёт с моментом вертикальной синхронизации. Если мы не предпримем никаких мер, то в этих случаях в верхней части экрана будет прорисован один кадр, а в нижней – другой кадр. Граница между этими кадрами проходит по горизонтали, и эта горизонталь может расположиться в любом месте экрана, от самого низа до самого верха. Такое безобразие называется разрывом кадра, или отсутствием синхронизации. Второе значение термина "вертикальная синхронизация" – это такая организация процесса воспроизведения, при которой в каждое обновление монитора всегда посылается один целый кадр. А не компот из двух идущих один за другим кадров. Если вертикальная синхронизация достигнута, то на всём экране, снизу до верху, всегда будет прорисован один кадр.
На всякий случай. Понятия "горизонтальная синхронизация" не существует. Просто невозможно, чтобы в левой части экрана был прорисован один кадр, а в правой – другой.
Просмотр видео на современном железе можно организовать двумя способами: видео разжимается и декодируется до RGB центральным процессором при помощи программы-декодера (например, ffdshow) и уже в разжатом RGB виде подаётся на видеокарту, либо по принципу DXVA, то есть видео разжимается и декодируется в самой видеокарте. Какой бы из этих двух способов мы ни выбрали, оптимальные настройки рендера будут одинаковыми. Рендер не занимается декодированием. У него другая задача: продвинуть кадры на графический процессор (видеокарту) таким образом, чтобы достичь синхронизации, и выполнить масштабирование. Я не буду в десятый раз доказывать, что декодирование центральным процессором даёт более точно соответствующее исходнику изображение. И синхронизация при декодировании ЦП получается слегка лучше, чем при задействовании DXVA. В этом ты сможешь сам убедиться, когда дойдём до тестов. Вообще DXVA изобрели, чтобы разгрузить ЦП. Но у современных компьютеров быстродействие ЦП намного превосходит требуемое для воспроизведения даже HD фильмов. Так зачем же ещё разгружать ЦП?
Возвращаемся к опциям. Сейчас я приведу перевод по существу опций, активных для Exchanged Video Renderer (custom presenter). Исходные английские тексты взяты с сайта плеера [Для просмотра данной ссылки нужно зарегистрироваться]
"VSync"
Может использоваться для включения VSync. Обычно отключать VSync не рекомендуется, поскольку отключение VSync удалит из обработки много исправлений потока. Отключение этой опции целесообразно только для отладки.
Птицу не ставим! Почему? Скоро поймём.
"Аккуратный VSync"
Может использоваться для включения точного VSync. Если точный VSync отключён, использование центрального процессора слегка уменьшится, особенно когда альтернативный VSync также отключён.
Ну насчёт того, что "использование ЦП слегка уменьшится", я бы поспорил. У меня как раз увеличивалось.
Птицу не ставим.
"Альтернативный VSync"
Включение альтернативного VSync обойдёт установленный по умолчанию VSync, встроенный в D3D. Он зачастую может избавить от проблем разрыва и является предпочтительным режимом, нежели просто VSync, если Ваши аппаратные средства/драйверы совместимы с ним.
Птицу ставим. Вот теперь стало понятно, почему мы удалили птицы у двух предыдущих опций. Хоть для альтернативного VSync и сказано, что он обойдёт, но это не так. Если бы мы оставили включёнными обычный VSync и аккуратный VSync, то они бы встревали в дело, и результат был бы хуже, чем при использовании чисто альтернативного VSync. Заметим, что на вкладке "Видео" птица нужна у опции "Полноэкранный Direct3D". Эта опция не конфликтует с альтернативным VSync, а наоборот, улучшает результат в полноэкранном режиме.
"Заполнить GPU перед VSync"
Оригинальное английское название – "Flush GPU before VSync". Flush имеет много значений, в том числе и прямо противоположных: затоплять, наполнять до краёв, смывать, очищать, способствовать росту, возбуждать, воспламенять, взлетать, обильно течь, воодушевить. Исходя из последующего объяснения, я бы перевёл этот глагол как "ускорять".
Ускорение графического процессора перед вертикальной синхронизацией уменьшит вероятность разрыва, поскольку это вынуждает графический процессор подготовить кадр к подаче как можно скорее. Таким образом, кадр будет готов к подаче на VSync.
Я бы назвал эту опцию так: "Ускорить графический процессор видеокарты перед вертикальной синхронизацией".
Птицу не ставим. Не ставим.
"Заполнить GPU после представления"
Ускорение графического процессора после вертикальной синхронизации уменьшит вероятность разрыва, поскольку это вынуждает драйвер реализовать подачу кадра как можно скорее.
Я бы назвал эту опцию так: "Ускорить графический процессор видеокарты после подачи кадра".
Птицу ставим.
"Ожидать заполнения" – в оригинале "Wait for flushes".
This will cause the renderer to spin, waiting for the GPU flushes. This can be useful if the driver for some reason will ignore single flushes and will also enable the GPU time statistic.
Это заставит рендеринг войти во "вращательный режим", ожидая ускорения графического процессора. Это может быть полезно, если драйвер по некоторым причинам проигнорирует единичные операции по ускорению, а также позволит использовать статистику времени графического процессора.
Мои наблюдения показали, что если мы поставим здесь птицу, то расстояние между зелёной и красной линиями на графике увеличится. Я бы назвал эту опцию так: "Выделить рендеру дополнительное время, за которое графический процессор видеокарты успеет ускориться".
Будем считать, что драйвер у тебя хороший и ничего не проигнорирует. Тем не менее птицу ставим.
Мне представляется, что влияние включения и выключения трёх последних опций на достижение оптимального результата зависит от железа, и в первую очередь от видеокарты. Так что поэкспериментируй.
"Сдвиг VSync" оставляем на 0.
"Отключить эффекты рабочего стола" – птицу ставим.
"Включить коррекцию времени кадра"
Включите это только тогда, когда имеет место "заикание" видео из-за неисправного декодера или сплиттера. Например, контент VC-1 в контейнере M2TS на blu-ray в настоящее время нуждается в этом.
Птицу не ставим.
OK.
Есть ещё три важных параметра, которые нужно настроить.
На момент написания этой статьи последний релиз плеера BE был 1.5.1. В этом релизе хорошо прописаны все сплиттеры (называемые здесь "фильтры источников"), кроме ts. Причём фильтр источника ts из BE не позволяет достичь хорошей синхронизации не только для контента VC-1, но и для любого другого контента. Поэтому в настройках плеера нужно отключить фильтр источника MPEG/PS/TS/PVA и задействовать соответствующий сплиттер из LAV. В LAV этот сплиттер доведён до совершенства, и никакого "заикания" и "запинания" просто не будет. А что же изменится, если мы отключим также и все остальные фильтры источников в BE и будем всё сплиттерить через LAV? По моим наблюдениям, не изменится ничего.
Второй параметр. Идём "Настройки" – "Встроенные фильтры" – "Видео декодеры" – "Настройка видеодекодера". В графе "Число потоков декодирования" выставляем точно количество физических ядер в твоём процессоре. А не число нитей, не авто, и не что-то другое. Если ты декодируешь ffdshow, то в его настройках тоже нужно задать число физических ядер процессора. Например, у меня "DualCore Intel Celeron G1840, 2800 MHz (28 x 100)", и я выставляю 2. А не число нитей = 8.
Третий параметр. Идём в панель управления видео картой и везде задаём "Использовать настройки видеоплеера". "Выходной динамический диапазон" задаём "Полный". Процессор для PhysX лучше задать ЦП.
С настройками всё. Выставили все эти настройки один раз и навсегда, и забыли.