AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

[XE7, VCL] Wie TChart-Zeichnen beschleunigen?

Ein Thema von nuclearping · begonnen am 1. Jul 2015 · letzter Beitrag vom 1. Jul 2015
Antwort Antwort
nuclearping

Registriert seit: 7. Jun 2008
708 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

[XE7, VCL] Wie TChart-Zeichnen beschleunigen?

  Alt 1. Jul 2015, 06:30
Hallo!

Ich habe in meinem Projekt drei TChart Komponenten. Jedes TChart enthält mehrere Serien. Die ersten beiden TChart enthalten insg. 5 TLineSeries . Das dritte eine TBarSeries und eine TLineSeries .

Diese Charts sind in einem TPageControl untergebracht. Jedes Chart hat seine eigene TTabSheet Seite. Die Charts werden kontinuierlich mit ausgewerteten Daten gefüttert, die über einen TThread von einer USB-Hardware ausgelesen und verarbeitet werden. Dabei nutzt der Thread zur Weitergabe der Daten schon kein Synchronize , sondern arbeitet mit PostMessage .

Jedoch stelle ich leider fest, dass diese Konstellation zum schreien langsam ist und der Flaschenhals hier in der Zeichnung des (sichtbaren) TChart liegt. Ich habe ein Beispielprojekt angehangen, wo das Problem deutlich wird. Zum zeichnen / aktualisieren eines TChart benötigt er bei maximierten Fenster (1920x1080) ~300-500ms, selbst nach dem Start der Anwendung, wenn noch nichtmal Daten vorhanden sind.

Das führt dazu, dass der Wechsel zwischen den TTabSheet Seiten hier in meiner Entwicklungs-VM ca. 1 Sekunde dauert. Auch die Buttons, das ganze Fenster usw. reagieren dermaßen verzögert, dass man das keinem anbieten kann. Die VM läuft auf 2/1 CPUs, 8GB RAM; Host-System ist ein i7 4790K @ 4GHz, 16GB RAM. Auf einem Testlaptop beim Kunden sieht das Ganze jedoch genauso aus, sogar noch schlimmer. Dort ging dann nach dem Wechsel zur Diagram-Ansicht nach einer kurzen Zeit garnichts mehr, weil das System mit dem Zeichnen nicht klar gekommen ist.

Den einzigen Geschwindigkeitszuwachs sehe ich, wenn ich das Fenster extrem verkleinere. Aber das ist ja nicht Sinn der Sache.

Habt ihr eine Idee, wie ich das Ganze (um Faktoren) beschleunigen kann? Geht da überhaupt noch was mit TChart? Was nutzt ihr denn für die Darstellung von solchen Daten?

Ich habe hier noch TMS Advanced Charts in der Palette. Damit habe ich früher mal gearbeitet, jedoch ziemlich schlechte Erfahrungen mit der ZoomControl gemacht und seither nicht mehr angefasst.

Auch wollte ich die Charts von Lohninger mal probieren. Das scheitert jedoch schon daran, dass ich nach der Installation und dem Öffnen eines Beispielprojekts eine Zugriffsverletzung bei Adresse 19DB4072 in Modul 'sdlchartpack_rt_104X7.bpl'. Schreiben von Adresse 00000070. erhalte. Das gleiche auch beim Anlegen eines neuen Testprojekts, mit dem Versuch eine "RChart"-Komponenten auf die Form zu ziehen. Und bei der Deinstallation der Lohninger-Komponenten hat er meinen Delphi-Bibliothekspfad irgendwie geleert und seither funktioniert auch Castalia nicht mehr (ebenfalls Zugriffsverletzung in einer der Castalia-BPLs beim Start von Delphi), auch nicht nach einer De- und Reinstallation.

Wäre für jede Hilfe dankbar!

Vielen Dank!
Angehängte Dateien
Dateityp: zip TChartTest.zip (58,4 KB, 5x aufgerufen)
  Mit Zitat antworten Zitat
ConstantGardener

Registriert seit: 24. Jan 2006
Ort: Halberstadt
375 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: [XE7, VCL] Wie TChart-Zeichnen beschleunigen?

  Alt 1. Jul 2015, 07:03
...also auf den ersten Blick fehlen mir da Series.BeginUpdate und Series.EndUpdate. Das beschleunigt das zeichnen schon etwas. Die LineSeries könntest/solltest Du zu FastLineSeries machen.
Außerdem solltest Du das Scrollen (SetBounds) vor dem EndUpdate handeln, sonnst muss er ja alles nochmal zeichnen.
Andreas Schachtner
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: [XE7, VCL] Wie TChart-Zeichnen beschleunigen?

  Alt 1. Jul 2015, 08:23
Die Optimierungen am Chart sind die eine Sache, der Transport der Werte eine völlig andere.

Man bekommt jedes Control und damit die Anzeige in den Wahnsinn getrieben, wenn man nur schnell genug versucht dort Daten hinein zu pusten. Je aufwändiger das Erzeugen der Darstellung ist, umso schneller erreicht man den Zustand "geht nix mehr".

Darum ja auch die Trennung von Darstellung, Daten und Code.

Der Thread sollte die Daten in einen Speicher schreiben.
Der Speicher signalisiert, dass neue Daten vorhanden sind.
Die Anzeige nimmt dieses Signal zur Kenntnis und stellt die Daten (aus dem Speicher) dar, wenn Zeit dafür da ist.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli
Online

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

AW: [XE7, VCL] Wie TChart-Zeichnen beschleunigen?

  Alt 1. Jul 2015, 08:31
Also konkrete Hilfe kann ich nicht geben, aber...

Schau mal (wenn Du das irgendwie erkennen kannst), wie oft das Control sich zeichnet. Wenn Du z.B. einem Panel die aktuelle Breite nochmal zuweist, zeichnet es sich (und die Umgebung ebenfalls) nochmal neu.
Wenn das Wiederholt-Neuzeichnen in einem Control gekapselt wäre ist dem vielleicht schlecht beizukommen.

Aber vielleicht kannst Du mit Ersetzen von
MyChart.Widht := 100 durch
Delphi-Quellcode:
if MyChart.Widht <> 100 then
  MyChart.Widht := 100
oder mit ähnlichen Maßnahmen schon etwas erreichen.


Ansonsten wäre es vielleicht möglich, das Chart in einem Thread ein Bitmap erzeugen zu lassen und wenn das fertig ist, dieses in´s Formular zu kopieren. Ist natürlich umständlich und ggf. schwierig, aber vielleicht als Notlösung machbar.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Der schöne Günther

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

AW: [XE7, VCL] Wie TChart-Zeichnen beschleunigen?

  Alt 1. Jul 2015, 08:55
Mein 20 Sekunden-Test: Mache ich beim Chart das GDI+-AntiAlias aus, geht die Zeichnzeit von 516ms auf 37ms runter

(Und mit OpenGL habe ich 0ms)
  Mit Zitat antworten Zitat
nuclearping

Registriert seit: 7. Jun 2008
708 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: [XE7, VCL] Wie TChart-Zeichnen beschleunigen?

  Alt 1. Jul 2015, 13:52
Danke für eure Antworten!

Mein 20 Sekunden-Test: Mache ich beim Chart das GDI+-AntiAlias aus, geht die Zeichnzeit von 516ms auf 37ms runter

(Und mit OpenGL habe ich 0ms)
Oh man. Du bist mein Held! Das war es! Vielen Dank!

Ich hatte schon sowas vermutet, konnte aber auf den ersten Blick nichts finden. Und eine Google-Suche nach TChart AntiAliasing hatte mich eher zu der Annahme geführt, dass man das AntiAliasing erst aktiv einschalten müsste: http://www.teechart.net/support/view...t=13164#p60730 Chart1.Tools.Add(TAntiAliasTool);

Wenn ich aber mal auf das Chart doppelklicke, Chart -> 3D -> Renderer da ist dort in der Tat unter GDI+ ein "AntiAlias" Häkchen versteckt. Und siehe da: In der Tat nur 31ms fürs zeichnen. Und wenn ich statt GDI+ nur GDI nehme, schafft er das Ganze sogar auch in 0ms. Wow!

Wie schalte ich denn OpenGL ein? Oder gibts das erst ab einer höheren TeeChart Version? Bei mir in der Palette ist nur unter "TeeChart Lite" "TTeeGDIPlus" und bei "Renderer" hatte ich nur "GDI" und "GDI+" in der Liste.

Darum ja auch die Trennung von Darstellung, Daten und Code.

Der Thread sollte die Daten in einen Speicher schreiben.
Der Speicher signalisiert, dass neue Daten vorhanden sind.
Die Anzeige nimmt dieses Signal zur Kenntnis und stellt die Daten (aus dem Speicher) dar, wenn Zeit dafür da ist.
Ja, da hast du auf jeden Fall recht.

Das Hauptprogramm macht das auch. Der Thread pusht die verarbeiteten Daten per PostMessage an ein Fenster, was die Werte erstmal in verschiedene TList<TRecord> ablegt und dem Frame, wo die Charts draufliegen, danach "bescheid" sagt. Da hatte ich schonmal mit den TimeOuts herumgespielt. Hat nichts gebracht. Weil wie schon gesagt, er brauchte ja für das Darstellen eines nackten Charts schon ~500ms.

Aber siehe oben: Der Tipp von Günther hats gebracht!

...also auf den ersten Blick fehlen mir da Series.BeginUpdate und Series.EndUpdate. Das beschleunigt das zeichnen schon etwas. Die LineSeries könntest/solltest Du zu FastLineSeries machen.
Außerdem solltest Du das Scrollen (SetBounds) vor dem EndUpdate handeln, sonnst muss er ja alles nochmal zeichnen.
Das hatte ich schon probiert und leider keinen signifikanten Unterschied gemerkt. Habs grad eben nochmal reaktiviert, und es macht in der Tat leider keinen Unterschied.

Delphi-Quellcode:
procedure TForm1.Chart_BeginUpdate;
var
  i: Integer;
begin
  for i := 0 to 4 do
    begin
      Chart1.Series[i].BeginUpdate;
      Chart2.Series[i].BeginUpdate;
    end;
end;

procedure TForm1.Chart_EndUpdate;
var
  i: Integer;
begin
  for i := 0 to 4 do
    begin
      Chart1.Series[i].EndUpdate;
      Chart2.Series[i].EndUpdate;
    end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  ST, ET, TT: Cardinal;
begin
  ST := GetTickCount;

  Chart_BeginUpdate;
  try
    PlotMeanData;
    PlotValueData;
    HandleScroll;
  finally
    Chart_EndUpdate;
  end;

  ET := GetTickCount;
  TT := ET - ST;
  Label1.Caption := 'Draw Time: ' + TT.ToString + 'ms';
end;
  Mit Zitat antworten Zitat
Der schöne Günther

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

AW: [XE7, VCL] Wie TChart-Zeichnen beschleunigen?

  Alt 1. Jul 2015, 15:50
Ich habe TeeChart Pro, kann sein dass es OpenGL bei TeeChart Lite nicht gibt
  Mit Zitat antworten Zitat
nuclearping

Registriert seit: 7. Jun 2008
708 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#8

AW: [XE7, VCL] Wie TChart-Zeichnen beschleunigen?

  Alt 1. Jul 2015, 16:27
Ok. Danke. Das normale GDI sieht zwar jetzt nicht so schick aus, aber es erfüllt seinen Zweck allemal.
  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 14:34 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