Моя проблема может показаться неопределенной без кода, но на самом деле это не так.
Итак, у меня есть почти правильно работающий виджет, который отображает видеокадры.
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 с динамическими текстурами показывает нормальный рост использования ЦП - это приблизительно сумма для количества окон.
В любом случае, мне становится довольно сложно описать дело, поэтому я надеюсь, что кто-то мог решить подобную проблему раньше и поделиться своим опытом со мной.Буду признателен за любые идеи, как справиться с описанной загадкой.
Я могу добавить любые фрагменты кода, если это поможет.