Qt 5.1.1和OpenGL - 渲染速度

时间:2013-11-13 16:13:14

标签: c++ windows qt opengl

我基于以下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(v-sync off)但是当我想用鼠标调整窗口大小时,程序会挂起。然后我必须使用“ctrl + alt + del”并手动终止进程(调试器不包含任何消息)。什么可能是错的?

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

1 个答案:

答案 0 :(得分:1)

我假设你在Windows上,因为你使用

关闭程序
ctrl+ alt + del

当您ms = 0确实在尽可能快地衡量处理renderScene()时使用事件的效果。当Qtimer超时时,它会排队QTimerEvent。您的计时器保持超时并排队QTimerEvent并充斥事件队列。当您调整窗口大小时,会在队列中放置一个resize事件,其中包含计时器事件,并且只会在这些事件之后处理。由于应用程序未及时处理事件,因此应用程序显示无响应

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

总结:

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

编辑: ms != 0的上述参数对Qt 4.8和默认TimerTypeQt::CoarseTimer)有效在Qt 5.您可以使用setTimerType(Qt::PreciseTimer)达到毫秒精度,但it is not guaranteed to succeed

  

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