MPC-BE forum

MPC-BE => Обсуждение / Discussion => Тема начата: V0lt от 10 ноября 2018, 07:48:54

Название: EVR-CP и синхронизация
Отправлено: V0lt от 10 ноября 2018, 07:48:54
Суть проблемы.
В современных Windows за вывод изображения отвечает Desktop Window Manager (https://docs.microsoft.com/en-us/windows/desktop/dwm/dwm-overview). Благодаря ему мы забыли про тиринг (https://en.wikipedia.org/wiki/Screen_tearing) при воспроизведении видео. Но есть и проблема. Мы почти не контролируем время отрисовки кадра, т.к. DWM дает задержку, которая может получаться непостоянной.

Есть 3 случая работы DWM:
1. Win7 без Aero. По сути режим работы как в WindowsXP. DWM не работает, можно получить тиринг, если отключить VSync в драйвере.
2. Win7 c Aero. Работает DWM со всеми плюсами и минусами.
3. Win8. Немного изменили DWM и запретили отключать.

На работу DWM влияют количество подключения дисплеев.
Один дисплей - статистике DWM можно верить.
Два дисплея на одной частоте - с одинаковыми дисплеями все хорошо, с разными могут вылезти нюансы.
Два дисплея на разных частотах - статистика DWM начинает сильно врать.
Как правило на втором дисплее ситуация хуже. Есть зависимость от системы. Win8.1 работает лучше, чем Win7.
Для понимания ситуации можно открыть страницу https://www.vsynctester.com/ в разных браузерах и с разным количеством дисплеев.

Режимы "презентации"

D3DPRESENT_INTERVAL_IMMEDIATE позволяет обновлять "буфер" сколь угодно раз. Нарисовал чего-нибудь, подумал, нарисовал что-то другое. А DWM выведет последний результат, который попал на смену кадра. Режим хорош тем, что можно сильно не парится по поводу "выводить кадр или пропускать". В статистике могут быть значения fps больше, чем выдает дисплей (например если смотреть видео 120 fps).
D3DPRESENT_INTERVAL_ONE рисует картинку и ждет смену кадра и выводит. Если у нас кадров больше чем поддерживает дисплей или декодер выдает кадры медленнее чем требуется, то рендерер должен начать сам пропускать кадры.

Тестовые видео
120 fps game video (bf.mp4) (https://www.blurbusters.com/hfr-120fps-video-game-recording/)

Сборки (https://yadi.sk/d/DIJLKO7mjjFUOg)
MPC-BE.1.5.3.4157 - настройка "Альтернативный VSync" теперь влияет на обычный режим и переключает с D3DPRESENT_INTERVAL_IMMEDIATE на D3DPRESENT_INTERVAL_ONE.
RefreshRate_1 - измеряет частоту экрана и показывает ее в статистике при отключенной опции VSync.
RefreshRate_2 - увеличен интервал измерения, уменьшено количество вычислений.
RefreshRate_3 - добавлен расчет количества ScanLines.
RefreshRate_4 - учитываем большую длительность 0-й сканлинии (VBlack) по сравнению с другими.
RefreshRate_5 - небольшая переделка кода, исправлена опечатка приводящая к периодическим подергиваниям.

Сообщение будет дополняться...
Название: EVR-CP и синхронизация
Отправлено: Aleksoid1978 от 10 ноября 2018, 08:45:38
Сейчас в оконном режиме используется значение D3DPRESENT_INTERVAL_IMMEDIATE для D3DPRESENT_PARAMETERS::PresentationInterval. Т.е. рендерер выводит кадр и ничего не ждет. За процесс синхронизации отвечает DWM. Все красиво на бумаге - на деле иногда не очень.

Эксклюзивный режим использует D3DPRESENT_INTERVAL_ONE, при этом отображение на экран будет синхронизировано с вертикальным лучом монитора. Но при этом нет возможности вывести видео с частотой, больше чем частота экрана(ну а зачем оно надо :) ).

Позже примерно накидаю новые опции(в картинках) и пояснения.
Название: EVR-CP и синхронизация
Отправлено: V0lt от 10 ноября 2018, 09:27:33
Aleksoid1978, не так. Про вертикальный луч монитора лучше вообще не вспоминать, он только больше запутывает.

Информацию по D3DPRESENT_INTERVAL_IMMEDIATE и D3DPRESENT_INTERVAL_ONE закинул в шапку.

Различие между режимами легко проверить, если мерять время до и после Present-ов.

Отредактировано
Название: EVR-CP и синхронизация
Отправлено: Aleksoid1978 от 10 ноября 2018, 09:33:03
Про ожидание луча написал сам M$
Название: EVR-CP и синхронизация
Отправлено: V0lt от 10 ноября 2018, 09:45:21
Я знаю, везде про VBlack написано. И везде сказано, что обратный луч - это условность (видеокарты и мониторы сейчас иначе работают).
И пока ты не начнешь лезь в функции ловли VBlack-ов, лучше думать о простой "смене кадра".

Добавлено: 2018-11-10 09:45:21

ЦитироватьНо при этом нет возможности вывести видео с частотой, больше чем частота экрана(ну а зачем оно надо smile ).
Надо:
1. Видео с частотой больше, чем частота дисплея.
2. Ускоренное воспроизведение видео.
3. Запустил видео с частотой 23p на дисплее 23 Гц, а в нем появляется рекламная вставка на 59i.
Во всех случаях рендерер должен пропускать кадры.
Название: EVR-CP и синхронизация
Отправлено: Aleksoid1978 от 10 ноября 2018, 10:18:15
По опциям - мое предложение следующее:
1 - VSync.
2 - встроенный VSync.

Пояснение:
1 - будет создаваться устройство с параметром D3DPRESENT_INTERVAL_ONE (Для эксклюзивного режима считаем что всегда этот режим активен).
2 - будет работать как сейчас VSync + "Аккуратный VSync". Нет смысла делать отдельно опцию "Аккуратный VSync".

Опции будут независимы друг от друга.
Название: EVR-CP и синхронизация
Отправлено: V0lt от 10 ноября 2018, 12:33:44
D3DPRESENT_INTERVAL_ONE не является VSync-ом. Название неправильное, только запутывает.

Добавлено: 2018-11-10 12:08:56

По поводу того что Альтернативны VSync бесполезен.
Он вообще то управляет D3DPRESENT_INTERVAL для оконного режима в случае отключенного Aero.
m_d3dpp.PresentationInterval = (bCompositionEnabled || m_bAlternativeVSync) ? D3DPRESENT_INTERVAL_IMMEDIATE : D3DPRESENT_INTERVAL_ONE;И борется с тирингом, который как раз возможен для такого случая.
IDC_DSVMR9ALTERNATIVEVSYNC      "Reduces tearing by bypassing the default VSync built into D3D."
Добавлено: 2018-11-10 12:33:44

Я в r4156 (https://sourceforge.net/p/mpcbe/code/4156/) удалил опцию "Альтернативный VSync". Ресурсы не трогал, а лишь скрыл контролы в коде.
Название: EVR-CP и синхронизация
Отправлено: judelaw от 11 ноября 2018, 00:27:39
немного погонял тестовые билды на вин10 с 1 и 2 экранами. Крутил ранее тестируемый файл хоккей (NHL 2018-11-04 RS TBL@OTT 720p60 National_SN.mkv). И хотя с 2-я экранами ситуация хуже, но все же, как и ранее на другом железе, остановился на v3(или 2). В режиме Flipex часто срывалась синхронизация, когда фокус переводил на другой экран или открывал во время воспроизведения какое либо окно. Срывалась и долго не восстанавливалась. На v3 даже если и срывалась (при загрузке системы внешними процессами), срыв был кратковременный и очень быстро восстанавливался и дальше шло ровно.
Короче v3 наиболее показалась удачная

svn же хуже всех тестовых версий

ПыСы. Случился забавный момент, Поначалу вообще не мог добиться нормальной синхронизации ни с каким билдом. Потом просто отключил один экран через win+p и включил заново. И глюки прекратились ))
Я к тому, что нюансов может быть много, но на DWM я бы полагался менее всего
Название: EVR-CP и синхронизация
Отправлено: V0lt от 11 ноября 2018, 20:56:57
Собрал сборку 1.5.3.4157 (https://yadi.sk/d/DIJLKO7mjjFUOg). Причина в том, что r4156 оказалась проблемной. Например для моей системы "Альтернативный VSync" нужен для нормального воспроизведения при отключенном Aero.
Бонусом сделал так, чтобы "Альтернативный VSync" переключал режим презентации и при включенном Aero, и на Win8+.
Название: EVR-CP и синхронизация
Отправлено: Aleksoid1978 от 12 ноября 2018, 03:52:31
По поводу определения реальной частоты экрана без VSync - как-то уж сильно дергано, не возможно понять. Ну и с показаниями когда включен VSync что-то уж не совпадает.

Добавлено: 2018-11-12 10:52:31

Вот предлагай свой вариант, про который говорил до этого - https://yadi.sk/d/8N0xRlnKRRf9Ew
В нем 2 опции VSync и Internal VSync.

Пояснение:
VSync - создание D3D устройства с параметром PresentationInterval = D3DPRESENT_INTERVAL_ONE. Т.е. в данном случае за сихронизацию(плавность вывод - да называем как хотим) отвечает Direc3D9.

Internal VSync - тот механизм VSync что сейчас в SVN + "Аккуратный VSync".

Опции не зависимы друг от друга, могут по отдельности и могут и дополнять друг-друга.

P.S. В папке 2 билда - второй немного отличается работой Internal VSync(если в SVN и в 1-ом билде в некоторых местах идут проверки на включенный DWM(Aero) - то во втором билде проверяется на PresentationInterval).

Почему решил именно так - да потому что в SVN  PresentationInterval = D3DPRESENT_INTERVAL_ONE невозможно "заюзать" без встроенного механизма VSync.  Ну и так же не зависит от DWM(Aero).
Название: EVR-CP и синхронизация
Отправлено: V0lt от 12 ноября 2018, 20:45:55
Цитата: Aleksoid1978По поводу определения реальной частоты экрана без VSync - как-то уж сильно дергано, не возможно понять. Ну и с показаниями когда включен VSync что-то уж не совпадает.
Хоть кто-то проверил :-) Больше или меньше показывает?

Добавлено: 2018-11-12 19:17:56

Сделал второй билд, с ним должно быть получше. А вообще надо значение ScanLines правильно определять, чтобы совсем точно было.


Добавлено: 2018-11-12 20:45:55

Поясню, что такое сканлинии.
Допустим есть разрешение 1680x1050. Оно будет хитро уложено как 1840x1088 (см. картинку).

Вот эти 1088 пикселей по высоте и есть искомые сканлинии.
По идее это значение надо как-то получить из системы, но плеер его считает.
Название: EVR-CP и синхронизация
Отправлено: Aleksoid1978 от 13 ноября 2018, 01:46:57
Эти самые скан линии могут быть разными для одного и того же разрешения, особенно когда создаёшь кастомное разрешение для правильной частоты :)

Добавлено: 2018-11-13 08:46:57

Второй билд по выводу реальной частоты экрана получше - но все равно намного хуже чем с VSync.
Вот у меня моник 60hz, с VSync во первых сами циферки(особенно после запятой) не так сильно скачут, во вторых почти всегда показывает 59.9хх периодами 60.0хх(примерно раз в 3-5 секунд).

В тестовом билде цифры скачут как сумашедшие, с 59 меняется на 60 наверное каждый кадр.
Название: EVR-CP и синхронизация
Отправлено: V0lt от 13 ноября 2018, 06:32:21
Сделал 3 билд в нем определяется количество сканлиний. Если определилось неправильно, то можно на время включить режим "VSync" и значение будет откорректировано.
Подергивания остались, но Я примерно знаю где подкрутить...
Название: EVR-CP и синхронизация
Отправлено: V0lt от 13 ноября 2018, 22:11:42
В общем собрал билд 5. Работает ровно.
Название: EVR-CP и синхронизация
Отправлено: Aleksoid1978 от 14 ноября 2018, 02:03:45
Ну да - 5 билд уже можно сказать отлично. Само по себе конечно такая быстрая "смена" циферок малость раздражает(в отличии от того же madVR) - но мы то рисуем каждый кадр.
Ну и если в madVR(на моем мониторе) выводится 60.000хх - то что в твоем билде, что с VSync - у нас меняется периодами с 59 на 60, и меняются 59.9хххх и 60.0хххх. Короче аккуратность меньше(или больше) :)

Но в любом случае - заливай.
Название: EVR-CP и синхронизация
Отправлено: judelaw от 14 ноября 2018, 16:13:29
если слишком жирное видео для компа или даже хоть какая то нагрузка "за пределами",  с рефрешрейт статистикой уже все печально
(http://jpegshare.net/thumbs/78/c7/78c7a82dc66737d2e4899d0ddd563cd1.jpg) (http://jpegshare.net/78/c7/78c7a82dc66737d2e4899d0ddd563cd1.png.html)

а вот нормальный файл, идет правильно, а в статистике рефреш постоянно хочет сравнятся с частотой кадров падая до 30 и постоянно прыгая с 30 до 60
(http://jpegshare.net/thumbs/c4/a3/c4a3d87fd4ad7d76a6601a50ed8e7514.jpg) (http://jpegshare.net/c4/a3/c4a3d87fd4ad7d76a6601a50ed8e7514.png.html)

____________________
с включенной галкой VSync циферки бегают медленней
Название: EVR-CP и синхронизация
Отправлено: Aleksoid1978 от 15 ноября 2018, 02:36:11
Пробуем "переработанный" вариант.
Циферки в нем бегают намного медленнее(значение меняется не чаще 10 раз в секунду), разброс намного меньше. Ну и по идее не должно быть неверных значений при высокой нагрузке на GPU при выводе изображения.

https://yadi.sk/d/XW0fCvK79eSOzw
Название: EVR-CP и синхронизация
Отправлено: usalex от 15 ноября 2018, 04:59:18
Цитата: Aleksoid1978Пробуем "переработанный" вариант.
Циферки в нем бегают намного медленнее
Да, зачетный билд.
Теперь стало, как в поте, если предположить, что в поте жестко включен альтернативный всинк и его даже нет в настройках.

Потестил в окне и в экслюзиве.
Стабильная плавность обеспечивается установкой галки "Альт.всинк" (без неё - дрожь проявляется). После установки альт.всинк плавность остаётся и не зависит от других галок.
Причем, в оконном режиме на весь экран графики остаются ровными, даже когда играюсь выдвиганием/задвиганием нижней панели.

В эксклюзиве, если установлена только одна галка "Альт.всинк" теперь при вызове на экран панельки таймлайна картинка остается плавной (раньше она дрожала, пока не уберешь панельку таймлайна).

Ну и циферки рефреша стабильнее стали.

В общем - нормуль.
Если завтра Евгений соберет х64 - там уже будут эти твои изменения?
Название: EVR-CP и синхронизация
Отправлено: Aleksoid1978 от 15 ноября 2018, 08:44:00
"Алтернативный VSync" влияет ТОЛЬКО на оконный режим, в эксклюзиве, грубо говоря, он всегда и так включен. Все последние изменения касались только оконного режима.

Добавлено: 2018-11-15 12:57:19

А вот, ради эксперимента, билд в котором частота обновления экрана считается без VSync точно так же как и с включенным VSync(используется один и тот же код).
https://yadi.sk/d/uQWIEyFnWnfanA

Кто заинтересован - сравните нагрузку на CPU/GPU 2 моих последних билда при выводе статистики без включения VSync, а есть ли разница(у себя не увидел, все в пределах погрешности 1-3% CPU).


Добавлено: 2018-11-15 15:44:00

А вот надо сравнить плавность проигрывания по сравнению с SVN.
Что изменено - добавил вызов DwmEnableMMCSS(), MS советует это делать для видео/аудио проигрывания.
https://yadi.sk/d/h7rvHaYcBMc6fw
Название: EVR-CP и синхронизация
Отправлено: judelaw от 15 ноября 2018, 11:18:32
Цитата: Aleksoid1978Пробуем "переработанный" вариант.
Циферки в нем бегают намного медленнее(значение меняется не чаще 10 раз в секунду), разброс намного меньше. Ну и по идее не должно быть неверных значений при высокой нагрузке на GPU при выводе изображения.

https://yadi.sk/d/XW0fCvK79eSOzw


Отличный билд, понравилось всё! :cool:
Название: EVR-CP и синхронизация
Отправлено: V0lt от 15 ноября 2018, 17:56:18
Aleksoid1978, а как ты сделал не чаще 10 раз в секунду? У меня только количество рефрешей измеряло, это дает разный интервал для разных частот.

judelaw, загрузку лучше проверять без Аккуратного VSync.

Добавлено: 2018-11-15 17:56:18

Чем вы нагружаете, чтобы измеритель частоты дисплея начинал выдавать заниженные значения?
Название: EVR-CP и синхронизация
Отправлено: judelaw от 15 ноября 2018, 18:24:57
Цитата: V0ltЧем вы нагружаете, чтобы измеритель частоты дисплея начинал выдавать заниженные значения?
любым видео которое не тянет железо
в моем случае вполне достаточно 4k 60p
Название: EVR-CP и синхронизация
Отправлено: V0lt от 15 ноября 2018, 19:33:24
Я 8k в софте запускаю, тогда заметна посадка с 75 до 60 Гц.

Добавлено: 2018-11-15 19:33:24

А если все нормально, то текущие версии показывают стабильные 74,99*** Гц. Непонятно почему у вас скачет, что приходиться по 10 секунд накапливать.
Удалил 4169. Выложил 4170 (https://yadi.sk/d/DIJLKO7mjjFUOg).
(http://jpegshare.net/thumbs/7b/86/7b865953b88ec4e13ba14fd8ac82bcfd.jpg) (http://jpegshare.net/7b/86/7b865953b88ec4e13ba14fd8ac82bcfd.jpg.html)
Название: EVR-CP и синхронизация
Отправлено: usalex от 15 ноября 2018, 19:37:28
Цитата: Aleksoid1978А вот надо сравнить плавность проигрывания по сравнению с SVN.
Что изменено - добавил вызов DwmEnableMMCSS(), MS советует это делать для видео/аудио проигрывания.
https://yadi.sk/d/h7rvHaYcBMc6fw
Плавность такая же, как в svn 4167, но, вроде, на пару процентов меньше нагрузка на гпу.

Для плавности наличие галки альт.всинк обязательно.
Если к ней ещё чекнуть обычный всинк, то плавность периодически сбивается. Это относится, как к svn, так и к твоим последним тестовым билдам. Выше я говорил, что после установки альт.всинк плавность сохраняется, независимо от других галок, но сейчас обнаружилось, что это не так - нельзя всинк чекать.
Название: EVR-CP и синхронизация
Отправлено: V0lt от 15 ноября 2018, 22:23:14
Рублю с плеча, выкладываю mpc-be_4170_AltSync_woAero_7 (https://yadi.sk/d/DIJLKO7mjjFUOg). Здесь опция AltSync работает только для Win7 без Aero, в остальных случаях используется наиболее перспективный режим синхронизации.
Прошу оценить, правильный ли шаг хочу сделать?
Название: EVR-CP и синхронизация
Отправлено: usalex от 16 ноября 2018, 00:26:23
Цитата: V0ltЗдесь опция AltSync работает только для Win7 без Aero, в остальных случаях используется наиболее перспективный режим синхронизации.
Не знаю, какой метод в этом билде применяется в случае W10, но плавность без галок есть (правда, словил все же единичное дрожание). А с галкой всинк плавность изредка сбивается.

Цитата: V0ltПрошу оценить, правильный ли шаг хочу сделать?
Для этого нужны длительные тесты на разных конфигах.
Вот мне, например, не понравилось, что во время просмотра частота ГПУ иногда подскакивала до максимума без видимых причин. Может это случайные проявления были... но на svn я такого не замечал.
Название: EVR-CP и синхронизация
Отправлено: Aleksoid1978 от 16 ноября 2018, 01:27:10
Если ты хочешь альтернатив, грубо говоря, включить на постоянку при работе DWM - то нет, такого делать не надо. Сам же про это писал - что же тогда делать если частота видео больше частоты экрана. Да и для просмотра на мониторе, да ещё и в окне за глаза хватает обычного режима без всяких галок.

Добавлено: 2018-11-16 08:27:10

Лучше добавь опцию для выбора режима COPY/FLIPEX.
Название: EVR-CP и синхронизация
Отправлено: V0lt от 16 ноября 2018, 06:34:57
Aleksoid1978
Я писал, что про такие режимы забывать нельзя, когда ты говорил, "а зачем вообще такое смотреть".
Тестовый был справляется с таким видео хорошо.