Я пишу видеоплеер с использованием ffmpeg (только для Windows, Visual Studio 2015, 64-битная компиляция).С обычными видео (до 4K @ 30FPS) это работает довольно хорошо.Но с моей максимальной целью - 4K @ 60FPS, это терпит неудачу.Декодирование все еще достаточно быстрое, но когда дело доходит до преобразования YUV / BGRA, оно просто не достаточно быстрое, даже если оно выполняется в 16 потоков (по одному потоку на кадр на компьютере с 16/32 ядрами).
Итак, в качестве первой контрмеры я пропустил преобразование некоторых кадров и получил стабильную частоту кадров ~ 40 таким образом.Сравнивая две версии в Concurrency Visualizer, я обнаружил странную проблему, причину которой я не знаю.
.
Вот изображение версии frameskip: Вы видите, что преобразование довольно быстрое (в среднем примерно ~ 35 мс). Таким образом, поскольку используется несколько потоков, оно также должно быть достаточно быстрым для 60FPS, но это не так!
.
Изображение версии без frameskip показывает, почему: Преобразование одного кадра стало в десять раз медленнее, чем раньше (в среднем примерно ~ 350 мс).Теперь большая нагрузка на многие ядра, конечно, приведет к незначительному замедлению на ядро из-за снижения турбо - скажем, 10 или 20%.Но никогда не бывает чрезмерного замедления на ~ 1000%.
.
Интересная деталь в том, что трассировка стека в не-frameskip-версии показывает некоторую активность системы, которую я не совсем понимаю - начиная сntoskrnl.exe!KiPageFault+0x373
.Нет никаких исключений, других сообщений об ошибках или чего-то подобного - это просто становится очень медленным.
Редактировать: коллега только что сказал мне, что это похоже на проблему с памятью с выгруженной памятью на первый взгляд - но мое использование памятинизкий (менее 1 ГБ и более 20 ГБ свободно)
Может кто-нибудь сказать мне, что может быть причиной этого?