避免linux + QT中的屏幕撕裂

Posted

技术标签:

【中文标题】避免linux + QT中的屏幕撕裂【英文标题】:Avoiding screen tearing in linux + QT 【发布时间】:2015-09-28 00:59:27 【问题描述】:

据我了解,X11 不支持双/三缓冲机制以避免屏幕撕裂。所以我尝试使用 openGL 小部件,然后我明白没有任何支持 openGL+raspberry pi +qt4。

我所要求的只是一个非常基本的事情,从摄像机捕捉帧,处理它们,并在屏幕上显示,我变得非常!坏的屏幕撕裂。

我知道 QT5+WAYLAND+PI 确实有某种(?)对 openGL 的支持,这会帮助我解决这个问题吗?(相当容易,我的意思是我的应用程序没有大的变化!!)有什么我还能做什么? (除了更改X11的源代码...):)

【问题讨论】:

【参考方案1】:

如果您的目标是 Raspberry Pi,我建议您使用 eglfs Qt 5 插件,这意味着 OpenGL 通过 EGL 而没有 X11。 EGL 可防止撕裂,性能非常好。

【讨论】:

我没有使用 openGL 的经验,也找不到 openGL+raspberry 的示例。基本上我有一个应用程序,它有几个按钮和一个 QLabel(显示相机捕捉),我的应用程序一直处于全屏模式(女巫很好,因为它是这个 QT5 EGFL 插件的限制之一..),你能帮我举个例子吗? (我找不到任何东西),将我的应用程序转换为 openGL 有多复杂? (它有一个非常基本的 gui) 没有 OpenGL 代码。就像在 X11 上一样使用 Qt 代码。使用 QLabel 使用来自设备的正确转换数据设置 QPixmap。 Qt 透明地使用OpenGL。或者更好地将数据移动到 QML 并在 QML 中实现 UI:再次没有 OpenGL 代码。 所以我只是在使用我的 qt4 应用程序 + 小改动(标题更改),这一切都应该工作吗?我如何使用这个“qt5 egfl 插件”?抱歉这些愚蠢的问题.. 对基于 OpenGL 的窗口有进一步的限制。从 Qt 5.3 开始,eglfs 支持单个全屏 GL 窗口(例如,基于 OpenGL 的 QWindow、QQuickView 或 QGLWidget)。不支持打开额外的 OpenGL 窗口或将此类窗口与基于 QWidget 的内容混合,并将终止应用程序并显示错误消息。 (来自文档),那么添加 qlabel 将如何工作?父亲更多我如何集成按钮? 如果您只是创建一个 QLabel 并且不与其他类型的表面混合,则添加它是有效的。请参考文档:doc.qt.io/qt-5/embedded-linux.html。 Qt Quick 是最好的方法,但您的用例非常简单。可以通过实例化适当的类来使用按钮,例如 QPushButton。

以上是关于避免linux + QT中的屏幕撕裂的主要内容,如果未能解决你的问题,请参考以下文章

Linux 用户应该使用哪种 IDE/编译器组合在 Windows 上构建 Qt 应用程序,同时避免使用 MS Visual Studio?

每帧分配一个新缓冲区以防止屏幕撕裂

使用 QT 平滑屏幕过渡

Qt:当多个排队信号调用同一个槽时如何避免死锁

即使在我的.pro文件中包含“testlib”包(用于qWait())之后,如何避免Qt应用程序中的控制台窗口?

YouTube API - 避免浏览器中的身份验证屏幕