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;