QOpenGLWidget производительность рендеринга видео в нескольких процессах - PullRequest
0 голосов
/ 23 ноября 2018

Моя проблема может показаться неопределенной без кода, но на самом деле это не так.

Итак, у меня есть почти правильно работающий виджет, который отображает видеокадры.

Qt 5.10 и подклассы QOpenGLWidget работали нормально, я не делал никаких сложных оптимизаций - есть две текстуры и пара шейдеров, конвертирующих формат пикселей YUV в RGB - glTexImage2D() + шейдеры, без буферов.

Видеокадры получены от FFMPEG, они показывают отличную производительность благодаря аппаратному ускорению ... когда имеется только одно видеоокно.

Программным обеспечением является "видеостена" -несколько независимых окон видео на одном экране.Конечно, многопоточность была бы предпочтительным решением, но унаследованная версия пока остается неизменной.

Итак, 1 окно с видео Full HD потребляет ~ 2% ЦП и 8-10% ГПнезависимо от размера окна.Но 7-10 похожих окон, запущенных из одного и того же исполняемого файла в одно и то же время, потребляют почти всего процессора .Моя математика говорит, что 2 x 8! = 100 ...

Мои лучшие догадки:

  • Это проблема декодера ffmpeg, аппаратное ускорение все еще не волшебство, некоторый аппаратный конвейеркиоски
  • 7-8-9 независимых контекстов OpenGL стоят намного больше, чем 1 стоимость x N
  • Я не использую PUBO или некоторые другие сложные методы для улучшения рендеринга OpenGL.Это все еще ничего не объясняет, но, по крайней мере, это предположение

Поведение такое же, как в Ubuntu, где для декодирования используются разные кодеки (я имею в виду, что использование кодеков с GPU-ускорением или CPU-ускорением не имеет значения!)Таким образом, становится более вероятным, что я что-то упускаю из-за OpenGL ... или нет, потому что запуск 6-7 примеров Qt с динамическими текстурами показывает нормальный рост использования ЦП - это приблизительно сумма для количества окон.

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

Я могу добавить любые фрагменты кода, если это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...