Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Performance bei vielen Images & Auflösung (https://www.delphipraxis.net/65679-performance-bei-vielen-images-aufloesung.html)

Hallo_Thomas 19. Mär 2006 23:21


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:
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;
So werden die Bilder für die Buttons geladen, Ein Bild für Down und eins für Up(BildGrösse ca. 3kb)
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;

turboPASCAL 19. Mär 2006 23:41

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.

Hallo_Thomas 19. Mär 2006 23:52

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.

Hallo_Thomas 20. Mär 2006 00:40

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?

cruiser 20. Mär 2006 01:49

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:
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) *)
(**********************************************)
6.) Raus mit den Labels die kannst du auch mit folgender Funktion direkt auf den Hintergrund zeichnen (ebenfalls in der Delphi-Hilfe zu finden):
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         *)
(**********************************************)

Hallo_Thomas 20. Mär 2006 06:32

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.

turboPASCAL 20. Mär 2006 08:15

Re: Performance bei vielen Images & Auflösung
 
Zitat:

Zitat von cruiser
tP wollt es so sagen (hoff ich):

Vorteil der schreibweise tP ist Name bei Mouseover :mrgreen:

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 Pong - Game ist aber ohne Mouseklickabfrage)

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:
procedure TForm1.FormPaint(Sender: TObject);
begin
  Form1.Canvas.Draw(0, 0, MainBitmap);
end;
Einen Geschw.-Vorteil bringt auch wenn das Bitmap nur 256 Farben hat.

Hallo_Thomas 20. Mär 2006 18:29

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:
   iTag := IntToStr(i);
    (FindComponent('Images'+(iTag)) as TImage).Picture.Assign(Rot);
   (FindComponent('Images'+((iTag))) as TImage).Canvas.TextOut(16, 16, '100');
Klappt nich wirklich, sieht sch... aus.(Siehe Bild links oben der Button)
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;

Hallo_Thomas 20. Mär 2006 21:12

Re: Performance bei vielen Images & Auflösung
 
Zitat:

Irgendwie is datt rote bild immer vor dem Text
Delphi-Quellcode: markieren
iTag := IntToStr(i);
(FindComponent('Images'+(iTag)) as TImage).Picture.Assign(Rot);
(FindComponent('Images'+((iTag))) as TImage).Canvas.TextOut(16, 16, '100');

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');

Hallo_Thomas 20. Mär 2006 21:42

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 01:09 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz