Czemu zrobienie czegoś trwa dłużej, jeżeli robie to inną metodą?

0

Trochę dziwny temat, ale chodzi np o to że jak zrobię tak

Image1.Picture.Bitmap := MojaBitmapa;

Od razu wyświetli się MojaBitmapa, natomiast jeżeli zrobie tak

for I := 0 to MojaBitmapa.Height - 1do
  for J := 0 to MojaBitmapa.Width - 1 do
    Image1.Picture.Bitmap.Canvas.Pixels[I, J] :=MojaBitmapa.Canvas.Pixels[I, J];

To potrwa to znacznie dłużej.
Czemu tak się dzieje??

0
  1. Dostęp do obrazka poprzez .Canvas.Pixels[I, J] jest powolny
  2. zwykłe przypisanie Image1.Picture.Bitmap := MojaBitmapa; nie musi oznaczać, że jest robiona kopia tego obrazka (najprawdopodobniej jest wykonywana płytka kopia).
  3. nawet jeśli Image1.Picture.Bitmap := MojaBitmapa; robi pełną kopie obrazka, to kopia ta wykonana jest prze optymalne odwołanie się do pamięci.
  4. poszukaj czegoś takiego jak scanLine
0

za takie coś

Image1.Picture.Bitmap := MojaBitmapa;

powinni ucinać łapska przy samej dupie. To NICZEGO nie kopiuje to jedynie przypisuje WSKAŹNIK MojaBitmapa do Image1.Picture.Bitmap. Prawidłowo powinno być

Image1.Picture.Bitmap.Assign(MojaBitmapa);

Resztę opisał Ci już Marek

0

powinni ucinać łapska przy samej dupie
a bo ponieważ? czasami jest to najlepsze i najszybsze rozwiązanie, pod warunkiem że się wie co się robi.

0
Misiekd napisał(a)

za takie coś

Image1.Picture.Bitmap := MojaBitmapa;

Tym razem się mylisz, zobacz w źródełkach co to robi. Ba, jest bezpieczniejsze niż Image1.Picture.Bitmap.Assign(MojaBitmapa);

0

A mi się że chodzi bardziej generalnie.

Gdyby naraz skopiować cały obiekt, to wysyłamy jedno żądanie do OS, i wszystko wykonuje się na najniższym poziomie, gdy mamy FOR, to kompilator przy każdym powtórzeniu pętli musi wyliczyć gdzie w pamięci jest dany indeks tablicy, potem z niego pobrać dane (tylko jeden piksel) i go zapisać gdzie indziej.

Jeszcze od siebie dodam, że z moich badań wynika, że dużo szybsze niż używanie

for i:=0 to length(tab)-1 do foo(tab[i]);

jest

p:=@tab[0];
for i:=0 to length(tab)-1 do
  begin
  foo(p^);
  inc(p);
  end;

Różnica jest naprawde widoczna w przypadku dużych tablic i podwójnych pętli for.

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