Seite 1 von 1

Geschwindigtkeit von QImage

Verfasst: 27. November 2007 21:00
von nico123
Hallo,
ich muss/möchte gerne mit möglicht hoher Performance Bilder in einem QImage anzeigen.
Folgenden Code verwende ich dabei:

Code: Alles auswählen

renderView->resize(QImage(FileNameOfCurrentFrame).width(), QImage(FileNameOfCurrentFrame).height());	
renderView->setPixmap(QPixmap::fromImage(QImage(FileNameOfCurrentFrame)));
renderView ist ein QLabel.
Die Bilder sind eigendlich ein Movie welches im Momet mit 25 Frames/Sekunde abgespielt wird.
Die Bildgröße jedes Einzelbildes ist 1920x798px das kleinste Bild ist 5KB und das Größste 1,2MB. Das Movie ist 35 Sekunden lang.
Wenn ich jetzt das Movie mit 25 Frames/Sekunde abspiele, spielt es real 395 Sekunden.
Ich habe das ganze auch mal mit OpenGL versucht, da Spielt es "nur" 201 Sekunden. OpenGL kann ich aber aus bestimmten Günden leider nicht verwenden.

Deswegen meine Frage an euch, gibt es eine Möglichkeit das ganze etwas in der Performance zu steigern? Also Performance vom Rechner her stollte da sein. Extra SATA Platte für Movie only. Intel Conroe E6600 und 2GB RAM 800MHz.

Vielen Dank und Grüße
Nico

Verfasst: 27. November 2007 22:18
von upsala
Versuch mal ob ein QPixmap schneller ist, bzw. kannst du den ganzen Film in den Speicher 'vorladen'?

Verfasst: 27. November 2007 22:37
von nico123
upsala hat geschrieben:Versuch mal ob ein QPixmap schneller ist, bzw. kannst du den ganzen Film in den Speicher 'vorladen'?
Hi,
also mit QPixmap werde ich das mal versuchen. Wenn ich den ganzen Film in den Speicher laden würde gäbs irgendwann ein paar Problemchen. Denn zur Zeit ist es ja nur ein Kurzer Testfilm mit ca. 880 Frames. Nun stell dir mal einen Film mit um die 5000 Frames an. Da würde der ganze Film, wenn ein Einzelbild ca. 1,5MB groß ist, 7500MB im Speicher bzw. auch in der Auslagerungsdatei belegen. Und 5000 Frames sind bei 25 Frame die Sekunde gerade mal 3,3 Minuten Film. Und ich denke einfach mal das es nicht an der Plattenperformance liegt, sondern an der Rendergeschwindigtkeit vom QImage. Aber vllt. ist ja QPixmap schneller. Ich werd das mal morgen testen.

Gruß
Nico

Verfasst: 28. November 2007 04:43
von Neabit
Schau mal unter QT\examples\widgets\movie da gibt es einen kleinen VideoPlayer vielleicht hilft das weiter.

Verfasst: 28. November 2007 06:32
von Christian81
QImage/QPixmap sind für solche Dinge nicht ausgelegt.

Verfasst: 28. November 2007 16:03
von nico123
Christian81 hat geschrieben:QImage/QPixmap sind für solche Dinge nicht ausgelegt.
Gut. Gibt es eine andere Möglichkeit? Es muss sich nachher nur in ein QT Window bzw. Widget einbinden lassen. Und sollte kein OpenGl bzw. DirectX sein.

Gruß & vielen Dank
Nico

Verfasst: 28. November 2007 16:10
von Christian81
Nicht wirklich, aber Neabit hat Dir ja auch einen Hinweis gegeben.

Verfasst: 28. November 2007 16:29
von qtNiko
Laut Doku soll QPixmap beim Schreiben auf den Bildschirm schneller sein als QImage.
Vielleicht lässt sich aber noch etwas speed herausholen, wenn nicht 3 mal QImage(FileNameOfCurrentFrame) verwendet wird, wobei jedesmal auf die Datei zugegriffen werden muss, sondern nur 1 mal ein Pointer darauf gesetzt und dann 3 mal verwendet wird.

Verfasst: 28. November 2007 16:47
von Christian81
@qtNico: Es geht hier nicht um diese kleinen (oder grösseren) Optimierungen - 25fps bei 1920x798 ist einfach zu viel für QPixmap/QImage denke ich.

Verfasst: 28. November 2007 20:41
von nico123
Hi,
also ich habe das jetzt so mal versucht:

Code: Alles auswählen

renderView->setPixmap(QPixmap(FileNameOfCurrentFrame, 0, Qt::AutoColor));

Sind die gleichen Bedingugen wie auch Oben genannt. So komme ich auf ca. 150 Sekunden Reale Spieldauer. Was immernoch ein wenig lang ist. Also ich weiss schon dass ich nicht das 100% Synchron hinbekomme, da die Festplatte einfach zu lahm sein wird. Ich hatte aber geplat einfach zwei Platten zu nehmen und dann jeden zweiten Frame auf die je andere Platte zu schieben. Aber mit macht hat im Moment auch die CPU Auslastung Sorgen. Ein Core von den Beiden ist fast zu 100% ausgelastet. Ich denke daher kommen auch die Performance Probleme. Ich habe auch mal einfach den Versuch gemacht und das Original Movie nicht in RAW Einzelbilder gepackt, sondern in ein RAW AVI. Das komische is, sogar der Win MediaPlayer macht hier überhaupt keine Probleme das Movie ruckelfrei zu spielen udn auch die CPU Last liegt pro Core nur bei ca. 4-10%

Kann es auch sein dass es länger dauert wenn ich ein PNG im QImage anzeige als z.B ein JPG gleicher größe? ICh möchte das jetzt nur noch nicht testen, da das umrechnen des original Movies ca. 50min dauert.

Gruß
Nico

Verfasst: 28. November 2007 21:00
von nico123
So,
ich habe das jetzt mal mit dem QMovie getestet:

Code: Alles auswählen

movie->stop();
		movie->setFileName(FileNameOfCurrentFrame);
		movie->start();
Reale Spielzeit 153 Sekunden. CPU Auslastung unverändert. Ich werde es jetzt doch mal mit JPG Bildern versuchen.

Nachtrag:
Mit JPG Bildern komme ich auf 105 Sekunden reale Spielzeit. CPU Last ist bei 35-40%. Natürlich sind die JPG Bilder auch viel kleiner als die PNG. Aber die Qualität ist leider nicht merh so ganz gut.

Nachtrag 2:
Ich galube ich habe es geschafft. Das eventuelle Zauberwort nennt sich PPM (Portable Pixmap). Da wird das Bild binär gespeichert. So hat auch jede Datei die gleiche Größe. Bei meinem Movie 4,38MB. Die CPU Last liegt nun auch bei 21%. Es Ruckelt allerdings noch. Dies leigt jetzt aber bestimmt an der Festplatte. Die muss nämlich jetzt 25fps * 4,38MB = 109,5MB die Sekunde schaffen. Und eine normale SATA Platte schafft nur wenn SATA II ca. 70MB die Sekunde.


Gruß
Nico

Verfasst: 28. November 2007 21:13
von upsala
880Frames ~2.5GByte? Wie lange braucht deine Festplatte um das zu transferieren?

Verfasst: 29. November 2007 09:10
von nico123
upsala hat geschrieben:880Frames ~2.5GByte? Wie lange braucht deine Festplatte um das zu transferieren?
Also es sind keine 2,5GByte sondern 880*4,38 = 3,9 GByte. Es würde wenn du nur eine Datei dieser Größe hast, nicht sehr lange dauern. Aber beim Lesen ist es ja nicht nur eine Datei, sondern ganze 880 Stück. Was viel länger dauert, da eine Festplatte ja immer nicht optimal Defragmentiert ist. Würde ich die Platte Defragmentieren, würde es mit sicherheit schneller gehen. Und ausserdem hat eine Festplatte einen Maximalen Datendurchsatz pro SEKUNDE, und der beträg bei meiner SATA Platte knappe 70MB/s.
Ich mache aber pro Sekunde 25 Anfragen an die Platte mit 25 Bilder mit knappen 4MB zu transferieren. Und 25*4MB sind nun mal 100MB und das schafft die Platte einfach nicht, da max. 70MB/s möglich sind.
Es spielt hier also nicht nur die Dateigröße eine Rolle, sondern auch die Zeit, die Anzahl der Datein und die Fragmentierung der Platte.


Gruß
Nico

Verfasst: 29. November 2007 12:19
von upsala
Wieso erklärst du mir das? Du hast doch das Geschwindigkeitsproblem. Meine Frage zuvor war rein rhetorisch...