Seite 1 von 3
Hohe Frame rate
Verfasst: 1. September 2009 15:00
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
Re: Hohe Frame rate
Verfasst: 1. September 2009 16:05
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.
Verfasst: 1. September 2009 16:35
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
Verfasst: 1. September 2009 18:09
von upsala
Probiers mal mit einem QGLWidget.
Verfasst: 1. September 2009 20:38
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.
Verfasst: 2. September 2009 08:44
von androphinx
bloß keine win-gdi, langsamer geht es kaum.... verwende das QGLWidget.
Verfasst: 2. September 2009 09:11
von Treehouse
Vielen dank für eure Hilfe werde mir das QGLWidget mal ansehen. Melde mich wie es gelaufen ist.
Gruß
Treehouse
Verfasst: 2. September 2009 09:15
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.
Verfasst: 2. September 2009 10:24
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
Verfasst: 2. September 2009 10:49
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.
Verfasst: 2. September 2009 10:54
von Treehouse
Mhh nutzt man das nicht nur bei 3D Darstellungen ?? Ich habe nur 2D Bilder
Verfasst: 2. September 2009 10:56
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.
Verfasst: 2. September 2009 11:06
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

Verfasst: 2. September 2009 11:07
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.
Verfasst: 2. September 2009 11:08
von Treehouse
Ich denke ich muss den Buffer irgendwie mit meiner Farbpalette vorbereiten, nur weiß ich im moment noch nicht wie.
Gruß
Treehouse