AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Performanceproblem: Anzeige von Positionen mehrerer Clients
Thema durchsuchen
Ansicht
Themen-Optionen

Performanceproblem: Anzeige von Positionen mehrerer Clients

Ein Thema von alphaflight83 · begonnen am 20. Dez 2010 · letzter Beitrag vom 14. Feb 2011
Antwort Antwort
Benutzerbild von alphaflight83
alphaflight83

Registriert seit: 5. Jun 2008
Ort: Würzburg
148 Beiträge
 
Delphi 12 Athens
 
#1

AW: Performanceproblem: Anzeige von Positionen mehrerer Clients

  Alt 21. Dez 2010, 16:33
Das Programm beinhaltet mehrere Teilbereiche, die Positionsanzeige ist also nur eine Funktion unter vielen,
von denen mehrere gleichzeitig laufen können müssen.

Mit Positionsloggen meinte ich, dass die Positionsdaten der Clients über einen gewissen Zeitraum gesammelt werden.
Angezeigt werden kann, der Übersicht wegen, immer nur der Pfad eines Clients.

Das mit dem Offscreenbitmap ist keine schlechte Idee und sollte funktionieren.
Damit und mit GDI werde ich mich mal näher befassen.

Danke schön für den Tipp.
Make me a sandwich! - What? Make it yourself. - Sudo make me a sandwich! - Okay
  Mit Zitat antworten Zitat
Benutzerbild von alphaflight83
alphaflight83

Registriert seit: 5. Jun 2008
Ort: Würzburg
148 Beiträge
 
Delphi 12 Athens
 
#2

AW: Performanceproblem: Anzeige von Positionen mehrerer Clients

  Alt 20. Jan 2011, 15:16
So, ich bin mal wieder bei diesem Thema gelandet ... und dank der Tipps von Bummi bin ich ein Stück weiter gekommen.
Das Offscreenbitmap funktioniert grundsätzlich und ich habe die verlinkten Sprites verwendet um die Clients anzuzeigen.
Abgesehen von ein paar Details habe ich nun ein Problem:
Ich möchte die Sprites eigentlich mit auf das Offscreenbitmap packen, nur hat sich mir bisher nicht erschlossen,
wie ich die gedrehten Sprites da rauf bekomme, bzw. ob das so überhaupt möglich ist.
Oder anders formuliert: Wie kann ich performant ein Bitmap drehen um es dann auf das Offscreenbitmap zu kopieren.
(In der Endanwendung sollen um die 60 Clienten angezeigt werden.)

Zudem hab ich bisher noch nicht gerafft, wie ich ein Bitmap/Image komplett "löschen", also auf komplette Transparenz zurücksetzen kann.
Edit: Hab einen Thread zum Leeren von Offscreenbitmaps gefunden, in dem Möglichkeiten aufgezeigt werden.

Grundsätzlich ist das Vorgehen doch richtig, die Position und Ausrichtung aller Clienten zu ermitteln und nacheinander auf ein Offscreenbitmap zu zeichnen,
das dann wiederum nach dem Hintergrund-Offscreenbitmap auf das Canvas gezeichnet wird?!?
Das Positions-Offscreenbitmap wollte ich dann zyklisch neu zeichnen um die Positionen anzupassen ...

Hab mich jetzt auch mal an GDI+ rangewagt (Mit der Version von Erik van Bilsen) Allerdings gibt es hier noch einige Unklarheiten.
(z.B. Kann man ein Objekt "Auf der Stelle" rotieren, ohne dass durch RotateTransform das Koordinatensystem für ein TranslateTransform verschoben wird?)

Grüße, alphaflight83
Make me a sandwich! - What? Make it yourself. - Sudo make me a sandwich! - Okay

Geändert von alphaflight83 (21. Jan 2011 um 10:00 Uhr) Grund: Thread "Leeren von Offscreenbitmaps" gefunden
  Mit Zitat antworten Zitat
Benutzerbild von alphaflight83
alphaflight83

Registriert seit: 5. Jun 2008
Ort: Würzburg
148 Beiträge
 
Delphi 12 Athens
 
#3

AW: Performanceproblem: Anzeige von Positionen mehrerer Clients

  Alt 11. Feb 2011, 09:52
So, ich glaube ich habe nun das Ergebnis, das ich haben wollte.

Zunächst mal hab ich einen Zwischenschritt beim Zeichnen weggelassen der keinen Sinn machte
und zeichne nun alles auf EIN Offscreenbitmap.

Mit GDIPlus hab ich nun auch bei den rotierten Images ein zufriedenstellendes Ergebnis erzielt.

Anmerkungen:
Der Beispiel-Code verwendet kein Offscreenbitmap.
Die Bilsen GDIPlus Implementation verwendet Objekt-Interfaces.

Delphi-Quellcode:
uses GDIPlus;

procedure TFormDrawThis.DrawImages;
var
  Graphics: IGPGraphics;
  Image: IGPImage;
  Matrix: IGPMatrix;
  imgWidth, imgHeight : Integer;
  Angle : Single;
begin
  (* Lock the canvas *)
  Canvas.Lock;

  (* Get the dimensions of the bitmap *)
  imgWidth := Image.GetWidth;
  imgHeight := Image.GetHeight;
   
  (* Create the GDIPlus components *)
  Graphics := TGPGraphics.Create(Canvas.Handle);
  Image := TGPImage.Create(sImage_Path + 'AwesomeImage.png', TRUE);
  (* Create the transformation matrix *)
  Matrix := TGPMatrix.Create;

  (* Set the transformation *)
  Angle := 30.0;
  Matrix.Translate(150, 100);
  Matrix.RotateAt(Angle, TGPPointF.Create(150, 100), MatrixOrderAppend);
  Graphics.SetTransform(Matrix);

  (* Draw the image according to the transformation translated to it's center *)
  Graphics.DrawImage(Image,-imgWidth*0.5,-imgHeight*0.5, imgWidth, imgHeight);

  (* Reset the transformation in the matrix and the graphics *)
  Graphics.ResetTransform;
  Matrix.Reset;

  (* Set the new transformation *)
  Angle := 120.0;
  Matrix.Translate(100, 150);
  Matrix.RotateAt(Angle, TGPPointF.Create(100, 150), MatrixOrderAppend);
  Graphics.SetTransform(Matrix);

  (* Draw the next image according to the transformation translated to it's center *)
  Graphics.DrawImage(Image,-imgWidth*0.5,-imgHeight*0.5, imgWidth, imgHeight);

  (* Reset the transformation in the matrix and the graphics *)
  Graphics.ResetTransform;
  Matrix.Reset;
   
  (* aso *)

  (* Flush all the stuff to the canvas *)
  Graphics.Flush();
end;
Falls jemand eine einfachere Möglichkeit kennt, immer her damit

Gruß, alphaflight83
Make me a sandwich! - What? Make it yourself. - Sudo make me a sandwich! - Okay

Geändert von alphaflight83 (11. Feb 2011 um 10:09 Uhr) Grund: Anmerkungen
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#4

AW: Performanceproblem: Anzeige von Positionen mehrerer Clients

  Alt 11. Feb 2011, 16:22
@alphaflight83: dein Kommentarstil ist na ja, etwas "ineffizient".
Hier zwei Beispiele:
Delphi-Quellcode:
(* Lock the canvas *)
Canvas.Lock;

(* Flush all the stuff to the canvas *)
Graphics.Flush();
Diese Kommentare haben keine Aussagekraft und sind damit mehr schädlich als nützlich.
Soll heisen, man sollte keine Dinge kommentieren, die ganz offensichtlich aus dem Code hervorgehen.
Stattdessen würde ein mehrzeiliger Kommentar vor der Methode der in zwei Sätzen erklärt,
was hier passieren soll deutlich mehr Information an den Leser geben.

Ausserdem brauchst du für jede Kommentarzeile zu viel Schreibaufwand, weil du (* *) anstelle von // benützt.
Ich benütze Kommentare so:

Delphi-Quellcode:
// das ist ein Einzeiliger Kommentar

{
mehrzeile Kommentare
lassen sich gut mit geschweiften Klammern umsetzen.
diese Blöcke setze ich gerne vor Methoden um zu erklären
was der folgende Code tun soll
}


(* auskommentierter Code
if debug_flag then
  ShowMessageFmt('Anzahl=%d', [anz]);
*)
Styleguide > Kommentare

Und jetzt hätte ich noch eine Bitte an Alle:
bitte hier keine Diskussion über Kommentare im Sourcecode anfangen.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#5

AW: Performanceproblem: Anzeige von Positionen mehrerer Clients

  Alt 11. Feb 2011, 19:21
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von alphaflight83
alphaflight83

Registriert seit: 5. Jun 2008
Ort: Würzburg
148 Beiträge
 
Delphi 12 Athens
 
#6

AW: Performanceproblem: Anzeige von Positionen mehrerer Clients

  Alt 14. Feb 2011, 08:55
@shmia: Okay, ist angekommen.
Ich mag zwar den "Look" von //-Kommentaren irgendwie nicht,
aber ich werde versuchen das in Zukunft mehr zu berücksichtigen
... und einige der Kommentare sind wirklich unnötig.
Make me a sandwich! - What? Make it yourself. - Sudo make me a sandwich! - Okay
  Mit Zitat antworten Zitat
Antwort Antwort


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 22:54 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-2025 by Thomas Breitkreuz