我基于以下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)似乎是正确的。如何解释这些结果?
答案 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的分辨率)
总结:
编辑: ms != 0
的上述参数对Qt 4.8和默认TimerType
(Qt::CoarseTimer
)有效在Qt 5.您可以使用setTimerType(Qt::PreciseTimer)
达到毫秒精度,但it is not guaranteed to succeed:
在Windows上,Qt将使用Windows的多媒体计时器工具(如果 适用于Qt :: PreciseTimer和普通的Windows计时器 Qt :: CoarseTimer和Qt :: VeryCoarseTimer。