我正在使用gitlab-ci-runner在每次提交时自动测试桌面Qt / OpenGL应用程序。在Windows 8上,应用程序由安装有gitlab-ci-runner的系统服务执行,因此它运行"隐藏",即在没有可见的桌面上。无论如何,所有的UI模块都会初始化和运行,除了OpenGL模块,它永远不会得到"暴露"事件;如果我试图在不暴露窗口的情况下绘制到OpenGL上下文中,我会收到错误:
QOpenGLContext::swapBuffers() called with non-exposed window, behavior is undefined
我发现在运行的桌面会话中从服务执行Windows GUI应用程序是相当困难的,不建议这样做。(参见How can a Windows service execute a GUI application?)。
现在,我不需要用户查看应用程序,我只需要OpenGL部分就能正常工作。有没有办法可以"假装"以某种方式公开窗口,还是有其他方法让它从系统服务正确运行?
答案 0 :(得分:0)
有没有办法可以"假装"以某种方式公开窗口,还是有其他方法让它从系统服务正确运行?
您遇到的两个问题:
如果窗口未曝光,则渲染的所有像素都将失败像素所有权测试,渲染将变为所有像素的NoOp。解决方法是使用一个PBuffer或(推荐)一个帧缓冲对象。它们都不会立即使用屏幕窗口,因此您必须更改一些代码。
在作为服务启动的Windows进程中,通常无法访问图形硬件,因此您仅限于软件GDI OpenGL后备功能(仅限OpenGL-1.1,因此不支持FBO或PBuffers。)
如果您需要GPU加速,您可以投资一些网格计算GPU硬件(实际上,每个GPU都可以做到这一点,但驱动程序不允许它用于消费级别的东西)来获得有效的OpenGL加速上下文。或者您可以迁移到Linux,使用KMS / DRI / DRM支持的GPU并完全绕过任何图形系统。没有关于如何做到这一点的官方指南,但是我的(冗长的)ToDo列表上写了这样的教程。
如果您可以在没有GPU加速的情况下继续使用,请使用您的程序.exe
旁边的softpipe渲染器删除Windows版本的Mesa; Windows Mesa softpipe版本以opengl32.dll
完全API和ABI与标准opengl32.dll
兼容,但独立于任何图形驱动程序。它为您提供OpenGL-3.3支持,包括FBO和PBuffers。