QGraphicsView hohe CPU auslastung

Alles rund um die Programmierung mit Qt
Antworten
Treehouse
Beiträge: 100
Registriert: 18. Juni 2007 10:21

QGraphicsView hohe CPU auslastung

Beitrag von Treehouse »

Hallo,

ich habe folgendes Problem. Ich muss alle 20 ms ein neues Bild anzeigen. Dabei wollte ich den GraphicsView -> GraphicsSence -> GraphicsItem verwenden, nur leider bekomme ich dabei eine CPU auslastung von 60 Prozent.

Ich bin dabei so vorgegangen das ich eine Klasse von GraphicsObject abgeleitet habe und diese für mein Problem angepasst habe. Darin enthalten ist ein QImage Objekt welches die Bild Daten enthält.

Jetzt habe ich dieses Objekt einer QGraphisScene zugewiesen welches ich nun in einem Objekt vom Typ QGraphicsView darstellen lasse. Den View habe ich allerdings wieder abgeleitet und habe als ViewPort QGLWidget gesetzt.

Dann habe ich einen Timer gesetzt der alle 20 ms das Bild updaten soll.

Das funktioniert soweit eigentlich auch sehr gut nur ist es sehr CPU lastig. Ich habe eine Auslastung von 60 % wenn ich dies so umsetzte. Wird hingegen das immer gleiche Bild angezeigt alle 20 ms habe ich eine Auslastung von 4% was hervorragend wäre.

Gibt es vielleicht eine Option\Flag\Einstellung die das Zeichnen Optimiert?

Hier mal die Zeichenfunktion aus dem GraphicsObject:

Code: Alles auswählen

void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
	{
		painter->setCompositionMode(QPainter::CompositionMode_Source);
		painter->setClipRect(option->exposedRect);
		painter->drawImage(0,0, m_image);
	}
Und hier das TimerEvent:

Code: Alles auswählen

void CViewer::timerEvent(QTimerEvent *event)
{
	QMutexLocker Lock(&m_mutex);
	memcpy(m_image->bits(), m_bits, m_image->width() * m_image->height());
	m_scene->update();
	this->fitInView(m_scene->sceneRect());

}
Das Drawing oben bringt die CPU auslastung. Ich habe erst gedacht es liegt vielleicht am fit aber dies ist nicht der Fall.

Wäre super wenn mir jemand weiterhelfen könnte.

Gruß

Treehouse
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Warum verwendest du für ein simples Bild anzeigen eine Graphics View? Das hat systembedingt einen gewissen Performanceoverhead. Versuchs doch mal nur mit nem QLabel.

Was auch ziemlich Perfomance kostet, ist das mutex locken. Brauchst du das wirklich? Kannst du mal beschreiben, wie die Bilddaten ankommen?

Und warum den Weg über bits() (lies dir da auch den Hinweis durch betreffend iplicit data sharing)? Kannst du nicht loadFromData() nehmen?

Und alle 20ms ist auch arg schnell. 20-25 Bilder/Sekunde sind genug, um vom menschlicen Auge als fließend wahrgenommen zu werden. Ein Timerintervall von 40-50ms sollte reichen.
padreigh
Beiträge: 340
Registriert: 13. Mai 2010 10:06

Beitrag von padreigh »

und lass den Umweg übers QImage - das wird zur Darstellung in ein QPixmap umgewandelt welches dargestellt wird - nimm also gleich ein QPixmap ;)
Patrick (QtCreator 1.3.1, Qt 4.6.3)
---
template = subdirs
Antworten