![]() |
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:
zu lange dauert. Das Problem ist natürlich die sehr große Anzahl (~ 12 * 5,76 Mio) von LineTo's.
with PaintBox1.Canvas do begin
MoveTo(0, WertToY(Wert[0])); for i := 0 to high(Wert) do LineTo(IndexToX(i), WertToY(Wert[i])); end; 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 :-) |
Re: Schnelleres LineTo
Vielleicht hilft das Manuelle Zeichen der Geraden unter Zuhilfenahme des Bresenham-Algorithmuses.
|
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.
|
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.
|
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: |
Re: Schnelleres LineTo
Als Alternative könnte man das ganze evtl auch mit OpenGL auf ein Panel rendern.
|
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 :)
|
Re: Schnelleres LineTo
Wie wäre es denn mit der TeeChart Komponente?
Mit der Komponente habe ich in Sachen Geschwindigkeit sehr gute Erfahrungen gemacht. |
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
Dieses Thema wurde von "SirThornberry" von "Programmieren allgemein" nach "VCL / WinForms / Controls" verschoben.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:24 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