Hohe Frame rate

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

Hohe Frame rate

Beitrag von Treehouse »

Hallo,

ich habe ein großes Problem. Ich muss sehr schnell Bilder anzeigen die mir ein Callback liefert. Die Bits werden in ein zuvor definiertes QImage kopiert danach wird die Funktion update() aufgerufen und das QImage wird dann von der paintEvent Funktion in ein Widget gezeichnet.

Die CPU last schießt dabei zum Teil auf über 50% !! Gibt es eine Resourcen schonende Möglichkeit ein QImage Objekt schnell in einem Widget darzustellen?

Eventuell über einen Thread oder dergleichen.

Gruß

Treehouse
Curtis Newton
Beiträge: 122
Registriert: 11. Juni 2008 18:39

Re: Hohe Frame rate

Beitrag von Curtis Newton »

Treehouse hat geschrieben: ich habe ein großes Problem. Ich muss sehr schnell Bilder anzeigen die mir ein Callback liefert. Die Bits werden in ein zuvor definiertes QImage kopiert danach wird die Funktion update() aufgerufen und das QImage wird dann von der paintEvent Funktion in ein Widget gezeichnet.

Die CPU last schießt dabei zum Teil auf über 50% !! Gibt es eine Resourcen schonende Möglichkeit ein QImage Objekt schnell in einem Widget darzustellen?

Eventuell über einen Thread oder dergleichen.
Nimm ein Label und setPixmap. Zum Beispiel. Die GUI kannst Du nicht in einen Thread packen. Was Du machen kannst ist den Empfang und Verarbeitung in einen seperaten Thread packen. Der erstellt dann das Bild und schickt ein Signal ein den Hauptthread.

Genrell kannst Du aber nicht mehr Bilder anzeigen als dein Monitor Frequenz hat ;-)

C.
Treehouse
Beiträge: 100
Registriert: 18. Juni 2007 10:21

Beitrag von Treehouse »

Hallo,

erst mal danke für deine Antwort. Leider ist das immer noch nicht ganz optimal die CPU last liegt bei der Label Variante bei 66%. Wenn ich das über ein paint event mache komme ich immer hin auf 22% nur leider ist das immer noch nicht genug.

Wenn ich das zeichnen aus schalte komme ich auf 6%. Ich muss irgendwie eine Möglichkeit finden das QImage schnell darzustellen, so daß ich höchstens auf 10% komme. Das ist meine Vorgabe.

Gruß

Treehouse
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Probiers mal mit einem QGLWidget.
Curtis Newton
Beiträge: 122
Registriert: 11. Juni 2008 18:39

Beitrag von Curtis Newton »

Was mir noch einfällt: Wenns unter Windows ist, mit getDC den DC holen (http://doc.trolltech.com/4.5/qwidget.html#getDC) und dann direkt blitten (http://msdn.microsoft.com/en-us/library ... S.85).aspx). Oder kommt man ans image von einem QLabel und kann dann scanline benutzen?

C.
androphinx
Beiträge: 170
Registriert: 26. Januar 2009 09:19
Wohnort: 127.0.0.2

Beitrag von androphinx »

bloß keine win-gdi, langsamer geht es kaum.... verwende das QGLWidget.
Treehouse
Beiträge: 100
Registriert: 18. Juni 2007 10:21

Beitrag von Treehouse »

Vielen dank für eure Hilfe werde mir das QGLWidget mal ansehen. Melde mich wie es gelaufen ist.

Gruß

Treehouse
Curtis Newton
Beiträge: 122
Registriert: 11. Juni 2008 18:39

Beitrag von Curtis Newton »

androphinx hat geschrieben:bloß keine win-gdi, langsamer geht es kaum.... verwende das QGLWidget.
Unsinn.

Aber was bzgl. der Belastung wohl am besten wäre:
DirectDraw, Front- und Backbuffer, Backbuffer jeweils füllen und dann einfach flippen. Dabei auf vsync warten (das warten aber nicht zu lange machen, sondern ein Sleep() einbauen, da hier pollen stattfindet).

So hast Du wirklich nur den Speichertranfer. Ich weiß aber nicht, wie/ob man DirectDraw und qt verbinden kann.

So mal als Idee.

C.
Treehouse
Beiträge: 100
Registriert: 18. Juni 2007 10:21

Beitrag von Treehouse »

Ich nutze jetzt den folgenden Funktions aufruf von Opengl in der paintGL Funktion der QGLWidget klasse.

Code: Alles auswählen

void CFrame::paintGL(void)
{
	
	glDrawPixels(glData.width(), glData.height(),  GL_COLOR_INDEX, GL_UNSIGNED_BYTE, glData.bits());
}	

Die CPU last ist perfekt nur leider ist das angezeigte bild Schwarz. glData ist ein QImage Objekt was eine Farbpalette von 0 - 255 besitzt und jedes Pixel 1 Byte belegt.

Muss ich noch irgendwas Einstellen bei dem Widget damit es Funktioniert. Vielleicht die Farbpalette festlegen etc.

Gruß

Treehouse
Curtis Newton
Beiträge: 122
Registriert: 11. Juni 2008 18:39

Beitrag von Curtis Newton »

Treehouse hat geschrieben:Ich nutze jetzt den folgenden Funktions aufruf von Opengl in der paintGL Funktion der QGLWidget klasse.

Code: Alles auswählen

void CFrame::paintGL(void)
{
	
	glDrawPixels(glData.width(), glData.height(),  GL_COLOR_INDEX, GL_UNSIGNED_BYTE, glData.bits());
}	

Die CPU last ist perfekt nur leider ist das angezeigte bild Schwarz. glData ist ein QImage Objekt was eine Farbpalette von 0 - 255 besitzt und jedes Pixel 1 Byte belegt.

Muss ich noch irgendwas Einstellen bei dem Widget damit es Funktioniert. Vielleicht die Farbpalette festlegen etc.

Gruß

Treehouse
Geraten: glRasterPos?
C.
Treehouse
Beiträge: 100
Registriert: 18. Juni 2007 10:21

Beitrag von Treehouse »

Mhh nutzt man das nicht nur bei 3D Darstellungen ?? Ich habe nur 2D Bilder
Curtis Newton
Beiträge: 122
Registriert: 11. Juni 2008 18:39

Beitrag von Curtis Newton »

Treehouse hat geschrieben:Mhh nutzt man das nicht nur bei 3D Darstellungen ?? Ich habe nur 2D Bilder
Hmmm, die Doku sagt:

glDrawPixels reads pixel data from memory and writes it into the frame buffer relative to the current raster position.

Wie ist denn die Rasterposition (glGet mit GL_CURRENT_RASTER_POSITION)?

C.
Treehouse
Beiträge: 100
Registriert: 18. Juni 2007 10:21

Beitrag von Treehouse »

Mhh ich weiß jetzt nicht genau wie du das meinst. Ich habe eigentlich nichts weiter an dem Widget verändert ich rufe lediglich diese Funktion auf weil ich dacht so kann ich das aktuelle Bild in dem Widget darstellen.

Sorry ich scheine den Wald vor lauter Bäumen nicht zu sehen :oops:
Curtis Newton
Beiträge: 122
Registriert: 11. Juni 2008 18:39

Beitrag von Curtis Newton »

Treehouse hat geschrieben:Mhh ich weiß jetzt nicht genau wie du das meinst. Ich habe eigentlich nichts weiter an dem Widget verändert ich rufe lediglich diese Funktion auf weil ich dacht so kann ich das aktuelle Bild in dem Widget darstellen.
Du benutzt aber ein QGLWidget?

Wo/wie rufst Du denn die Funktion auf?

C.
Treehouse
Beiträge: 100
Registriert: 18. Juni 2007 10:21

Beitrag von Treehouse »

Ich denke ich muss den Buffer irgendwie mit meiner Farbpalette vorbereiten, nur weiß ich im moment noch nicht wie.

Gruß

Treehouse
Antworten