对于科学任务,屏幕上应显示频率稳定(最大60 Hz)的闪烁区域。我尝试使用Qt 5.6实现稳定的刺激可视化。
根据这个blog entry以及许多其他在线建议,我实现了三种不同的方法:继承QWindow类,QOpenGLWindow类和QRasterWindow类。我希望获得vsync的优势并避免使用QTimer。
可以显示闪烁区域。此外,帧之间的稳定时间段已经测量为16至17毫秒。 但每隔几秒就会发现一些错过的帧。可以非常清楚地看出,没有稳定的刺激可视化。所有这三种方法都会产生同样的效果。
我是否正确执行了我的代码或是否存在更好的解决方案?如果代码足以达到其目的,我是否必须假设它是硬件问题?那么,显示一个简单的闪烁区域会不会很困难?
非常感谢你帮助我!
作为示例,您可以在此处查看我的QWindow类代码:
Window::Window(QWindow *parent)
: m_context(0)
, m_paintDevice(0)
, m_bFlickerState(true){
setSurfaceType(QSurface::OpenGLSurface);
QSurfaceFormat format;
format.setDepthBufferSize(24);
format.setStencilBufferSize(8);
format.setSwapInterval(1);
this->setFormat(format);
m_context.setFormat(format);
m_context.create();}
由覆盖的事件函数调用的render()
函数是:
void Window::render(){
//calculating exposed time between frames
m_t1 = QTime::currentTime();
int curDelta = m_t0.msecsTo(m_t1);
m_t0 = m_t1;
qDebug()<< curDelta;
m_context.makeCurrent(this);
if (!m_paintDevice)
m_paintDevice = new QOpenGLPaintDevice;
if (m_paintDevice->size() != size())
m_paintDevice->setSize(size());
QPainter p(m_paintDevice);
// draw using QPainter
if(m_bFlickerState){
p.setBrush(Qt::white);
p.drawRect(0,0,this->width(),this->height());
}
p.end();
m_bFlickerState = !m_bFlickerState;
m_context.swapBuffers(this);
// animate continuously: schedule an update
QCoreApplication::postEvent( this, new QEvent(QEvent::UpdateRequest));}
答案 0 :(得分:2)
我得到了qt-forum的一些专家的帮助。您可以按照整个讨论进行here。最后,这就是结果:
&#34; V-sync很难;)基本上它与系统固有的噪音作斗争。如果输出显示16-17 ms,那就是问题所在。 17毫秒是太多了。这就是你看到的跳过。
要减少噪音的事情:
没有直接关系,但会让您的代码更清晰:
应用这些位我能够从你的例子中删除跳过。请注意,在某些情况下会跳过 ,例如当您移动/调整窗口大小或OS /其他应用程序忙于执行某些操作时。你无法控制它。 &#34;