MPC VR - Синхронизация (плавность) кадров

Автор V0lt, 10 мая 2021, 20:14:23

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

V0lt

Неспешная тема по проблемам синхронизации (плавности) вывода кадров в MPC Video Renderer

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

IDXGISwapChain::GetFrameStatistics - в оконном режиме на любом дисплее и в полном экране на втором дисплее не регистрирует каждый второй V-Blank. Частота кадров ограничивается половиной частоты дисплея.
IDXGIOutput::GetFrameStatistics - не проверялся.
DwmFlush - иногда ожидает дольше чем требуется. Частота кадров просаживается с 60 до 40 fps.
D3DKMTWaitForVerticalBlankEvent - ...
IDXGIOutput::WaitForVBlank - ...

Тестовые сборки

V0lt

#1
mpcvr_1707_dwmflush_1
Тестовый билд с ожиданием вывода кадра после вызова Present. Ожидание реализовано с помощью функции DwmFlush.

MPCfan

V0lt,
Было же всё плавно. С этим DwmFlush Интел вроде пронесло, а вот по Нвидии не прошло > https://yadi.sk/i/b7yb5jZpKiEswA

V0lt

#3
MPCfan
У себя на Win8.1 вижу следующие проблемы:
1. Видео 119,88 fps на дисплее 59 Гц в режиме D3D11 Flip неприятно дергается.
2. При удвоении кадров (интелейс) до 59,94 fps на дисплее 59 Гц в режиме Flip часто (не всегда) вижу пилу на графике. На плавность это не влияет, но говорит о том, что измеренное время вывода кадра некорректное.

Билд mpcvr_1707_dwmflush_1 указанные проблемы у меня решает. Повторюсь - билд тестовый.

Добавлено:
Да. В этом билде есть странная проблема, когда при воспроизведении видео 59,94/60 fps скорость кадров может эпизодически просаживаться до 40 fps.

MPCfan

V0lt,
Сейчас проверил на TV c автопереключалкой. Всё вроде нормально и на Intel и на Nvidia, даже интерлейс с удвоением. Только с Nvidia на телике файл с 59,940 fps воспроизводится вообще со скоростью в 29,970 fps, типа инверсия интерлейсу с удвоением > https://yadi.sk/d/beu9mAD3fETJpw

wanezhiling

#5
The slow reason of MPC VR is its design, this conclusion is made by Aleksoid, he knew it. :)

https://i.postimg.cc/33Gyk5pJ/QQ-20210511131528.jpg

https://i.postimg.cc/Qs6KPqhs/QQ-20210511131441.jpg

V0lt

#6
mpcvr_1708_D3DKMTWaitForVerticalBlankEvent_1 и mpcvr_1708_D3DKMTWaitForVerticalBlankEvent_2
Тестовые билды с ожиданием V-Blank перед и после вызова Present соответсвенно.
В обих сборках ожидание реализовано с помощью функции D3DKMTWaitForVerticalBlankEvent.

Доп. информация: Correct way to wait for VBLANK on windows 10 in windowed mode

MPCfan

V0lt,
Этот тестовый билд плавный, как и простой SVN. Но кажется не таким шустрым. Например - пытался открыть ютюбовскую ссылку с 50 fps на мониторе с 60HZ, с первого раза максимальный fps получился где-то 20 fps, повторно попытался открыть, тогда и удалось получить эти 50 fps. Может совпадение. Также медленнее отходит после перехода в полноэкранный режим, особенно с переключалкой, в смысле дольше поддёргивает в начале воспроизведения. И с некоторыми файлами 29,970i cтало похуже при воспроизведении на ТВ.

V0lt

Цитата: MPCfan от 11 мая 2021, 21:43:24Этот тестовый билд плавный, как и простой SVN. Но кажется не таким шустрым.
Думаю, для текущего кода сам факт ожидания уменьшает "шустрость".
В любом случае вариант с D3DKMTWaitForVerticalBlankEvent пока показывает лучший результат. Добавил второй билд с этой функцией.

Позже попробую другие варианты...

MPCfan

#9
V0lt,
Со вторым тест- билдом VBlank такое же поведение с файлами 60 fps на Nvidia, как у тест-билда DwmFlush. Скорость короткими интервалами снижается до 40 fps. На Intel нормально с 60 fps, но заметил, что звук с видео не совпадает.
P.S. На счёт синхронизации звука и видео ошибся. Забыл отключить задержку звука в настройках. Вчера нужно было, а сегодня забыл про этот момент.

V0lt

#10
Выложил сборки mpcvr_1709_IDXGIOutput-WaitForVBlank_1 и mpcvr_1709_IDXGIOutput-WaitForVBlank_2.
В обоих сборках ожидание V-Blank реализовано с помощью функции IDXGIOutput::WaitForVBlank до и после Present соответсвенно. Работает только для режима DX11.

Прошу потестировать в различных конфигурациях на разных дисплеях в режиме DX11 по сравнению с 0.5.3.1707.

MPCfan

#11
V0lt,
Решил начать сразу с mpcvr_1709_IDXGIOutput-WaitForVBlank_2
https://yadi.sk/i/McIm-6buVz1qnA просадка до 40 fps c discard на Nvidia на мониторе ноутбука 60 HZ
https://yadi.sk/i/Vr7AZ7wfoGiJvw  просадка до 30 fps c flip на Nvidia на мониторе ноутбука 60 HZ
P.S. Проверил mpcvr_1709_IDXGIOutput-WaitForVBlank_1. По плавности не отличается от простого SVN . C интерлейсом SVN кажется получше будет на ТВ.

V0lt

#12
MPCfan, спасибо!
У меня указанные сборки практически одинаково работают, но в одном случае WaitForVBlank_1 оказался лучше.

Добавил сборку mpcvr_1709_IDXGIOutput-WaitForVBlank_1+option.
Немного переделал код, не стал использовать IDXGIOutput1, т.к. просто IDXGIOutput достаточно.
Добавил опцию, которую можно применять на лету. Но в некоторых ситуациях при изменении опции ничего с плавностью не происходит и приходится дополнительно делать перемотку.

MPCfan

V0lt,
+option это хорошо.  C mpcvr_1709_IDXGIOutput-WaitForVBlank_1+option проблем нет.

V0lt

Опция добавлена в 1710 (249f4a8).

Теперь график адекватнее при заметном несовпадении частот.
60 fps на дисплее 75 Гц. Без опции и с опцией.