我想为我女朋友的学士论文写一个改变失明的程序。它在X毫秒内显示一张图片,显示一个简短的“闪烁图像”(在本例中是灰色的),然后显示一个与第一张略有不同的图像。然后又是一个闪烁的图像。
然后一切都从头开始。它工作得很好,只有一些图形工件。我认为canvas / QGraphicsView刷新它的速度不够快,所以它们在刷新时是“线”。
画面显示时间:70ms,闪烁时间:30ms。所以100毫秒=每秒10帧/秒。我认为这是可能的,而不是使用gpu。但看起来并非如此。
我可以使用双缓冲或其他东西来避免GPU的东西吗?或者我需要为它使用QGL吗?它大约有1兆字节的图像。
我加载它们一次,然后我想只显示它们。也许我对场景做了错误的事情。
我会附上我的源代码,也许你有一些想法。
致以良好的问候:)
#ifndef PICTURES_H
#define PICTURES_H
#include <QMainWindow>
#include <QImage>
#include <QPixmap>
#include <QGraphicsPixmapItem>
#include <iostream>
#include <QDir>
#include <QGraphicsScene>
#include <QDebug>
#include <QTimer>
namespace Ui {
class pictures;
}
class pictures : public QMainWindow
{
Q_OBJECT
public:
explicit pictures(QWidget *parent = 0);
~pictures();
void loadPics();
void showPics();
public slots:
void stopClicked();
void clearPictures();
void timePassed();
void changeImage();
void changeImageGrey();
private:
int counter;
int image_counter;
int stop_time;
Ui::pictures *ui;
QVector<int> times;
QTimer* timer;
QTimer* timerImageChange;
QTimer* timerGrey;
int imageChangeTime;
int greyTime;
QVector<QGraphicsPixmapItem*> images;
QGraphicsScene* scene;
QGraphicsScene* scene_grey;
QGraphicsPixmapItem* item1;
};
#endif // PICTURES_H
#include "pictures.h"
#include "ui_pictures.h"
pictures::pictures(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::pictures), times()
{
counter = 1;
stop_time = 0;
image_counter = 0;
timer = new QTimer(this);
timerGrey = new QTimer(this);
timerImageChange = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(timePassed()));
connect(timerImageChange, SIGNAL(timeout()), this, SLOT(changeImageGrey()));
connect(timerGrey, SIGNAL(timeout()), this, SLOT(changeImage()));
greyTime = 200;
imageChangeTime = 500;
qDebug() << "Hello im here in pictures";
ui->setupUi(this);
this->loadPics();
connect(ui->pushButtonStop, SIGNAL(clicked()), this, SLOT(stopClicked()));
connect(ui->pushButtonNext, SIGNAL(clicked()), this, SLOT(clearPictures()));
timer->start(10);
timerImageChange->start(imageChangeTime);
}
pictures::~pictures()
{
delete ui;
}
void pictures::loadPics()
{
qDebug() << QDir::toNativeSeparators((QDir::current().absolutePath() + QDir::separator () + "debug" + QDir::separator () + "pics" + QDir::separator () + QString::number(counter) + QDir::separator()+"1.jpg"));
//QImage imageOne(QDir::toNativeSeparators(QDir::current().absolutePath() + QDir::separator () + "debug" + QDir::separator () + "pics" + QDir::separator () + QString::number(counter) + QDir::separator()+"1.jpg"));
//QImage imageTwo(QString("./pics/")+counter+"/2.png");
//QImage imageThree(QString("./pics/")+counter+"/3.jpg");
//QImage imageFour(QString("./pics/")+counter+"/2.png");
images.append(new QGraphicsPixmapItem(QDir::toNativeSeparators(QDir::current().absolutePath() + QDir::separator () + "debug" + QDir::separator () + "pics" + QDir::separator () + QString::number(counter) + QDir::separator()+"1.jpg")));
images.append(new QGraphicsPixmapItem(QDir::toNativeSeparators(QDir::current().absolutePath() + QDir::separator () + "debug" + QDir::separator () + "pics" + QDir::separator () + QString::number(counter) + QDir::separator()+"2.jpg")));
images.append(new QGraphicsPixmapItem(QDir::toNativeSeparators(QDir::current().absolutePath() + QDir::separator () + "debug" + QDir::separator () + "pics" + QDir::separator () + QString::number(counter) + QDir::separator()+"3.jpg")));
images.append(new QGraphicsPixmapItem(QDir::toNativeSeparators(QDir::current().absolutePath() + QDir::separator () + "debug" + QDir::separator () + "pics" + QDir::separator () + QString::number(counter) + QDir::separator()+"4.jpg")));
//QGraphicsPixmapItem* item1( QPixmap::fromImage(imageOne));
item1 = images[image_counter];
//QGraphicsPixmapItem item2( QPixmap::fromImage(imageTwo));
//QGraphicsPixmapItem item3( QPixmap::fromImage(imageThree));
//QGraphicsPixmapItem item4( QPixmap::fromImage(imageFour));
scene = new QGraphicsScene;
scene_grey = new QGraphicsScene;
int maximum = item1->boundingRect().width() > item1->boundingRect().height() ? item1->boundingRect().width() : item1->boundingRect().height();
int dimension_width = ui->graphicsView->rect().width();
int dimension_height = ui->graphicsView->rect().height();
//int biggest_canvas_dimension = (((float)item1->boundingRect().width())/dimension_width) > (((float)item1->boundingRect().height())/dimension_height) ? dimension_width : dimension_height;
int biggest_canvas_dimension = dimension_width > dimension_height ? dimension_width : dimension_height;
if(maximum > ui->graphicsView->rect().width() || maximum > ui->graphicsView->rect().height())
{
dimension_width = (int) (item1->boundingRect().width() * ((float)(biggest_canvas_dimension )/maximum));
dimension_height = (int) (item1->boundingRect().height() * ((float)(biggest_canvas_dimension)/maximum));
item1->setPixmap(item1->pixmap().scaled(dimension_width,dimension_height));
qDebug() << "Width: " << dimension_width << " Height " << dimension_height << " Pic High" << item1->boundingRect().height();
}
//item1->setPixmap(item1->pixmap().scaled(QSize(ui->graphicsView->rect().width(), ui->graphicsView->rect().height())));
scene->setSceneRect(ui->graphicsView->rect());
scene->addItem(item1);
scene_grey->setSceneRect(ui->graphicsView->rect());
scene_grey->addItem(images[1]);
ui->graphicsView->setScene(scene);
ui->graphicsView->adjustSize();
//ui->graphicsView->show();
}
void pictures::timePassed()
{
stop_time += 10;
}
void pictures::stopClicked()
{
timerImageChange->stop();
timerGrey->stop();
times.append(stop_time);
ui->pushButtonStop->setEnabled(false);
ui->pushButtonNext->setEnabled(true);
counter++;
qDebug() << "Time: " << stop_time;
stop_time = 0;
timer->stop();
}
void pictures::clearPictures()
{
scene->deleteLater();
images.clear();
loadPics();
ui->pushButtonStop->setEnabled(true);
ui->pushButtonNext->setEnabled(false);
timer->start(10);
timerImageChange->start(imageChangeTime);
}
void pictures::changeImageGrey()
{
timerGrey->start(greyTime);
timerImageChange->stop();
image_counter = (image_counter+1)%4;
//scene_grey->removeItem(scene_grey->items().at(0));
//scene_grey->addItem(images[image_counter]);
scene->removeItem(scene->items().at(0));
scene->addItem(images[image_counter]);
/*int maximum = item1->boundingRect().width() > item1->boundingRect().height() ? item1->boundingRect().width() : item1->boundingRect().height();
int dimension_width = ui->graphicsView->rect().width();
int dimension_height = ui->graphicsView->rect().height();
int biggest_canvas_dimension = dimension_width > dimension_height ? dimension_width : dimension_height;
if(maximum > ui->graphicsView->rect().width() || maximum > ui->graphicsView->rect().height())
{
dimension_width = (int) (item1->boundingRect().width() * ((float)(biggest_canvas_dimension )/maximum));
dimension_height = (int) (item1->boundingRect().height() * ((float)(biggest_canvas_dimension)/maximum));
item1->setPixmap(item1->pixmap().scaled(dimension_width,dimension_height));
}*/
//scene->setSceneRect(ui->graphicsView->rect());
//ui->graphicsView->setScene(scene_grey);
}
void pictures::changeImage()
{
timerImageChange->start(imageChangeTime);
timerGrey->stop();
image_counter = (image_counter+1)%4;
qDebug() << " item1 = images[" + QString::number(image_counter) + "]";
scene->removeItem(scene->items().at(0));
item1 = images[image_counter];
//qDebug() << QDir::toNativeSeparators((QDir::current().absolutePath() + QDir::separator () + "debug" + QDir::separator () + "pics" + QDir::separator () + QString::number(counter) + QDir::separator()+ QString::number(image_counter+1) +".jpg"));
int maximum = item1->boundingRect().width() > item1->boundingRect().height() ? item1->boundingRect().width() : item1->boundingRect().height();
int dimension_width = ui->graphicsView->rect().width();
int dimension_height = ui->graphicsView->rect().height();
int biggest_canvas_dimension = dimension_width > dimension_height ? dimension_width : dimension_height;
if(maximum > ui->graphicsView->rect().width() || maximum > ui->graphicsView->rect().height())
{
dimension_width = (int) (item1->boundingRect().width() * ((float)(biggest_canvas_dimension )/maximum));
dimension_height = (int) (item1->boundingRect().height() * ((float)(biggest_canvas_dimension)/maximum));
item1->setPixmap(item1->pixmap().scaled(dimension_width,dimension_height));
}
//item1->setPixmap(item1->pixmap().scaled(QSize(ui->graphicsView->rect().width(), ui->graphicsView->rect().height())));
//scene->setSceneRect(ui->graphicsView->rect());
scene->addItem(item1);
//ui->graphicsView->setScene(scene);
//ui->graphicsView->setScene(scene);
//ui->graphicsView->adjustSize();
//ui->graphicsView->show();
}发布于 2012-06-17 20:03:10
请记住,如果您的显示器刷新率为60 Hz,则每个图像将每16毫秒重绘一次。你不能像30毫秒那样精确计时,只能以16.666毫秒为间隔计时。至少在Windows中,你不能很容易地发现显示器上显示的图像何时会发生变化。例如,如果你的代码显示一个图像10毫秒,那么你要么看到图像,要么不显示。如果你显示图像25毫秒,你要么看到一次(16.666毫秒),要么看到两次(33.333毫秒)。
如果你真的想要精确的计时,我建议你使用OpenGL,你可以使用显示器的垂直同步信息来计时绘图。
您在绘制过程中看到的线条可能是tearing。你也可以通过使用显示器的垂直同步信息来摆脱这一点。
您还可以使用Qt的计时器来计算10毫秒的间隔。这是行不通的。超时至少为10毫秒,但不能保证恰好为10毫秒。实际上,它更多,所以100个超时的总时间可能在1100ms左右。甚至更多,这取决于您的操作系统。在Windows中,默认计时器分辨率为16 ms。那么100个超时加起来大约是1700ms。您可以使用timeBeginPeriod更改计时器分辨率。
若要获得更精确的计时,请启动要等待的时间段的计时器。如果您想在70毫秒后执行某些操作,请将计时器间隔更改为70毫秒,而不是设置7个10毫秒超时。
https://stackoverflow.com/questions/11070822
复制相似问题