AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Performance bei vielen Images & Auflösung

Ein Thema von Hallo_Thomas · begonnen am 20. Mär 2006 · letzter Beitrag vom 21. Mär 2006
Antwort Antwort
Seite 1 von 2  1 2      
Hallo_Thomas

Registriert seit: 18. Apr 2005
Ort: Dresden
405 Beiträge
 
Delphi 2005 Professional
 
#1

Performance bei vielen Images & Auflösung

  Alt 20. Mär 2006, 00:21
Hallo,

Ich habe ein Programm mit realiv vielen Images ,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%)

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).


So und Hier ein paar Zeilen aus meinem Programm,Oben ist der Code,der die Performance am meisten beeinflusst...usw.,zumindest nach meiner Meinung.


Welche möglichkeiten gibt es die CPU Auslastung zu senken?Für ein Onclick Ereignis?

Dies wird im FormCreate ausgelöst:
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;
Miniaturansicht angehängter Grafiken
bild_115.jpg  
Angehängte Dateien
Dateityp: zip button_121.zip (88,3 KB, 9x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#2

Re: Performance bei vielen Images & Auflösung

  Alt 20. Mär 2006, 00:41
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.
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Hallo_Thomas

Registriert seit: 18. Apr 2005
Ort: Dresden
405 Beiträge
 
Delphi 2005 Professional
 
#3

Re: Performance bei vielen Images & Auflösung

  Alt 20. Mär 2006, 00:52
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.
  Mit Zitat antworten Zitat
Hallo_Thomas

Registriert seit: 18. Apr 2005
Ort: Dresden
405 Beiträge
 
Delphi 2005 Professional
 
#4

Re: Performance bei vielen Images & Auflösung

  Alt 20. Mär 2006, 01:40
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?
  Mit Zitat antworten Zitat
Benutzerbild von cruiser
cruiser

Registriert seit: 23. Dez 2003
Ort: Königsbrück/Sachsen
455 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Performance bei vielen Images & Auflösung

  Alt 20. Mär 2006, 02:49
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          *)
(**********************************************)
  Mit Zitat antworten Zitat
Hallo_Thomas

Registriert seit: 18. Apr 2005
Ort: Dresden
405 Beiträge
 
Delphi 2005 Professional
 
#6

Re: Performance bei vielen Images & Auflösung

  Alt 20. Mär 2006, 07:32
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.
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#7

Re: Performance bei vielen Images & Auflösung

  Alt 20. Mär 2006, 09:15
Zitat von cruiser:
tP wollt es so sagen (hoff ich):
Vorteil der schreibweise tP ist Name bei Mouseover

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.
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Hallo_Thomas

Registriert seit: 18. Apr 2005
Ort: Dresden
405 Beiträge
 
Delphi 2005 Professional
 
#8

Re: Performance bei vielen Images & Auflösung

  Alt 20. Mär 2006, 19:29


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;
Miniaturansicht angehängter Grafiken
bild_181.jpg  
Angehängte Dateien
Dateityp: zip button_151.zip (335,3 KB, 4x aufgerufen)
  Mit Zitat antworten Zitat
Hallo_Thomas

Registriert seit: 18. Apr 2005
Ort: Dresden
405 Beiträge
 
Delphi 2005 Professional
 
#9

Re: Performance bei vielen Images & Auflösung

  Alt 20. Mär 2006, 22:12
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.
(FindComponent('Images'+(iTag)) as TImage).Picture.Assign(Rot);
(FindComponent('Images'+((iTag))) as TImage).Picture.Bitmap.Canvas.TextOut(16, 16, '100');
  Mit Zitat antworten Zitat
Hallo_Thomas

Registriert seit: 18. Apr 2005
Ort: Dresden
405 Beiträge
 
Delphi 2005 Professional
 
#10

Re: Performance bei vielen Images & Auflösung

  Alt 20. Mär 2006, 22:42
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');
Angehängte Grafiken
Dateityp: bmp bild_436.bmp (8,7 KB, 12x aufgerufen)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:54 Uhr.
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