Qt 5.1.1 和 OpenGL - 渲染速度

Posted

技术标签:

【中文标题】Qt 5.1.1 和 OpenGL - 渲染速度【英文标题】:Qt 5.1.1 and OpenGL - rendering speed 【发布时间】:2013-11-26 08:23:47 【问题描述】:

我基于以下 Qt 类创建了我的 OpenGL 应用程序:QWindow、QOpenGLContext、QOpenGLFunctions_4_3_Core。我使用 QTimer 来渲染场景:

QTimer* timer = new QTimer( this );
connect( timer, SIGNAL( timeout() ), this, SLOT( renderScene() ) );
timer->start( ms );

当 ms = 0 时,我可以检查最大 FPS。结果是〜2200 fps(垂直同步关闭),但是当我想使用鼠标调整窗口大小时,程序挂断了。然后我必须使用“ctrl+ alt + del”并手动终止进程(调试器不包含任何消息)。可能有什么问题?

我还想知道为什么当计时器间隔设置为 1(应该是 1000 fps)时我得到 64 fps。其他结果:interval = 10 也是 64 fps,interval = 50 -> 16 fps,interval = 100 -> 9 fps。只有最后一个结果(100 ms -> 9fps)似乎是正确的。如何解释这些结果?

【问题讨论】:

您是否将 glcontext 调整为新大小? 是的:connect(this, SIGNAL(widthChanged(int)), this, SLOT(resizeGL()));连接(这个,信号(heightChanged(int)),这个,SLOT(resizeGL()));对于计时器间隔 > 0,调整大小可以正常工作。 当一个QTimer的超时时间为0时,它会绕过OS消息队列并在每次没有其他事件需要处理时被调用,OS队列一般会带来很大的开销 我在我的其他 OpenGL 应用程序中使用 Freeglut,当程序以最大 fps 工作时我可以调整窗口大小,那么在 Qt 中可以实现吗? 文档告诉你,QTimer 有一定的开销。不要使用它,而是使用 QObject::startTimer() 。无论如何,我感觉您以错误的方式使用 OpenGL。您是否阅读了 Qt OpenGL 文档?是不是说要用定时器来渲染? 【参考方案1】:

我假设你在 Windows 上,因为你关闭了程序使用

ctrl+ alt + del

ms = 0 时,您确实在衡量处理renderScene() 以尽可能快地使用事件的性能。当 Qtimer 超时时,它会将QTimerEvent 排队。您的计时器不断超时并排队 QTimerEvent 并淹没事件队列。当您调整窗口大小时,会在充满计时器事件的队列中放置一个调整大小事件,并且仅在这些事件之后处理。因为事件没有被应用及时处理,所以应用显得无响应

ms != 0 您的测量结果不准确时,因为操作系统计时器不准确。在开发多平台播放器时,我注意到我的窗口上从 1 毫秒到 15 毫秒的任何时间延迟都在 15 毫秒左右,something which can be tested directly。如果你在 linux 上运行相同的测试,你会看到 1ms 的 fps 比 10ms 更好(仍然不能保证 1ms 的分辨率)

总结一下:

您的测试结果的差异与 Open-GL 无关 您的测试结果的差异与 Windows 有很大关系 操作系统和操作系统版本的时间差异是使用外部设备生成时间码的充分理由 如果您在实际程序中需要一个零延迟计时器(您很可能是这样),它需要在与主事件队列不同的事件队列中运行。

编辑: 上述ms != 0 的参数对Qt 4.8 有效,并且对Qt 5 中的默认TimerType (Qt::CoarseTimer) 有效。您可以使用 setTimerType(Qt::PreciseTimer) 获得毫秒精度,但使用 it is not guaranteed to succeed :

在 Windows 上,Qt 将使用 Windows 的多媒体计时器工具(如果 可用)用于 Qt::PreciseTimer 和普通 Windows 定时器 Qt::CoarseTimer 和 Qt::VeryCoarseTimer。

【讨论】:

以上是关于Qt 5.1.1 和 OpenGL - 渲染速度的主要内容,如果未能解决你的问题,请参考以下文章

Qt & OpenGL:如何尽可能频繁地渲染?

Qt5快速qml测试和opengl渲染的问题

OpenGL + QT:渲染到纹理并显示回来

使用 OpenGL 进行 Qt 渲染

Qt/OpenGL - 渲染的图元被扭曲

什么时候使用 Qt 在 opengl 中创建渲染上下文?