![]() |
AW: Auf's Neue: Performance bei vielen VCL Komponenten - anderer Ansatz ?
Obwohl ich irgendwie das Gefühl habe, dass jeder Chip nicht als ein Pixel sondern als Fläche angezeigt werden soll.
Das Prinzip ist aber das Gleiche :stupid: |
AW: Auf's Neue: Performance bei vielen VCL Komponenten - anderer Ansatz ?
Fertig ... naja
Statt in der Form das in eine TPaintBox. Im Paint/OnPaint wird gezeichnet. In einem Array stehen die Daten. Und bei Datenänderung oder beim OnMouseEnter/OnMouseMove/OnMouseLeave wird ein Repaint ausgelöst. Alternativ malt man auf ein TBitmap. die TPaintBox gibt im OnPaint das Bitmap aus und bei Änderungen am Bitmap wird anschließend das Repaint ausgelöst. (Man kann auch ein TImage verwenden, was im Prinzip das Selbe macht, falls dich dessen negative Geschwindigkeit nicht stört) 1 Pixel: Sooo viele Chips sind selten auf einem Wafer und ich denk nicht, daß er den Wafer zu klein zeichnen will. Ach ja, viele Grüße aus dem Silicon Saxony. :hi: |
AW: Auf's Neue: Performance bei vielen VCL Komponenten - anderer Ansatz ?
Es macht auch Sinn, das in ein Control (sichtbare Komponente) zu packen.
Die dargestellten Items beinhalten dann nur die benötigten Daten für die Anzeige:
Delphi-Quellcode:
Das Control selber liefert einem das aktuell gewählte Item bzw. das Item, was sich unter der Maus befindet (was halt benötigt wird).
TFooItem = class
published property Color: TColor; property Text: string; property Hint: string; end; Um jetzt einen Chip anzuzeigen leitet man sich ein entsprechendes Item ab:
Delphi-Quellcode:
und befüllt intern die Eigenschaften.
TChipItem = class( TFooItem )
... end; |
AW: Auf's Neue: Performance bei vielen VCL Komponenten - anderer Ansatz ?
Gruesse zurueck nach Silicon Saxony !
In der Tat haben wir uebrigens wirklich so kleine "Nano-Gate" Chips, von denen 400.000 auf einen 8-Zoll Wafer passen. Meist sind sie aber deutlich groesser, einige unserer AD-Converter haben einen Wafer-Count von knapp 500. Dagegen sind die meisten CPU's schon Winzlinge.... |
AW: Auf's Neue: Performance bei vielen VCL Komponenten - anderer Ansatz ?
Ich hatte vor langer Zeit (Delphi 5) einen ähnlichen Anwendungsfall. Damals hatte ich für die Darstellung ein TGrid verwendet. Die Linien ausblenden und je nach Wafergrösse und Anzahl Chips Breite und Höhe der Spalten und Zeilen einstellen. Die Koordinaten erhältst Du damit praktisch automatisch geliefert. :-D
|
AW: Auf's Neue: Performance bei vielen VCL Komponenten - anderer Ansatz ?
Zitat:
Delphi-Quellcode:
Aufruf vor dem
ClientToParent
![]() Zitat:
Wäre es Produktivcode, würde ich die Zeichen-Routinen definitiv in einer eigenen Komponente kapseln. Des Weiteren sollte man eventuell noch Caching einbauen. ![]() |
AW: Auf's Neue: Performance bei vielen VCL Komponenten - anderer Ansatz ?
Zitat:
Einfacher ist es sicherlich, bei Änderungen ein komplettes neues Bild zu generieren. Bei den vorliegenden Anforderungen geht das sicherlich auch rappelschnell. (In meinem Demo bewegen sich tausende "Controls" auch schnell und absolut flüssig.) Wenn man die geänderten Bereiche ermittelt und nur die neu zeichnet, muss das bei der geplanten Bildgröße und Komplexität nicht schneller sein. Ich würde zunächst erst mal den einfachen Weg versuchen. |
AW: Auf's Neue: Performance bei vielen VCL Komponenten - anderer Ansatz ?
Die PaintBox kann man aber beliebig verschieben (Position und Parent), ohne dass sich der Start der Zeichenposition ändert
und beim Debuggen/Fehlersuche macht es sich auch besser, wenn man den code immer schön trennt. PS: TPaintBox zeichnet nicht auf dem eigenen Canvas (es hat Keines), sondern leitet die Zeichenbefehle an seinen Parent weiter. (TLabel und TImage ebenso) |
AW: Auf's Neue: Performance bei vielen VCL Komponenten - anderer Ansatz ?
Zitat:
@hochundweit: Mit wie vielen Chips muss man denn realistisch rechnen? Also welche Höhe und Breite kann das Grid maximal haben? Und ändern sich die Eigenschaften der Chips noch nachträglich, oder beeinflusst wirklich nur die Mausposition die Darstellung? |
AW: Auf's Neue: Performance bei vielen VCL Komponenten - anderer Ansatz ?
Liste der Anhänge anzeigen (Anzahl: 1)
Ist es nicht einfacher wie schon erwähnt ein TDrawGrid zu verwenden?
Delphi-Quellcode:
unit Unit1;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Grids, Vcl.ExtCtrls, Vcl.StdCtrls; type TChipData = Integer; // oder auch Record ... TForm1 = class(TForm) DrawGrid1: TDrawGrid; Panel1: TPanel; Button1: TButton; procedure FormCreate(Sender: TObject); procedure DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); procedure DrawGrid1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure Button1Click(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private-Deklarationen } FRowCount: Integer; FColCount: Integer; FChipData: array of array of TChipData; procedure LoadChipData; public { Public-Deklarationen } end; var Form1: TForm1; implementation uses Math; {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin FColCount := 100; FRowCount := 100; SetLength(FChipData, FColCount, FRowCount); DrawGrid1.RowCount := FRowCount; DrawGrid1.ColCount := FColCount; DrawGrid1.FixedRows := 0; DrawGrid1.FixedCols := 0; DrawGrid1.DefaultColWidth := 6; DrawGrid1.DefaultRowHeight := 6; end; procedure TForm1.FormDestroy(Sender: TObject); begin SetLength(FChipData, 0, 0); end; procedure TForm1.LoadChipData; function PosImKreis(x, y, r: Integer): Boolean; begin Result := Power(x, 2) + Power(y, 2) <= Power(r, 2) end; var x, y, q: Integer; x0, y0, r: Integer; begin x0 := FColCount div 2; y0 := FRowCount div 2; r := FRowCount div 2; Randomize; SetLength(FChipData, 0, 0); SetLength(FChipData, FColCount, FRowCount); for x := 0 to FColCount -1 do for y := 0 to FRowCount -1 do begin if PosImKreis(x - x0, y - y0, r) then begin q := Random(100) +1; if q > 3 then // damit nicht so viel Ausschuß entsteht ;) q := 1; end else q := 0; FChipData[ x,y] := q; end; end; procedure TForm1.Button1Click(Sender: TObject); begin LoadChipData; DrawGrid1.Invalidate; end; procedure TForm1.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin if InRange(ACol, 0, FColCount) and InRange(ARow, 0, FRowCount) then case FChipData[ACol, ARow] of 0: DrawGrid1.Canvas.Brush.Color := clWhite; 1: DrawGrid1.Canvas.Brush.Color := clLime; 2: DrawGrid1.Canvas.Brush.Color := clBlue; 3: DrawGrid1.Canvas.Brush.Color := clRed; end; DrawGrid1.Canvas.FillRect(Rect); end; procedure TForm1.DrawGrid1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var P: TGridCoord; begin P := DrawGrid1.MouseCoord(X, Y); if InRange(P.X, 0, FColCount) and InRange(P.Y, 0, FRowCount) then Panel1.Caption := Format('Chip: %d-%d Quality: %d', [P.X, P.Y, FChipData[P.X, P.Y]]) else Panel1.Caption := ''; end; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:05 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