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/)
-   -   Schnelleres LineTo (https://www.delphipraxis.net/73924-schnelleres-lineto.html)

ChrisE 25. Jul 2006 18:29


Schnelleres LineTo
 
Hallo,

ich weiß nicht, ob ich hier in "Programmieren allgemein" richtig bin, aber ich beschreibe mal mein Problem.
Gegeben seien Messwerte (8 Stunden / 200 Hz / 12 Kanäle). Die Darstellung der Kanäle Erfolgt auf einer Paintbox. Abgesehen von der Skalierung der Wert in X- und Y-Richtung (bereits gelöst), bleibt das Problem, dass dieser Ansatz:
Delphi-Quellcode:
with PaintBox1.Canvas do begin
  MoveTo(0, WertToY(Wert[0]));
  for i := 0 to high(Wert) do
    LineTo(IndexToX(i), WertToY(Wert[i]));
end;
zu lange dauert. Das Problem ist natürlich die sehr große Anzahl (~ 12 * 5,76 Mio) von LineTo's.
Folgendes habe ich bereits Probiert:
1. PolyLine von TCanvas
Nicht wirklich schneller als der Code oben. Eher langsamer

2. Nur alle n-ten Werte Zeichnen die auf eine X-Koordiante fallen
Problem: Die Anzahl zu verringen geht so in erster Näherung nicht, das in den Werten Peaks sein können (...0,0,3,205678.789,4,5,6,7....).

3. Das Min und Max aller Werte die auf eine X-Koordinate Fallen bestimmen und dann MoveTo(X,Min), LineTo(X,Max);
Problem: Das Suchen in den Werten braucht auch seine Zeit.

Nun die Frage, gibt es eine ganz anderen Ansatz eine solchen "Linienwald" mit höherer Performance zu zeichnen?

Vielen Dank für Eure mühe.

Mfg, Chris

P.S.: Sollte auch unter Win98 funktionieren :-)

mkinzler 25. Jul 2006 18:36

Re: Schnelleres LineTo
 
Vielleicht hilft das Manuelle Zeichen der Geraden unter Zuhilfenahme des Bresenham-Algorithmuses.

Dax 25. Jul 2006 18:40

Re: Schnelleres LineTo
 
Du könntest aber auch statt einer Paintbox ein Image nehmen, das dortige Bitmap auf die gewünschte Größe bringen und auf das Bitmap des Images zeichnen. Müsste glaube ich auch schneller sein.

SirThornberry 25. Jul 2006 18:43

Re: Schnelleres LineTo
 
So wie ich das sehe wird direkt auf die Canvas von der Paintbox gezeichnet. Nach jedem LineTo wird somit die Canvas ausgegeben (auf dem Bildschirm) was eine Ewigkeit dauert. Zeischne lieber auf ein TBitmap.Canvas und wenn du dann fertig bist gebe das Bitmap mit BitBlt (oder einer dir beliebigen Methode) auf der entsprechenden Canvas auf dem Bildschirm aus.

himitsu 25. Jul 2006 18:54

Re: Schnelleres LineTo
 
ich glaub das mit dem TBitMap, als Zwischenspeicher, dann noch ScanLines kombiniert mit dem vorherigen Berechnen der MinMaxWerte sollte so das schnellste auf diesme Wege sein.

klar dauert es, wenn man sich minMaxWerte berechnet, aber es sollte alle Male schneller sein, also alles zu zeichnen :zwinker:

paritycheck 25. Jul 2006 19:00

Re: Schnelleres LineTo
 
Als Alternative könnte man das ganze evtl auch mit OpenGL auf ein Panel rendern.

arbu man 25. Jul 2006 19:06

Re: Schnelleres LineTo
 
OpenGL Scene ist schonmal nicht schlecht bei GLScene gibt es eine Klasse TGLCanvas die behersch eigentlich alles was canvas kann, nur das sie wesentlich schneller ist :)

Jens Schumann 25. Jul 2006 19:13

Re: Schnelleres LineTo
 
Wie wäre es denn mit der TeeChart Komponente?
Mit der Komponente habe ich in Sachen Geschwindigkeit sehr gute Erfahrungen gemacht.

ChrisE 25. Jul 2006 21:57

Re: Schnelleres LineTo
 
Hallo an alle,

erstmal danke für die Rege Teilnahme an dieser Frage :-)

@mkinzler:
Wenn ich Wikipedia da richtig verstehe, ist das in den meisten Treibern bereits implementiert -> LineTo müsste sogar schon mit diesem Allgo. arbeiten. Aber danke trotzdem für den Tip. Das hat meinen Horizont wieder erweitert :-)

@Dax
Ich habe das schlechtere Erfahrungen mit einem Image gemacht. Ist meist Langsamer (Gemessen mit QueryPerf....)


@SirThornberr
Genau so sehe ich das auch. Deinen Vorschlag hatte ich bereits vor dem Post von mir in einem Testprogramm mit Zeitmessung Programmiert. Leider ist es langamer als direktes Zeichnen???? Verstehe ich aber nicht. War der selben Meinung wie du.


@himitsu
Ich werde es mal Probieren. ScanLines ist noch ein gutes Stichwort.

@paritycheck & @arbu man
Werde ich mir mal anschauen. Das Problem ist, dass die Software ohne installation von [zitat:] ...sollchen spielerein wie DirectX bzw. OpenGL...[zitat ende] funktionieren soll :-(


@Jens Schumann
TeeChart erfüllt die Bedingungen nicht ganz, die ich benötige (Doppelte Daten wegen TSeries (Daten werden derzeit über FileStream gelesen um arbeitsspeicher zu sparen, wären dann aber mit TSeries doch wieder im Arbeitsspeicher). Aber danke für den Tip. Ich werde nochmal darüber nachdenken

DP-Maintenance 25. Jul 2006 22:17

DP-Maintenance
 
Dieses Thema wurde von "SirThornberry" von "Programmieren allgemein" nach "VCL / WinForms / Controls" verschoben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14: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