Je suis en train de jouer avec FireMonkey pour voir si le graphique de la peinture est plus vite que le GDI ou Graphics32 (ma bibliothèque de choix pour le moment).
Pour voir comment il est rapide, j'ai effectué quelques tests, mais je croise certains des comportements bizarres:
Tracez des lignes fines (<1.5 pixel de large) semble extrêmement lent comparativement lignes plus épaisses:
- Axe Vertical: les cycles de l'uc à la peinture de 1000 lignes
- Axe Horizontal: ligne tickness*
Les résultats sont assez stables; le dessin a toujours devient beaucoup plus rapide une fois que l'épaisseur de la ligne est plus que de 1 pixel de large.
Dans d'autres bibliothèques, il semble y avoir algorithmes rapides pour des lignes simples et des lignes épaisses sont plus lents car un polygone est créé en premier, alors pourquoi est-FireMonkey dans l'autre sens?
J'ai surtout besoin d'un pixel lignes, de sorte que je devrais peindre des lignes dans une autre façon, peut-être?
Les tests ont été exécutés avec ce code:
// draw random lines, and copy result to clipboard, to paste in excel
procedure TForm5.PaintBox1Paint(Sender: TObject; Canvas: TCanvas);
var
i,iWidth:Integer;
p1,p2: TPointF;
sw:TStopWatch;
const
cLineCount=1000;
begin
Memo1.Lines.Clear;
// draw 1000 different widths, from tickness 0.01 to 10
for iWidth := 1 to 1000 do
begin
Caption := IntToStr(iWidth);
Canvas.BeginScene;
Canvas.Clear(claLightgray);
Canvas.Stroke.Kind := TBrushKind.bkSolid;
Canvas.Stroke.Color := $55000000;
Canvas.StrokeThickness :=iWidth/100;
sw := sw.StartNew;
// draw 1000 random lines
for I := 1 to cLineCount do
begin
p1.Create(Random*Canvas.Width,Random*Canvas.Height);
p2.Create(Random*Canvas.Width,Random*Canvas.Height);
Canvas.DrawLine(p1,p2,0.5);
end;
Canvas.EndScene;
sw.Stop;
Memo1.Lines.Add(Format('%f'#9'%d', [Canvas.StrokeThickness, Round(sw.ElapsedTicks / cLineCount)]));
end;
Clipboard.AsText := Memo1.Text;
end;
Mise à jour
@Steve Wellens: En effet, les lignes verticales et les lignes horizontales sont beaucoup plus rapide. Il y a effectivement une différence entre horizontales et verticales:
Les lignes diagonales: en bleu, les lignes Horizontales: vert, les lignes Verticales: rouge
Avec des lignes verticales, il y a une différence nette entre les lignes qui sont à moins de 1 pixel de large. Avec des lignes diagonales il y a une pente comprise entre 1.0 et 1.5.
La chose étrange est qu'il n'y a pratiquement aucune différence entre la peinture d'une ligne horizontale de 1 pixel et une peinture de 20 pixels. Je suppose que c'est là l'accélération matérielle commence à faire une différence?