科学的タスクの場合、安定した周波数 (最大 60 Hz) で点滅する領域が画面に表示されます。Qt 5.6 を使用して、安定した刺激の可視化を実現しようとしました。
このブログ エントリと他の多くのオンライン推奨事項によると、QWindow クラス、QOpenGLWindow クラス、および QRasterWindow クラスからの継承という 3 つの異なるアプローチに気付きました。vsync の利点を得て、QTimer の使用を避けたかったのです。
ちらつき領域を表示できます。また、フレーム間の安定した時間は、16 ~ 17 ms で測定されています。しかし、数秒ごとにいくつかの欠落したフレームが発見されます。刺激の安定した視覚化がないことが非常にはっきりとわかります。3 つのアプローチすべてで同じ効果が発生します。
コードの実装を適切に行ったか、またはより良い解決策が存在するか? コードがその目的に対して適切である場合、それはハードウェアの問題であると想定する必要がありますか? それでは、単純なちらつき領域を表示するのは難しいでしょうか?
助けてくれてありがとう!
例として、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));}