我正在开发一个简单的 QML
应用程序,注意到与例如 QtWidgets
窗口相比,调整和移动 QML
窗口会产生难看的闪烁。
因此,我创建了两个测试应用程序来展示差异:
Qt Widgets:
QML:
如您所见,QML
版本的应用程序闪烁得非常难看,而 QtWidgets
版本则没有。当您的 UI 变得复杂时,这种情况会变得更加糟糕。
您对此有何了解?这是一个 bug 吗?是否有任何修复或解决此问题的方法?
我正在开发一个简单的 QML
应用程序,注意到与例如 QtWidgets
窗口相比,调整和移动 QML
窗口会产生难看的闪烁。
因此,我创建了两个测试应用程序来展示差异:
Qt Widgets:
QML:
如您所见,QML
版本的应用程序闪烁得非常难看,而 QtWidgets
版本则没有。当您的 UI 变得复杂时,这种情况会变得更加糟糕。
您对此有何了解?这是一个 bug 吗?是否有任何修复或解决此问题的方法?
你可以尝试这个:
int main(int argc, char* argv[]) {
QCoreApplication::setAttribute(Qt::AA_UseOpenGLES);
or
QCoreApplication::setAttribute(Qt::AA_UseSoftwareOpenGL);
第一个选项使用OpenGl2DirecX角度库(像Google Chrome一样)
第二个选项通过软件仿真使用OpenGL ...对于小程序非常好用,并且与旧操作系统如Windows XP完全兼容。
注意:您可以尝试使用Qt 5.7和新的Qtquick.Controls 2.0...性能更好... https://blog.qt.io/blog/2016/06/10/qt-quick-controls-2-0-a-new-beginning/
从WM发送了_NET_WM_SYNC_REQUEST,现在大小正在改变。
_NET_WM_SYNC_REQUEST被应用程序接收并处理。
接收到其他事件,例如新几何形状。
..更新内容,交换缓冲区。
将_NET_WM_SYNC_REQUEST_COUNTER发送回WM。
从WM再次发送_NET_WM_SYNC_REQUEST,大小正在改变。
..swapBuffers//问题出现在这里,当窗口正在更改其几何形状时执行更新。
再次接收和处理_NET_WM_SYNC_REQUEST。
因此,问题发生在(7)swapBuffers出现在_NET_WM_SYNC_REQUEST被发送但尚未接收/处理的情况下。
最后的结论:
换句话说,基本的或扩展的同步都没有帮助(至少没有_NET_WM_FRAME_DRAWN),因为没有办法知道实际调整大小何时完成。
扩展同步协议是试图解决这个问题的一种方法,但是由于实际的几何图形更改是在不与客户端同步的情况下完成的,因此我认为如果没有_NET_WM_FRAME_DRAWN,则始终存在使用过时的几何图形更新窗口的机会。
https://lists.freedesktop.org/archives/xcb/2019-February/011280.html
QQuickWindow::setSceneGraphBackend(QSGRendererInterface::Software);
func main() {
var format = gui.NewQSurfaceFormat()
format.SetVersion(4, 5)
format.SetProfile(gui.QSurfaceFormat__CoreProfile)
format.SetRenderableType(gui.QSurfaceFormat__OpenGL)
format.SetSwapInterval(0)
format.SetDefaultFormat(format)
os.Setenv("QT_SCALE_FACTOR", "1")
ap := widgets.NewQApplication(len(os.Args), os.Args)
ap.SetApplicationName("APP 1.1")