1

Тема: EVR-CP и синхронизация

Суть проблемы.
В современных Windows за вывод изображения отвечает Desktop Window Manager. Благодаря ему мы забыли про тиринг при воспроизведении видео. Но есть и проблема. Мы почти не контролируем время отрисовки кадра, т.к. 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)

Сборки
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 - небольшая переделка кода, исправлена опечатка приводящая к периодическим подергиваниям.

Сообщение будет дополняться...

2

Re: EVR-CP и синхронизация

Сейчас в оконном режиме используется значение D3DPRESENT_INTERVAL_IMMEDIATE для D3DPRESENT_PARAMETERS::PresentationInterval. Т.е. рендерер выводит кадр и ничего не ждет. За процесс синхронизации отвечает DWM. Все красиво на бумаге - на деле иногда не очень.

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

Позже примерно накидаю новые опции(в картинках) и пояснения.

I7 2600K@4.2 / Asrock P67 Extreme 4 Gen 3 / Kingston HyperX 8Gb 1866 (4x2) Kit / GIGABYTE GTX 960 / BenQ EW2430 / LG 47LM620T / Yamaha RX-V471 + NS-555 + NS-C444 + NS-333 + YST-SW215

3

Re: EVR-CP и синхронизация

Aleksoid1978, не так. Про вертикальный луч монитора лучше вообще не вспоминать, он только больше запутывает.

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

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

Отредактировано

4

Re: EVR-CP и синхронизация

Про ожидание луча написал сам M$

I7 2600K@4.2 / Asrock P67 Extreme 4 Gen 3 / Kingston HyperX 8Gb 1866 (4x2) Kit / GIGABYTE GTX 960 / BenQ EW2430 / LG 47LM620T / Yamaha RX-V471 + NS-555 + NS-C444 + NS-333 + YST-SW215

5

Re: EVR-CP и синхронизация

Я знаю, везде про VBlack написано. И везде сказано, что обратный луч - это условность (видеокарты и мониторы сейчас иначе работают).
И пока ты не начнешь лезь в функции ловли VBlack-ов, лучше думать о простой "смене кадра".

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

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

Надо:
1. Видео с частотой больше, чем частота дисплея.
2. Ускоренное воспроизведение видео.
3. Запустил видео с частотой 23p на дисплее 23 Гц, а в нем появляется рекламная вставка на 59i.
Во всех случаях рендерер должен пропускать кадры.

6

Re: EVR-CP и синхронизация

По опциям - мое предложение следующее:
1 - VSync.
2 - встроенный VSync.

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

Опции будут независимы друг от друга.

I7 2600K@4.2 / Asrock P67 Extreme 4 Gen 3 / Kingston HyperX 8Gb 1866 (4x2) Kit / GIGABYTE GTX 960 / BenQ EW2430 / LG 47LM620T / Yamaha RX-V471 + NS-555 + NS-C444 + NS-333 + YST-SW215

7

Re: EVR-CP и синхронизация

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 удалил опцию "Альтернативный VSync". Ресурсы не трогал, а лишь скрыл контролы в коде.

8

Re: EVR-CP и синхронизация

немного погонял тестовые билды на вин10 с 1 и 2 экранами. Крутил ранее тестируемый файл хоккей (NHL 2018-11-04 RS TBL@OTT 720p60 National_SN.mkv). И хотя с 2-я экранами ситуация хуже, но все же, как и ранее на другом железе, остановился на v3(или 2). В режиме Flipex часто срывалась синхронизация, когда фокус переводил на другой экран или открывал во время воспроизведения какое либо окно. Срывалась и долго не восстанавливалась. На v3 даже если и срывалась (при загрузке системы внешними процессами), срыв был кратковременный и очень быстро восстанавливался и дальше шло ровно.
Короче v3 наиболее показалась удачная

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

ПыСы. Случился забавный момент, Поначалу вообще не мог добиться нормальной синхронизации ни с каким билдом. Потом просто отключил один экран через win+p и включил заново. И глюки прекратились ))
Я к тому, что нюансов может быть много, но на DWM я бы полагался менее всего

9

Re: EVR-CP и синхронизация

Собрал сборку 1.5.3.4157. Причина в том, что r4156 оказалась проблемной. Например для моей системы "Альтернативный VSync" нужен для нормального воспроизведения при отключенном Aero.
Бонусом сделал так, чтобы "Альтернативный VSync" переключал режим презентации и при включенном Aero, и на Win8+.

10

Re: EVR-CP и синхронизация

По поводу определения реальной частоты экрана без 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).

I7 2600K@4.2 / Asrock P67 Extreme 4 Gen 3 / Kingston HyperX 8Gb 1866 (4x2) Kit / GIGABYTE GTX 960 / BenQ EW2430 / LG 47LM620T / Yamaha RX-V471 + NS-555 + NS-C444 + NS-333 + YST-SW215

11

Re: EVR-CP и синхронизация

Aleksoid1978 пишет:

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

Хоть кто-то проверил :-) Больше или меньше показывает?

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

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


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

Поясню, что такое сканлинии.
Допустим есть разрешение 1680x1050. Оно будет хитро уложено как 1840x1088 (см. картинку).
http://jpegshare.net/thumbs/31/da/31daeb751e2fe2030b4279b7890f3716.jpg http://jpegshare.net/thumbs/ee/4c/ee4c04be604464c2f2d2d5bac4275b3e.jpg
Вот эти 1088 пикселей по высоте и есть искомые сканлинии.
По идее это значение надо как-то получить из системы, но плеер его считает.

12

Re: EVR-CP и синхронизация

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

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

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

В тестовом билде цифры скачут как сумашедшие, с 59 меняется на 60 наверное каждый кадр.

I7 2600K@4.2 / Asrock P67 Extreme 4 Gen 3 / Kingston HyperX 8Gb 1866 (4x2) Kit / GIGABYTE GTX 960 / BenQ EW2430 / LG 47LM620T / Yamaha RX-V471 + NS-555 + NS-C444 + NS-333 + YST-SW215

13

Re: EVR-CP и синхронизация

Сделал 3 билд в нем определяется количество сканлиний. Если определилось неправильно, то можно на время включить режим "VSync" и значение будет откорректировано.
Подергивания остались, но Я примерно знаю где подкрутить...

14

Re: EVR-CP и синхронизация

В общем собрал билд 5. Работает ровно.

15

Re: EVR-CP и синхронизация

Ну да - 5 билд уже можно сказать отлично. Само по себе конечно такая быстрая "смена" циферок малость раздражает(в отличии от того же madVR) - но мы то рисуем каждый кадр.
Ну и если в madVR(на моем мониторе) выводится 60.000хх - то что в твоем билде, что с VSync - у нас меняется периодами с 59 на 60, и меняются 59.9хххх и 60.0хххх. Короче аккуратность меньше(или больше) smile

Но в любом случае - заливай.

I7 2600K@4.2 / Asrock P67 Extreme 4 Gen 3 / Kingston HyperX 8Gb 1866 (4x2) Kit / GIGABYTE GTX 960 / BenQ EW2430 / LG 47LM620T / Yamaha RX-V471 + NS-555 + NS-C444 + NS-333 + YST-SW215

16 (изменено: judelaw, 2018-11-14 17:05:17)

Re: EVR-CP и синхронизация

если слишком жирное видео для компа или даже хоть какая то нагрузка "за пределами",  с рефрешрейт статистикой уже все печально
http://jpegshare.net/thumbs/78/c7/78c7a82dc66737d2e4899d0ddd563cd1.jpg

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

____________________
с включенной галкой VSync циферки бегают медленней

17

Re: EVR-CP и синхронизация

Пробуем "переработанный" вариант.
Циферки в нем бегают намного медленнее(значение меняется не чаще 10 раз в секунду), разброс намного меньше. Ну и по идее не должно быть неверных значений при высокой нагрузке на GPU при выводе изображения.

https://yadi.sk/d/XW0fCvK79eSOzw

I7 2600K@4.2 / Asrock P67 Extreme 4 Gen 3 / Kingston HyperX 8Gb 1866 (4x2) Kit / GIGABYTE GTX 960 / BenQ EW2430 / LG 47LM620T / Yamaha RX-V471 + NS-555 + NS-C444 + NS-333 + YST-SW215

18 (изменено: usalex, 2018-11-15 05:02:12)

Re: EVR-CP и синхронизация

Aleksoid1978 пишет:

Пробуем "переработанный" вариант.
Циферки в нем бегают намного медленнее

Да, зачетный билд.
Теперь стало, как в поте, если предположить, что в поте жестко включен альтернативный всинк и его даже нет в настройках.

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

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

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

В общем - нормуль.
Если завтра Евгений соберет х64 - там уже будут эти твои изменения?

19

Re: EVR-CP и синхронизация

"Алтернативный 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

I7 2600K@4.2 / Asrock P67 Extreme 4 Gen 3 / Kingston HyperX 8Gb 1866 (4x2) Kit / GIGABYTE GTX 960 / BenQ EW2430 / LG 47LM620T / Yamaha RX-V471 + NS-555 + NS-C444 + NS-333 + YST-SW215

20

Re: EVR-CP и синхронизация

Aleksoid1978 пишет:

Пробуем "переработанный" вариант.
Циферки в нем бегают намного медленнее(значение меняется не чаще 10 раз в секунду), разброс намного меньше. Ну и по идее не должно быть неверных значений при высокой нагрузке на GPU при выводе изображения.

https://yadi.sk/d/XW0fCvK79eSOzw


Отличный билд, понравилось всё! cool

21

Re: EVR-CP и синхронизация

Aleksoid1978, а как ты сделал не чаще 10 раз в секунду? У меня только количество рефрешей измеряло, это дает разный интервал для разных частот.

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

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

Чем вы нагружаете, чтобы измеритель частоты дисплея начинал выдавать заниженные значения?

22 (изменено: judelaw, 2018-11-15 18:26:04)

Re: EVR-CP и синхронизация

V0lt пишет:

Чем вы нагружаете, чтобы измеритель частоты дисплея начинал выдавать заниженные значения?

любым видео которое не тянет железо
в моем случае вполне достаточно 4k 60p

23

Re: EVR-CP и синхронизация

Я 8k в софте запускаю, тогда заметна посадка с 75 до 60 Гц.

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

А если все нормально, то текущие версии показывают стабильные 74,99*** Гц. Непонятно почему у вас скачет, что приходиться по 10 секунд накапливать.
Удалил 4169. Выложил 4170.
http://jpegshare.net/thumbs/7b/86/7b865953b88ec4e13ba14fd8ac82bcfd.jpg

24

Re: EVR-CP и синхронизация

Aleksoid1978 пишет:

А вот надо сравнить плавность проигрывания по сравнению с SVN.
Что изменено - добавил вызов DwmEnableMMCSS(), MS советует это делать для видео/аудио проигрывания.
https://yadi.sk/d/h7rvHaYcBMc6fw

Плавность такая же, как в svn 4167, но, вроде, на пару процентов меньше нагрузка на гпу.

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

25

Re: EVR-CP и синхронизация

Рублю с плеча, выкладываю mpc-be_4170_AltSync_woAero_7. Здесь опция AltSync работает только для Win7 без Aero, в остальных случаях используется наиболее перспективный режим синхронизации.
Прошу оценить, правильный ли шаг хочу сделать?