帧精确绘图(bufferswap)

时间:2018-03-07 15:07:49

标签: c++ qt

如何在两个纹理之间进行缓冲切换,以实现下一个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绑定了,所以我不介意使用任何平台相关的代码/库来进行刺激演示。

0 个答案:

没有答案