如何在两个纹理之间进行缓冲切换,以实现下一个VBL的绘图?
目前我正在使用两个QPixmap,我将其设置为QLabel。这导致在使用85Hz CRT监视器(没有任何延迟的缓冲器)的情况下,对并行端口测量的18ms和45ms之间的不稳定延迟。
我的目标是发出一个翻转命令,导致下一个VBL(垂直消隐中断)上的bufferwap。
我现在尝试过: 我在main.cpp中设置了一个全屏窗口(不同的问题:无法在运行时打开一个窗口)并初始化两个QPixmaps。
使用定时器创建的信号,我会触发更改:
myVisualStimuli = new VisualStimuli(0);
//Start Timer for Stimulus Presenation
StimulusThread = new QThread(this);
StimulusTimer = new QTimer(0);
StimulusTimer->setInterval(500);
StimulusTimer->moveToThread(StimulusThread);
myVisualStimuli->moveToThread(StimulusThread);
myVisualStimuli->connect(StimulusTimer, SIGNAL(timeout()), SLOT(SetStimulus()), Qt::DirectConnection);
this->connect(StimulusTimer, SIGNAL(timeout()), SLOT(SetStimulus()), Qt::DirectConnection);
// Make sure the timer gets started from m_thread.
StimulusTimer->connect(StimulusThread, SIGNAL(started()), SLOT(start()));
StimulusThread->start();
绘图:标题/代码
#ifndef VISUALSTIMULI_H
#define VISUALSTIMULI_H
#include <QtCore>
#include <QObject>
#include <QThread>
#include <QLabel>
class VisualStimuli: public QThread
{
Q_OBJECT
public:
explicit VisualStimuli(QObject *parent = 0);
int Setup();
bool StimulusToggle = true;
QRect *screenres;
QLabel* StimulusWindow;
QPixmap *pix1;
QPixmap *pix2;
public slots:
void SetStimulus();
private:
protected:
void run();
};
#endif // VISUALSTIMULI_H
#include "visualstimuli.h"
VisualStimuli::VisualStimuli(QObject *parent) : QThread(parent)
{
}
int VisualStimuli::Setup()
{
return 0;
}
void VisualStimuli::SetStimulus()
{
start();
}
void VisualStimuli::run()
{
if(StimulusToggle){
this->StimulusWindow->setPixmap(*pix1);
StimulusToggle=false;
}else{
this->StimulusWindow->setPixmap(*pix2);
StimulusToggle=true;
}
}
由于硬件我已经被Windows 10 64Bit绑定了,所以我不介意使用任何平台相关的代码/库来进行刺激演示。