【发布时间】: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 文档?是不是说要用定时器来渲染?