для научной задачи на экране должны отображаться мерцающие области со стабильной частотой (не более 60 Гц). Я попытался добиться стабильной визуализации стимулов, используя Qt 5.6.Qt: vsync - отсутствующие визуализированные фреймы
В соответствии с этим blog entry и многими другими онлайн-рекомендациями я понял три разных подхода: Наследование от QWindow Class, QOpenGLWindow Class и QRasterWindow Class. Я хотел получить преимущество 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();}
The 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));}