Hohe Frame rate
Hohe Frame rate
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
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
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.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.
Genrell kannst Du aber nicht mehr Bilder anzeigen als dein Monitor Frequenz hat
C.
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
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
-
Curtis Newton
- Beiträge: 122
- Registriert: 11. Juni 2008 18:39
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.
C.
-
androphinx
- Beiträge: 170
- Registriert: 26. Januar 2009 09:19
- Wohnort: 127.0.0.2
-
Curtis Newton
- Beiträge: 122
- Registriert: 11. Juni 2008 18:39
Unsinn.androphinx hat geschrieben:bloß keine win-gdi, langsamer geht es kaum.... verwende das QGLWidget.
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.
Ich nutze jetzt den folgenden Funktions aufruf von Opengl in der paintGL Funktion der QGLWidget klasse.
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
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
Geraten: glRasterPos?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
C.
-
Curtis Newton
- Beiträge: 122
- Registriert: 11. Juni 2008 18:39
Hmmm, die Doku sagt:Treehouse hat geschrieben:Mhh nutzt man das nicht nur bei 3D Darstellungen ?? Ich habe nur 2D Bilder
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.
-
Curtis Newton
- Beiträge: 122
- Registriert: 11. Juni 2008 18:39
Du benutzt aber ein QGLWidget?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.
Wo/wie rufst Du denn die Funktion auf?
C.