我的qtwayland合成器测试有一个奇怪的问题。它似乎只适用于qt c++客户端。Qml客户端以死锁结束,事件处理停止(对于客户端)。我已经更改了这个https://doc.qt.io/archives/qt-5.11/qtwaylandcompositor-qwindow-compositor-example.html示例,并添加了以下功能:
void Compositor::onSurfaceCreated(QWaylandSurface *surface)
{
connect(surface, &QWaylandSurface::subsurfacePositionChanged, this, &WaylandInterface::onSubsurfacePositionChanged);
QQuickWindow *window = new QQuickWindow();
window->resize( 400, 400);
window->setVisible(true);
QWaylandOutput* output = new QWaylandOutput( this, window );
QCoreApplication::processEvents();
View *view = new View(this);
view->setSurface(surface);
view->setOutput(output);
view->m_window = window;
m_views << view;
connect(surface, &QWaylandSurface::surfaceDestroyed, view, [view] {
view->m_window->requestUpdate();
} );
connect(surface, &QWaylandSurface::hasContentChanged, this, &WaylandInterface::surfaceHasContentChanged);
connect(surface, &QWaylandSurface::hasContentChanged, view, [view] {
view->m_window->requestUpdate();
} );
connect(surface, &QWaylandSurface::redraw, view, [view] {
view->m_window->requestUpdate();
} );
QWaylandQuickItem * surfacItem = new QWaylandQuickItem( view->m_window->contentItem() );
surfacItem->setSurface( surface );
surfacItem->setOutput( view->output() );
surfacItem->setPaintEnabled(true);
surfacItem->setInputEventsEnabled(true);
connect(surface, &QWaylandSurface::offsetForNextFrame, view, &View::onOffsetForNextFrame);
connect(view, &QWaylandView::surfaceDestroyed, this, &WaylandInterface::viewSurfaceDestroyed);
}对于c++客户端,它创建一个窗口并将客户端嵌入其中,而qml客户端没有响应。创建窗口、输出和QuickItem的顺序是否正确?我错过了什么吗?
谢谢,凯恩
发布于 2019-12-20 15:34:03
c++客户端使用单线程渲染,而qml客户端使用渲染线程。当一个expose事件被发送到渲染器时,qtwayland将阻止它,除非命令输出释放互斥锁。渲染器锁定帧缓冲区时,它正在等待服务器,而主线程正在等待渲染线程=>死锁。
回调可以通过output->frameStarted();//渲染前output->sendFrameCallback();//渲染后发送
https://stackoverflow.com/questions/59411842
复制相似问题