für eine wissenschaftliche Aufgabe, Flimmern Bereiche mit einer stabilen Frequenz (max. 60 Hz), soll auf dem Bildschirm angezeigt werden. Ich versuchte mit Qt 5.6 eine stabile Stimulusvisualisierung zu erreichen.Qt: vsync - fehlende gerenderte Frames
Entsprechend dieser blog entry und viele andere Online-Empfehlungen, realisierte ich drei verschiedene Ansätze: Vererben von QWindow-Klasse, QOpenGLWindow-Klasse und QRasterWindow-Klasse. Ich wollte den Vorteil von vsync bekommen und die Verwendung von QTimer vermeiden.
Der flackernde Bereich kann angezeigt werden. Auch eine stabile Zeitspanne zwischen den Frames wurde mit 16 bis 17 ms gemessen. Aber alle paar Sekunden werden einige verpasste Frames entdeckt. Es ist sehr deutlich zu sehen, dass es keine stabile Visualisierung des Reizes gibt. Derselbe Effekt tritt bei allen drei Ansätzen auf.
Habe ich die Implementierung meines Codes richtig gemacht oder gibt es bessere Lösungen? Wenn der Code für seinen Zweck geeignet ist, muss ich davon ausgehen, dass es sich um ein Hardwareproblem handelt? Könnte es dann schwierig sein, einen einfachen flackernden Bereich anzuzeigen?
Vielen Dank für Ihre Hilfe!
Als Beispiel Sie meinen Code für Qwindow Klasse hier sehen können:
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();}
Die render()
-Funktion, die durch überschrieben Event-Funktionen aufgerufen wird, ist:
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));}