Canvas vs CPU

0

Czy ktoś może mi udzielić kilku rad jak zminimalizować zużycie procesora podczas operacji na Canvasie.

Tworze program w stylu oscyloskopu i muszę rysować łamaną na bitmapie o dosyć sporej rozdzielczości, np:

for x := 1 to Image1.Width do
  begin
    Image1.Picture.Bitmap.Canvas.MoveTo(x, y);
    // instrukcje zmieniające wartość y
    Image1.Picture.Bitmap.Canvas.LineTo(x+1, y);
  end;

Próbowałem zmniejszyć ilość kolorów do 16

Image1.Picture.Bitmap.PixelFormat := pf4bit;

ale nic to nie zmienia.

0

ale w czym generalnie tkwi problem? Nie powinno się dziać nic strasznego...

0

problem tkwi w tym, że wykonując powyższą instrukcję w odstępach ok 100ms, zużycie intela core duo wynosi około 40%. To zdecydowanie za dużo, biorąc pod uwagę, że chciałbym używać tego programu na słabszych maszynach.

0

Po pierwsze nie rób MoveTo za każdym razem - funkcja LineTo nie tylko rysuje do pozycji kursora obrazu, ale również go ustawia.

Znacznie można też ten proces usprawnić, rysując tylko raz.

var X,Y:integer;
    Punkty:array of TPoint;
begin
SetLength(Punkty, Image1.Width);
for X:=0 to Image1.Width-1 do
  begin
  // Y:=F(x);
  Punkty[X]:=Point(X, Y);
  end;
Image1.Picture.Bitmap.Canvas.Polyline(Punkty);
end;
0

rzeczywiście, różnica jest znaczna.
dzięki.

0

chyba moglbys przed narysowaniem wylaczyc odswierzanie canvasa i wlaczyc dopiero po narysowaniu. Dalo sie tak zrobic dla ListView, to dla innych komponentow tez powinno sie dac.

0

Ogólnie można nie rysować po canvasie obrazka a po płótnie jakiegoś obiektu TBitmap, a potem kopiować to na canvas obrazka. Coś w rodzaju podwójnego buforowania - bardzo dobrze się sprawdza.

1 użytkowników online, w tym zalogowanych: 0, gości: 1