Laden...

Performant viele (transparente) Bilder

Erstellt von Jack_AI vor 15 Jahren Letzter Beitrag vor 15 Jahren 2.140 Views
J
Jack_AI Themenstarter:in
193 Beiträge seit 2007
vor 15 Jahren
Performant viele (transparente) Bilder

Hallo Community,

ich habe in meiner Windows-Form mehrere Textstücke / Labels (momentan 20 Stück), die ich gerne mit einem halbtransparenten PNG-Bild unterlegen möchte.

Das Bild selber ist nicht groß (100 x 32 Pixel, ca. 1 kb). Jedoch dauert eine ganze Weile (1 - 2 Sekunden), bis alle Bilder geladen werden. Selbst wenn ich das Fenster nur minimiere und wieder hervor hole.

Ich habe die Bilder alle per Form-Designer als Recourse geladen. Was kann ich tun, damit sich die Bilder schneller aufbauen?

Grüße,
Jack

I
1.739 Beiträge seit 2005
vor 15 Jahren

Was soll in einem Label oder Picturebox oder egal was für'n WinFormDing die (Halb)Transparenz bewirken?

J
Jack_AI Themenstarter:in
193 Beiträge seit 2007
vor 15 Jahren

Was soll in einem Label oder Picturebox oder egal was für'n WinFormDing die (Halb)Transparenz bewirken?

Damit hebt sich die Schrift besser von einem heterogenen Hintergrund ab.

I
1.739 Beiträge seit 2005
vor 15 Jahren

Kannst du das genauer erläutern? Ich denke das ist abhängig vom Content der Grafikund vom Fensterhintergrund(HalbTransparenz)-Das Abheben.
Weiterhin frage ich mich wie du die Halbtransparenz herstellst, da es eine direkte Unterstützung nicht gibt(es sei denn WPF != WinForms).

J
Jack_AI Themenstarter:in
193 Beiträge seit 2007
vor 15 Jahren

Weiterhin frage ich mich wie du die Halbtransparenz herstellst, da es eine direkte Unterstützung nicht gibt(es sei denn WPF != WinForms).

Also noch mal zur Erklärung: Der Form-Designer erlaubt mir für Labels per Eigenschaft "Image" ein Hintergrundbild für den Text zu wählen. Dafür nehme ich ein halbtransparentes PNG-Bild. Die Transparenz-Eigenschaft wird in dieser Bilddatei gespeichert.

Und davon habe ich eben sehr viele, sodass das Fenster recht lange zum Aufbauen braucht.

I
1.739 Beiträge seit 2005
vor 15 Jahren

Ein 32-Bit-PNG also?

J
Jack_AI Themenstarter:in
193 Beiträge seit 2007
vor 15 Jahren

Ein 32-Bit-PNG also?

Nein, 8 Bit. Nur Graustufen.

I
1.739 Beiträge seit 2005
vor 15 Jahren

8 Bit hat keinen Transparenzkanal.

Ich schliesse Formatschwierigkeiten jetzt aus.

Wie sieht es bei einem 2. Aufruf der Form aus?(lange Kompilierungszeit am Start)?
Wie hoch ist die Anzahl(ungefähr)?

J
Jack_AI Themenstarter:in
193 Beiträge seit 2007
vor 15 Jahren

8 Bit hat keinen Transparenzkanal.

Du hast recht. Ich habe noch mal nachgeschaut. Es hat 32 Bit.

Wie sieht es bei einem 2. Aufruf der Form aus?(lange Kompilierungszeit am Start)?
Wie hoch ist die Anzahl(ungefähr)?

Die Kompilierung dauert genau so lange wie sonst auch. Nur das erste Laden ist durch die Bilder verlängert. Das merkt man daran, dass die Bilder nacheinander in die Form "eingesetzt" werden, also es schaut so aus, als ob die Bilder nacheinander aufploppen. Ansonsten merkt man es besonders beim Minimieren und Wiederherstellen des Fensters. Ich verwende momentan ca. 20 Labels + Bilder, es sollen aber später noch mehr werden.

I
1.739 Beiträge seit 2005
vor 15 Jahren

Mit Kompilierung meinte ich in dem Fall die JIT-Kompilierung, mein Fehler.
Könntest du die Zeiten messen, zw. Init(Constructor) & Load im Vergleich zu Bmp-Ressourcen?

Ich sehe da jetzt spontan 2 Möglichkeiten(Spontaner Gedanke). Entweder sind die Grafiken unangemessen gross für die Darstellung oder die API hat ein Problem mit dem PNG-Format bei dieser Farbtiefe.

J
Jack_AI Themenstarter:in
193 Beiträge seit 2007
vor 15 Jahren

Ich habe mal testweise das halbtransparente PNG-Bild durch ein einfaches, 10x10 Pixel-großes BMP- / JPG-Bild ersetzt. Es dauert genauso lange: ca. 1 Sekunde bei 20 Bildern, unabhängig von Format, Transparenz und Größe.

I
1.739 Beiträge seit 2005
vor 15 Jahren

mmh ok.

Ich sehe noch 2 Möglichkeiten,
eine wäre(du schriebst vom "nacheinander aufploppen"), die Dinger(labels was immer) per Default invisible zu machen und erst im Form_Load per Loop wieder sichtbar(bringt etwas, nicht viel).
Andererseits ist eine Sekunde nicht allzuviel und wozu gibt es Splashscreens, wenn nicht um den User beim Laden zu Unterhalten...

J
Jack_AI Themenstarter:in
193 Beiträge seit 2007
vor 15 Jahren

Die Verzögerung beim Starten ist nicht so schlimm. Aber dass die Bilder so langsam laden, nachdem man das minimierte Fenster wieder aufruft... Das möchte ich vermeiden.

I
1.739 Beiträge seit 2005
vor 15 Jahren

Ja das nervt, daher der Vorschlag mit dem Invisible, dann visible nach dem Init der Componenten oder auch der Form selbst.

(mir kommt die Beschreibung irgendwie bekannt vor, passiert das auch so im Releasemode(D-Klick auf exe)?, soviel Kram ist das doch eigentlich nicht)

T
511 Beiträge seit 2008
vor 15 Jahren

Probier doch mal, die Dateien beim Programmstart in den ImageBuffer zu schreiben und hol sie Dir dorther wenn Du sie im Fenster benötigst. Damit entfällt zumindest schon einmal die Zeit für das Nachladen.
Finde, einen Versuch ist es Wert.

Nicht für das Leben, für die Arbeit lernen wir ...
Windows ist Klasse, ich nehme es um Linux zu downloaden ....

J
Jack_AI Themenstarter:in
193 Beiträge seit 2007
vor 15 Jahren

Hallo zusammen,

ich konnte das Problem weiter eingrenzen. Offenbar liegen die Performance-Probleme nicht an den Grafiken, sondern an der Transparenz-Eigenschaft der Labels selbst. Standardgemäß hat ein Label eine bestimmte Hintergrundfarbe. Wenn man diese jedoch auf transparent stellt, bekommt man jene Performance-Einbrüche.

In diesem Thread wird dasselbe Problem beschrieben, und auch hier scheint es an der Transparenz der Controls zu liegen. Leider konnte das Problem dort nicht gelöst werden.

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo Jack_AI,

statt Labels zu verwenden kannst du auch alles einfach selber zeichnen. Siehe [Tutorial] Zeichnen in Windows-Programmen (Paint/OnPaint, PictureBox).

herbivore

3.971 Beiträge seit 2006
vor 15 Jahren

Das Blöde an GDI ist, das das Zeichen (Berechnung der Bildpunkte, Z-Index) fasst ausschließlich die CPU übernimmt. Da bei Transparenz ein zusätzlicher "Farbkanal" hinzu kommt, kann sich die Berechnung um den Faktor 256 schonmal erhöhen. Ein anderen Ansatz verfolgt WPF. Dort werden Windows-Controls, Grafiken usw. durch die Grafikkarte (DirectX) gerendert, was die CPU entlastet.

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

J
Jack_AI Themenstarter:in
193 Beiträge seit 2007
vor 15 Jahren

Es ist wohl nur fair, euch über meinen aktuellen Status zu unterrichten.

kleines_eichhoernchen hat mich auf die Idee gebracht, das Projekt für WPF umzugestalten. Nun versuche ich herauszufinden, wie ich das möglichst einfach und schmerzfrei machen kann. Bei näherer Betrachtung wäre WPF so oder so besser geeignet. Momentan fehlt mich jedoch die Motivation, das Projekt auf WPF umzustellen, zumal ich mir dafür mehr Wissen über WPF aneignen müsste.

Wenn das Projekt Fortschritt macht, melde ich mich wieder.

Jack

J
Jack_AI Themenstarter:in
193 Beiträge seit 2007
vor 15 Jahren

Der Umstieg auf WPF ist leider sehr schwer und WPF ist mir (noch?) ein paar Nummern zu hoch. Darum werde ich wohl auf Controls mit transparentem Hintergrund verzichten müssen. Ich kann nur hoffen, dass diese Performance-Probleme im Zuge eines .NET-Updates behoben werden (sehr unwahrscheinlich).

Ansonsten Danke für eure Hilfe. Vielleicht tue ich mir irgendwann noch mal WPF an.

Jack

3.971 Beiträge seit 2006
vor 15 Jahren

Ich persönlich habe für die Grundlagen von WPF 3 Tage gedauert, wenn du die Zeit hast (und natürlich auch die Lust dazu), schau dir WPF mal mit allen Möglichkeiten die es bietet an, es lohnt sich auf jeden Fall.

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...