在 Windows 上部署无硬件加速的 Qt5

25

Qt5可以使用OpenGL驱动程序或DirectX驱动程序来使用ANGLE。由于我们不能依赖已安装的OpenGL驱动程序,因此需要使用ANGLE后端。不幸的是,这并不能解决所有部署问题,特别是在没有硬件加速的Windows虚拟机上。在这些系统上,我们会收到一个错误消息,说明创建OpenGL上下文失败。

屏幕截图:无法为格式QSurfaceFormat创建OpenGL上下文

我们部署所有必需的库(libEGL.dll libGLESv2.dll libeay32.dll msvcp110.dll msvcr110.dll d3dcompiler_46.dll),但仍然收到此错误消息。

如何部署需要在没有OpenGL驱动程序和(虚拟)没有Direct3D加速的终端用户机器上运行的QML应用程序?

Qt wiki上有一页提到了这个问题,但这对解决问题并不是非常有帮助。

更新Qt 5.4.0:

我目前的发现是:

  • 设置QT_ANGLE_PLATFORM=warp->创建没有内容的窗口。
  • 设置QT_ANGLE_PLATFORM=d3d9->与预期相同的相同错误对话框。
  • 设置QT_ANGLE_PLATFORM=d3d11->与预期相同的相同错误对话框。
  • 设置QT_OPENGL=desktop->与QT_ANGLE_PLATFORM=warp相同。
  • 设置QT_OPENGL=angle->与预期相同的相同错误对话框。
  • 设置QT_OPENGL=software+opengl32sw.dll(mesa for windows)->不可预测:可能运行,可能崩溃,可能显示错误对话框。

更新Qt Quick 2D Renderer

尽管Mesa似乎是部分解决方案,在Qt 5.4.0中配置非常容易崩溃。

另一种备用方案可能是Qt Quick 2D渲染器,但不幸的是,这也会导致崩溃。

  • 将softwarecontext.dll复制到/scenegraph + 设置QMLSCENE_DEVICE=softwarecontext -> 崩溃

一些用户体验后的更新:

Angle
  • 在某些系统上存在一些渲染错误
  • 在所有系统上都不可靠
Angle with Warp
  • 不可靠
Desktop OpenGL
  • 默认实现OpenGL 1.1,太老了。
  • 即使OpenGL版本正确,仍然不可靠。
  • 如果被Qt使用,会出现渲染错误
QtQuick2dRenderer
  • 有一些严重的渲染问题
  • 会崩溃、冻结
  • 适用于没有硬件加速的系统
Mesa OpenGL后端
  • 目前似乎相当可靠
  • 总体上相当缓慢,在某些系统上非常缓慢。
  • 部署较为繁琐

结论:对于这些系统,仍然没有真正的解决方案。

Qt5.5的更新

2015年:破损的图形驱动仍然是破损的。

我目前的结论是:

  1. 如果可能,请使用QtQuick2dRenderer。
  2. 否则,请使用Mesa后端。
  3. 跳过Angle,跳过Desktop OpenGL,跳过Warp。

你正在使用哪个需要OpenGL的Qt技术?是QtQuick2吗? - peppe
是的,我们正在使用QtQuick2。 - Sebastian Wagner
然后我看到这些选项:1)使用提供OpenGL加速的VM软件(VMWare,VBox)。2)使用Mesa / LLVMPipe作为软件光栅化器。3)配置ANGLE以使用软件DX光栅化器。4)使用QtQuick2光栅后端(在5.4中是新功能,可能仅限商业版)。 - peppe
不使用硬件加速似乎不是最佳选择。1)这不在我的控制范围内。2)Mesa与ANGLE不兼容,而这是使用DX的唯一选择。3)根据我在Kerry回答中提到的评论,在Qt 5.4中似乎可以在运行时实现。我会测试一下。5)感谢您提醒。我不知道那个。 - Sebastian Wagner
是的,Mesa提供了一个软件OpenGL实现(不像ANGLE那样通过DX提供OpenGL/ES)。但是在5.4中,在Windows下,Qt可以动态地在OpenGL和ANGLE之间切换。因此,您可以拥有这样一个动态构建的Qt,并回退到Mesa。 - peppe
显示剩余2条评论
3个回答

8

在某些硬件配置上,QT 5与opengl存在巨大的兼容性问题。在Windows 10上,Intel HD3000驱动程序和Nvidia / ATI卡的组合将无法正常工作。 https://bugreports.qt.io/browse/QTBUG-42240

Intel取消了对此显卡的支持,但他们的驱动程序存在导致崩溃的错误。

如果您想支持拥有HD3000的客户,您不能依赖于硬件opengl。


4
在Windows下,opengl32.dll是默认的OpenGL驱动程序。它实现了OpenGL 1.1(非常旧的版本)。 ANGLE的基线是OpenGL ES 2.0,并且需要安装DirectX 9/11将调用映射到其中。
因此,如果您的视频卡未安装OpenGL驱动程序,OpenGL驱动程序低于2.0和/或未安装DirectX 9/11,则您的应用程序将无法正常工作。
关于虚拟化和3D加速,这些可能值得一读:
- 为什么Qt Creator 3.0.0欢迎模式在VM中无法工作? - https://bugreports.qt.io/browse/QTBUG-34964 另外,如果在VirtualBox下运行多监视器Windows环境,则会禁用3d加速。

通过这个提交,可能可以使用WARP(软件光栅化器)代替硬件。我会在我这里有一个可用的Qt 5.4后尽快测试它。 - Sebastian Wagner

1
我重新检查了一下,看看最新版本的QT 5.12.2是否修复了这些问题,但是没有。在QT维基百科条目 OP 引用的功能https://wiki.qt.io/Qt_5_on_Windows_ANGLE_and_OpenGL听起来不错,但实际上它根本不起作用。
我得出结论,在任何形式的QT中避免使用OpenGL。它太不可靠了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接