Производительность рендеринга в случае встроенных контейнеров

У меня есть приложение, которое отображает вывод веб-камеры в виджете с использованием SDL. Я получаю вывод порядка 20-25 кадров в секунду с этим.

Затем этот вывод встраивается в контейнер QX11EmbedWidget, созданный в другом процессе. (или в другой реализации, использующей XLib, я преобразовал этот вывод окна SDL в собственное окно X11).

Результат, который я получаю в этом случае, составляет около 2-5 кадров в секунду.

Платформа: Ubuntu на I.MX-53

Q1. Может кто-нибудь дать объяснение этой разницы в производительности для этих двух случаев.

Q2. Когда мы встраиваем вывод приложения в другое окно, происходит ли рендеринг дважды? Один раз приложением, которое внедряется, а затем приложениями, в которые это окно было встроено?


person Amit Tomar    schedule 20.04.2012    source источник


Ответы (1)


Q1. Может кто-нибудь дать объяснение этой разницы в производительности для этих двух случаев.

Нет, не совсем. Возможно, встраивание окон SDL не работает. Или ошибка в X-сервере на вашей платформе. Это может быть что угодно.

Q2. Когда мы встраиваем вывод приложения в другое окно, происходит ли рендеринг дважды? Один раз приложением, которое встраивается, а потом приложениями, в которые это окно встраивалось?

Нет, рендеринг выполняется только во встроенном окне.

Встраивание окна изменит только родителя.

Затем этот вывод встраивается в контейнер QX11EmbedWidget, созданный в другом процессе.

В качестве контейнера следует использовать QX11EmbedContainer, а не QX11EmbedWidget.

person BЈовић    schedule 20.04.2012
comment
@V Jovic Предположим, у меня есть приложения A и B как в Qt, так и вложение вывода A в B. Если я пропущу вызов widget1.show() в приложении A [которое, как я полагаю, внутренне начинает рендеринг для него?] , тогда я не доберусь до видеть вывод, даже если я делаю второе приложение? И извините, я написал QX11EmbedWidget по ошибке. - person Amit Tomar; 20.04.2012
comment
@AmitTomar Вы должны вызвать show() для контейнера (иначе вы ничего не увидите). - person BЈовић; 20.04.2012
comment
@V Jovic Если я вызову show() только для контейнера, а не для встроенного виджета, я ничего не увижу. Если я вызываю его только для встроенного виджета, а не для контейнера, то тоже ничего не вижу. Если я вызываю его для обоих, только тогда я вижу результат. Разве я не должен сделать из этого вывод, что рендеринг выполняется как в контейнере, так и во встроенном виджете? - person Amit Tomar; 20.04.2012
comment
@AmitTomar Нет, я в замешательстве. Вы сказали, что создаете окно с помощью SDL, а затем встраиваете его с помощью QX11EmbedContainer. Вы должны вызвать show() для объекта QX11EmbedContainer. И вы должны отображать что-то в окне SDL. Если вы этого не сделаете, вы ничего не увидите. - person BЈовић; 20.04.2012
comment
@AmitTomar Если вы используете виджет qt для создания окна, то show() вызовет для него XMapWindow. Без него его не будет видно. Вызов show для QX11EmbedContainer сделает его видимым (если только это не окно, где он также вызовет XMapWindow для него). Итак, вы должны вызвать show на обоих - person BЈовић; 20.04.2012