AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Auf's Neue: Performance bei vielen VCL Komponenten - anderer Ansatz ?

Auf's Neue: Performance bei vielen VCL Komponenten - anderer Ansatz ?

Ein Thema von hochundweit · begonnen am 22. Mär 2016 · letzter Beitrag vom 23. Mär 2016
Antwort Antwort
Seite 1 von 3  1 23   
hochundweit

Registriert seit: 9. Mär 2014
14 Beiträge
 
#1

Auf's Neue: Performance bei vielen VCL Komponenten - anderer Ansatz ?

  Alt 22. Mär 2016, 11:08
FPC 3.0.0

Liebe Delphi-Community,
mich wuerden Euere Inputs zu folgende Aufgabenstellung aus dem Bereich der Halbleiderproduktion interessieren: ich moechte die Testergebnisse elektrischer Tests auf
Chips auf einem Wafer darstellen; ein Beispiel-Bild habe ich angehaengt.

Aktuell erstelle fuer jeden Chip, der getestet wurde, eine eigene, leicht adaptierte VCL-Komponente (bisher habe ich TPaintBox und TStaticTest als Vorlagen verwendet) und gebe diese dann als Schleife ueber alle Chips/Wafer aus. Die Chips werden farblich codiert, um das Testergebnis zu visualisieren. Gruen(clGreen)=gut, alle anderen Farben= schlecht.
Problematisch an dieser Vorgehensweise mit vielen VCL's ist, dass sie nicht wirklich performant ist, will sagen, wenn das mal mehr als 2000 Chips werden, warte ich schon einige Sekunden auf den Aufbau der 2000 Paintboxen bzw. StaticTexte.

Dass das Ressourcenbedarf mit der Zahl der VCL-Komponenten exponentiell anwaechst, ist ja schon oefters in dem Forum angesprochen worden. Warum ich diese dann ueberhauot verwende ? Nun, das liegt daran, dass ich gerne die MouseEnter/MouseLeave Ereignisse verwende moechte, um ein wenig Text-Informationen ueber den einzelnen Chip auszugeben, der gerade unter dem Mauszeiger liegt.

Meine Frage: gibt es vielleicht performantere Komponenten, die ich in groessere Anzahl verwenden koennte und die eine MouseEnter/Leave Methode haben ?
Miniaturansicht angehängter Grafiken
snap.jpg  
  Mit Zitat antworten Zitat
bra

Registriert seit: 20. Jan 2015
711 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#2

AW: Auf's Neue: Performance bei vielen VCL Komponenten - anderer Ansatz ?

  Alt 22. Mär 2016, 11:23
Könntest du nicht anhand der Mausposition berechnen, über welchem Punkt sich die Maus gerade befindet und anhand dessen dann die Info ausgeben?
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

AW: Auf's Neue: Performance bei vielen VCL Komponenten - anderer Ansatz ?

  Alt 22. Mär 2016, 11:26
Problematisch an dieser Vorgehensweise mit vielen VCL's ist, dass sie nicht wirklich performant ist, will sagen, wenn das mal mehr als 2000 Chips werden, warte ich schon einige Sekunden auf den Aufbau der 2000 Paintboxen bzw. StaticTexte.
Das Problem liegt nicht bei der VCL, sondern an deinem Software-Design. 2000 PaintBoxes zu erstellen, nur um komfortabel OnMouseEnter/OnMouseLeave verwenden zu können, ist einfach Blödsinn.

Du brauchst eine einzige PaintBox, in der du alle Chips darstellst. Jetzt verwendest du das OnMouseMove Event der PaintBox, welches dir die Maus-Koordinaten übergibt und berechnest manuell welcher Chip sich darunter befindet.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Auf's Neue: Performance bei vielen VCL Komponenten - anderer Ansatz ?

  Alt 22. Mär 2016, 11:34
Ich kenne die Paintbox nicht und bin auch kein VCL-Guru, aber aus Spaß hatte ich einmal ein paar hunder relativ aufwändige TeeCharts in eine Scrollbox gepackt. Das hat selbst einen langsamen Rechner nicht gejuckt. Einmal musste natürlich alles gezeichnet werden, aber sobald das fertig war ging das bestens...

Kann es sein dass die Paintbox ein OnPaint-Event hat das dauernd aufgerufen wird, selbst man z.B. sein Formular nur scrollt obwohl die Box kein Stück sichtbar ist?
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Auf's Neue: Performance bei vielen VCL Komponenten - anderer Ansatz ?

  Alt 22. Mär 2016, 11:59
Ich muss mal nachfragen:

Dein Screenshot beinhaltet 2000 Paintboxen und jede Paintbox stellt eine Farbe dar? Ein "Pixel" repräsentiert quasi einen Chip?

Dann haben die Kollegen schon eine sinnvolle Lösung genannt.
Erzeuge ein Bitmap, kopiere das auf den Canvas und verwalte "virtuell" in einem Array wo sich welches Rechteck mit welchen Informationen befindet.
Über Mousemove ermittelst Du, die Daten welches Rechteckes eingeblendet werden müssen.

In ähnlicher Form habe ich mal einen kleinen GUI-Test gebaut (Quellen habe ich aber nicht mehr).
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
hochundweit

Registriert seit: 9. Mär 2014
14 Beiträge
 
#6

AW: Auf's Neue: Performance bei vielen VCL Komponenten - anderer Ansatz ?

  Alt 22. Mär 2016, 12:18
Problematisch an dieser Vorgehensweise mit vielen VCL's ist, dass sie nicht wirklich performant ist, will sagen, wenn das mal mehr als 2000 Chips werden, warte ich schon einige Sekunden auf den Aufbau der 2000 Paintboxen bzw. StaticTexte.
Das Problem liegt nicht bei der VCL, sondern an deinem Software-Design. 2000 PaintBoxes zu erstellen, nur um komfortabel OnMouseEnter/OnMouseLeave verwenden zu können, ist einfach Blödsinn.

Du brauchst eine einzige PaintBox, in der du alle Chips darstellst. Jetzt verwendest du das OnMouseMove Event der PaintBox, welches dir die Maus-Koordinaten übergibt und berechnest manuell welcher Chip sich darunter befindet.
Korrekt, ist die komfortable Loesung, aber eben nicht die beste, deshalb frage ich ja. Ich sehe schon, Deine und auch die weiteren Antworten laufen auf das Schema: mach einen Canvas, hol dir die Mauskoordinaten X/Y -> berechne welcher Chip -> mal was raus.
  Mit Zitat antworten Zitat
hochundweit

Registriert seit: 9. Mär 2014
14 Beiträge
 
#7

AW: Auf's Neue: Performance bei vielen VCL Komponenten - anderer Ansatz ?

  Alt 22. Mär 2016, 12:20
Ich kenne die Paintbox nicht und bin auch kein VCL-Guru, aber aus Spaß hatte ich einmal ein paar hunder relativ aufwändige TeeCharts in eine Scrollbox gepackt. Das hat selbst einen langsamen Rechner nicht gejuckt. Einmal musste natürlich alles gezeichnet werden, aber sobald das fertig war ging das bestens...

Kann es sein dass die Paintbox ein OnPaint-Event hat das dauernd aufgerufen wird, selbst man z.B. sein Formular nur scrollt obwohl die Box kein Stück sichtbar ist?
Hmm, gute Frage, ich weiss nicht. Wie koennte ich das checken, ob hier laufend die OnPaint-Events feuern ?
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#8

AW: Auf's Neue: Performance bei vielen VCL Komponenten - anderer Ansatz ?

  Alt 22. Mär 2016, 12:24
Hier mal mein auf die Schnelle gebastelter Ansatz:
Delphi-Quellcode:
type
  TChipData = record
  public
    Quality: Integer;
    HasFocus: Boolean;
  end;

var
  ChipData: array[0..29] of array[0..29] of TChipData;
  FocusedChip: TPoint;

procedure TForm2.FormCreate(Sender: TObject);
var
  I, J: Integer;
begin
  FocusedChip := Point(-1, -1);
  // Generate random chip distribution and qualities
  Randomize;
  FillChar(ChipData, SizeOf(ChipData), #0);
  for I := Low(ChipData) to High(ChipData) do
  begin
    for J := Low(ChipData[I]) to High(ChipData[I]) do
    begin
      ChipData[I][J].Quality := Random(4);
    end;
  end;
end;

const
  CHIPSIZE = 12; // The width and height of a single chip rect in pixels

procedure TForm2.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
  CX, CY: Integer;
begin
  CX := X div CHIPSIZE;
  CY := Y div CHIPSIZE;
  if (CY <= High(ChipData)) and (CX <= High(ChipData[0])) then
  begin
    if (FocusedChip.X <> CX) or (FocusedChip.Y <> CY) then
    begin
      if (FocusedChip.X >= 0) and (FocusedChip.Y >= 0) then
      begin
        ChipData[FocusedChip.Y][FocusedChip.X].HasFocus := false;
        MouseLeave(FocusedChip.X, FocusedChip.Y);
        FocusedChip := Point(-1, -1);
      end;
      FocusedChip.X := CX;
      FocusedChip.Y := CY;
      ChipData[CY][CX].HasFocus := true;
      MouseEnter(CX, CY);
    end;
  end else if (FocusedChip.X >= 0) and (FocusedChip.Y >= 0) then
  begin
    ChipData[FocusedChip.Y][FocusedChip.X].HasFocus := false;
    MouseLeave(FocusedChip.X, FocusedChip.Y);
    FocusedChip := Point(-1, -1);
  end;
end;

procedure TForm2.FormPaint(Sender: TObject);
var
  X, Y: Integer;
  R: TRect;
begin
  Canvas.Brush.Color := Color;
  Canvas.FillRect(ClientRect);
  for Y := Low(ChipData) to High(ChipData) do
  begin
    for X := Low(ChipData[Y]) to High(ChipData[Y]) do
    begin
      case ChipData[Y][X].Quality of
        0: Canvas.Brush.Color := clWhite;
        1: Canvas.Brush.Color := clGreen;
        2: Canvas.Brush.Color := clBlue;
        3: Canvas.Brush.Color := clRed;
      end;
      R := Rect(X * CHIPSIZE, Y * CHIPSIZE, X * CHIPSIZE + CHIPSIZE,
        Y * CHIPSIZE + CHIPSIZE);
      Canvas.FillRect(R);
      if (ChipData[Y][X].HasFocus) then
      begin
        Canvas.TextRect(R, R.Left, R.Top, IntToStr(ChipData[Y][X].Quality));
      end;
    end;
  end;
end;

procedure TForm2.MouseEnter(CX, CY: Integer);
begin
  // This is a custom method! NOT the OnMouseEnter event of the form
  RepaintChip(CX, CY);
end;

procedure TForm2.MouseLeave(CX, CY: Integer);
begin
  // This is a custom method! NOT the OnMouseLeave event of the form
  RepaintChip(CX, CY);
end;

procedure TForm2.RepaintChip(CX, CY: Integer);
var
  R: TRect;
begin
  R := Rect(CX * CHIPSIZE, CY * CHIPSIZE, CX * CHIPSIZE + CHIPSIZE,
    CY * CHIPSIZE + CHIPSIZE);
  InvalidateRect(WindowHandle, R, false);
end;
Die Daten zu den einzelnen Chips befinden sich im 2-dimensionalen ChipData Array (ChipData[Y][X] erlaubt den Zugriff auf einen spezifischen Chip). Die Größe des Arrays ist zu testzwecken statisch, kann aber auch ohne Probleme dynamisch festgelegt werden.

Da du bei einem MouseEnter und MouseLeave neu zeichnen willst (Text anzeigen oder wieder entfernen), machen die Events momentan nichts weiter, als das OnPaint Event des Formulars neu auszulösen. Um Flackern zu vermeiden, benutze ich hierfür MSDN-Library durchsuchenInvalidateRect.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
hochundweit

Registriert seit: 9. Mär 2014
14 Beiträge
 
#9

AW: Auf's Neue: Performance bei vielen VCL Komponenten - anderer Ansatz ?

  Alt 22. Mär 2016, 12:44
Ich muss mal nachfragen:

Dein Screenshot beinhaltet 2000 Paintboxen und jede Paintbox stellt eine Farbe dar? Ein "Pixel" repräsentiert quasi einen Chip?
Ja, das ist korrekt.


Dann haben die Kollegen schon eine sinnvolle Lösung genannt.
Erzeuge ein Bitmap, kopiere das auf den Canvas und verwalte "virtuell" in einem Array wo sich welches Rechteck mit welchen Informationen befindet.
Über Mousemove ermittelst Du, die Daten welches Rechteckes eingeblendet werden müssen.
Das muss dann wohl so. Danke !
  Mit Zitat antworten Zitat
hochundweit

Registriert seit: 9. Mär 2014
14 Beiträge
 
#10

AW: Auf's Neue: Performance bei vielen VCL Komponenten - anderer Ansatz ?

  Alt 22. Mär 2016, 13:14
@Zacherl: wow, danke fuer den Einsatz, fertiger Code, womit habe ich das verdient. Wird sogleich ausprobiert !
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 18:35 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