![]() |
Performance bei vielen Images & Auflösung
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo, :gruebel:
Ich habe ein Programm mit realiv vielen Images :coder: ,sobald ich ein onclick Ereignis auslöse, benötigt dies bei mir ca.15%-18% meiner CpuLeistung bei einer anderen Auflösung, und ca 5-8% bei gleicher Auflöung; (Bei einem Normalen Buttonclick ohne alles 0-2%) :witch: Ich hab rund 40 Images(BildGrösse ca. 3kb) die ich als Buttons nutze +120 Images(ohne Bild im folgenden Programm) die über den Buttons liegen mit je einem Label und ein Hintergrundimage(1MB). :warn: So und Hier ein paar Zeilen aus meinem Programm,Oben ist der Code,der die Performance am meisten beeinflusst...usw.,zumindest nach meiner Meinung. :stupid: Welche möglichkeiten gibt es die CPU Auslastung zu senken?Für ein Onclick Ereignis? :freak: Dies wird im FormCreate ausgelöst: :chat:
Delphi-Quellcode:
So werden die Bilder für die Buttons geladen, Ein Bild für Down und eins für Up(BildGrösse ca. 3kb)
Procedure TForm1.Aufloesung;
var Breite,Hoehe,x,y: integer; begin begin // hoehe:=864; // breite:=1152; hoehe:=800; breite:=1280; scaled := true; x:= Screen.width; y:= Screen.Height; if(y <> Hoehe) or (x <> Breite) then begin Form1.Height := (Form1.ClientHeight* y div Hoehe) + Form1.Height- Form1.ClientHeight; Form1.Width := (Form1.ClientWidth * x div Breite)+ Form1.Height - Form1.ClientHeight; scaleBy(x,Breite); end; end; end;
Delphi-Quellcode:
procedure TForm1.AllMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); var itag:String; begin iTag := IntToStr((Sender as TControl).Tag); (FindComponent('Image'+(iTag)) as TImage).Picture.Assign(Buttonx[(Sender as TImage).Tag]); end; Damit die Imagebuttons regieren, wenn die Labels mit Buttons drüber liegen:
Delphi-Quellcode:
procedure TForm1.LabelsOnMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); var i: Integer; iString:String; S:Timage; begin for i := 1 to 39 do begin S:= (FindComponent('Image'+(iString)) as Timage) ; iString:=IntToStr(i); if S is TImage then begin with S do if PtInRect(Rect(0, 0, Width, Height), ScreenToClient(Mouse.CursorPos)) then begin OnMouseUp(S, Button, Shift, X, Y); end; end; end; end; |
Re: Performance bei vielen Images & Auflösung
Ne ja, ist klar. Du hast tausend viele Images auf der Form und wundeerst dich das die CPU-Auslastung in die höhe geht.
Images also TImages sind Kontainer die als "Behälter" für Bilder vorgesehen sind. Bei TImages hängt noch ein bissel mehr dran als das normale Anzeigen, und das braucht halt sine Zeit. Was möchtest du machen ? Arbeite mit einemBitmap und kopiere deine Bilder auf dieses. |
Re: Performance bei vielen Images & Auflösung
Bei mir solls ca. 40 Buttons geben mit je einem Bild bei Mouse Down und Up.(Sind alles Images)
Über diesen Button liegen ca. 150 unsichtbare Images mit je einem Label.Je nach Sitation soll dann ein kleines Bildchen(Wie im BeispielProgramm ein Roter Kreis(habs jetzt noch nicht eingebunden,aber ist dabei)in einem oder mehreren Images aufleuchten.Mit einem kleinen text dazu.Man könnte sagen so ähnlich wie Blasen. Ich hab da echt keinen Plan wie ich machen soll, ich hatte schonprobiert die Button auf den Hintergrund zu Zeichnen und ein Bild wird nur aufgerufen wenn der Button nach unten geht, half aber nicht wirklich. Im wesentlichen muss ich 150 Positionen auf dem Bildschirm ansteuern können wo ich ein Bild mit nenn Textchen hinzaubern kann, und da sollte dass onclick ereignis nich schon 15%-20% der CpuLeistung fressen. |
Re: Performance bei vielen Images & Auflösung
Wenn ich das Hintergrundbild auf Visible:=False Stelle, benötige ich nur noch eine 5% Cpu Auslastung, dies ist ein starres Bild ohne jegliche Funktion, jedoch benötige ich es zur ansicht, das es Speicher frisst ist mir ja klar,aber das ein starres Bildchen ohne Funktion bei einem Buttonclick gleich 10% rechenleisung frisst, dass muss doch umgehbar sein?
|
Re: Performance bei vielen Images & Auflösung
Turbo wollt es so sagen (hoff ich):
1.) behalt die Koordinaten der 'Buttons' im Kopf (oder besser: errechne sie) 2.) Pack deine Bildschnippsel in eine (oder mehrere) ImageList(s) 3.) Reagiere auf onMouseMove, onMouseDown und onMouseUp des Hintergrund-Images (die geben auch die Koordinaten der Maus zurück) 4.) Errechne ob und über welchem 'Button' die Maus bewegt/geklickt wurde 5.) Zeichne deine Bildschnipsel mit folgender Funktion direkt auf das Bild (statt Images an und aus zu schalten / Die Funktion ist auch in der Delphi-Hilfe zu finden):
Delphi-Quellcode:
6.) Raus mit den Labels die kannst du auch mit folgender Funktion direkt auf den Hintergrund zeichnen (ebenfalls in der Delphi-Hilfe zu finden):
ImageList.Draw(Image.Canvas, x, y, index);
(***( Erklaerung: )****************************) (* ImageList - deine ImageList *) (* Image - dein Hintergrund-Image *) (* x, y - Koordinaten der oberen linke *) (* Ecke des 'Buttons' *) (* index - Die aufzumalende Button- *) (* Grafik (die Erste hat Index 0) *) (**********************************************)
Delphi-Quellcode:
Image.Canvas.TextOut(x, y, text);
(***( Erklaerung: )****************************) (* Image - dein Hintergrund-Image *) (* x, y - Koordinaten der oberen linke *) (* Ecke des Textes *) (* text - Der aufzumalende Text *) (**********************************************) |
Re: Performance bei vielen Images & Auflösung
Ok, Danke, ich werds mir mal anschauen.
Ich hab auch noch mah eh bissl ausprobiert und festgestellt wenn ich TJVBackround einsetzte kann ich die CPU-Last von 15% auf 7% senken. |
Re: Performance bei vielen Images & Auflösung
Zitat:
Ja und Nein. Ich hätte mir die Arbeit gemacht und alles auf einen Canvas gezeichnet. ;) Über einen Record würde ich mir dann die Grössen der einzelnen Buttons merken und könnte dan mit OnClick darauf reagieren. Vorteil, Geschwindigkeit und geringere Ramauslastung. (Beispiel das ![]() Für das Hintergrundbild würde ich auch einfach nur das Bitmap im Paintevent (FormPaint) auf die Form kopieren. (Jpegs oder Png's halt vorher umwandeln)
Delphi-Quellcode:
Einen Geschw.-Vorteil bringt auch wenn das Bitmap nur 256 Farben hat.
procedure TForm1.FormPaint(Sender: TObject);
begin Form1.Canvas.Draw(0, 0, MainBitmap); end; |
Re: Performance bei vielen Images & Auflösung
Liste der Anhänge anzeigen (Anzahl: 2)
:wall: :wall: :drunken: :wall: :drunken:
So, hab heut mah versucht datt eh bissl umzusetzen mit dem canvas, aber irgenwie will nix so recht. Irgendwie is datt rote bild immer vor dem Text
Delphi-Quellcode:
Klappt nich wirklich, sieht sch... aus.(Siehe Bild links oben der Button)
iTag := IntToStr(i);
(FindComponent('Images'+(iTag)) as TImage).Picture.Assign(Rot); (FindComponent('Images'+((iTag))) as TImage).Canvas.TextOut(16, 16, '100');
Delphi-Quellcode:
procedure TForm1.AllMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); var itag:wideString; begin iTag := IntToStr((Sender as TControl).Tag); //(FindComponent('Image'+(iTag)) as TImage).Picture.Assign(Buttonunten[(Sender as TImage).Tag]); ImageList1.Draw((FindComponent('Image'+(iTag)) as TImage).Canvas, 0, 0, 0); end; Klappt so halb, durch die auflösungsveränderung wills nich wirklich.(siehe Bild) Gibt es da einen Befehl?Noch einmal neuzeichnen oder so?
Delphi-Quellcode:
procedure TForm1.FormPaint(Sender: TObject);
begin Form1.Canvas.Draw(0, 0, MainBitmap); end; |
Re: Performance bei vielen Images & Auflösung
Zitat:
Hab noch die Zwei Sachen Probiert, irgendwie versteckt sich der Text hinter der Bitmap.
Delphi-Quellcode:
(FindComponent('Images'+(iTag)) as TImage).Picture.Assign(Rot);
Delphi-Quellcode:
(FindComponent('Images'+((iTag))) as TImage).Picture.Bitmap.Canvas.TextOut(16, 16, '100');
|
Re: Performance bei vielen Images & Auflösung
Liste der Anhänge anzeigen (Anzahl: 1)
:-D Schritt für Schritt kämpfe ich mich durch.
Jetzt ist die Schrift lrider noch zu transparent. Die Schrift sollte Transparent zum Image sein, sie ist aber transparent zur Form bzw zum Image unter dem Image. Siehe Bild.
Delphi-Quellcode:
iTag := IntToStr(i);
(FindComponent('Images'+(iTag)) as TImage).Picture.Assign(Rot); (FindComponent('Images'+((iTag))) as TImage).Picture.Bitmap.Canvas.Font.Size:=20; (FindComponent('Images'+((iTag))) as TImage).Picture.Bitmap.Canvas.TextOut(27, 32, '100'); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz