Canvas Paintbox- szybkość

0

Witam. Robię symulator róznych wizualizacji mrówek langtona itd. Przy jednej jest OK, ale przy dwóch i coraz więcej, widać że Canvas nie nadąża z rysowaniem, co znacząco spowalnia wizualizacje. Czy jest jakaś szybsza metoda nakładania niż Canvas->Pixels[X][Y] = clKolor ?

Tak samo co do pobierania pixla. Jest metoda Scanline, ale co gdy "skacze" po obrazie, nie czytając całego wiersza, co tu można zastosować ?

Z eksperymentów zauważyłem też że TPaintbox jest znacznie szybszy od TImage, może macie jakieś rady co do zwiększenia szybkości malowania ?

0

to jest NAJWOLNIEJSZA metoda! Poczytaj o ScanLine

0

OK, pisałem ze widziałem coś o ScanLine, ale sądziłem że służy do pobierania wartości pixla.
I czy ScanLine będzie szybszy pomimo skakania po obrazie ? Bo nie robię malowania linijka po linijce, lecz w różnych punktach. Mam taki kod:

		TRGBTriple * row = (TRGBTriple *)bitmapa->ScanLine[Y];
		row[X].rgbtRed += tab_rgb[MT[aktualna_maszyna]->GetStan()].r;
		row[X].rgbtGreen += tab_rgb[MT[aktualna_maszyna]->GetStan()].g;
		row[X].rgbtBlue += tab_rgb[MT[aktualna_maszyna]->GetStan()].b;

Mam jeden wątek poboczny który obsługuje zbiór Maszyn Turinga, które modyfikuja RGB bitmape zaleznie od ich stanu.
Widać że Canvas ostro zwalnia przy więcej niż dwóch maszynach naraz...

0

Poczytaj o SetDIBits

0

zamiast Canvas to może http://graphics32.org/wiki/pub/page/Main/Graphics32
pokaż też, kto, gdzie i kiedy wywołuje malowanie po płutnie. BTW może bitmapa w pamięci, po której będziesz malował i potem ją całą na płutno paintboxa

0

Trochę kodu przedstawię, może pomożecie mi w usunięciu wąskiego gardła :>

Synchronizowana metoda maluj: \imagesy to są paintboxy

void __fastcall ZbiorMaszyn::maluj()
{
	int X = MT[aktualna_maszyna]->GetX();
	int Y = MT[aktualna_maszyna]->GetY();
	int index = X + GetWidth() * Y;

		TRGBTriple * row = (TRGBTriple *)bitmapa->ScanLine[Y];
		row[X].rgbtRed += tab_rgb[MT[aktualna_maszyna]->GetStan()].r;
		row[X].rgbtGreen += tab_rgb[MT[aktualna_maszyna]->GetStan()].g;
		row[X].rgbtBlue += tab_rgb[MT[aktualna_maszyna]->GetStan()].b;

		TRGBTriple * row2 = (TRGBTriple *)bitmapa2->ScanLine[Y];
		row2[X].rgbtRed += tab_rgb2[tab[index]].r;
		row2[X].rgbtGreen += tab_rgb2[tab[index]].g;
		row2[X].rgbtBlue += tab_rgb2[tab[index]].b;

	if(MT[aktualna_maszyna]->GetIteracja() % GetZrzut() == 0)
	{

		Form1->Image2->Canvas->CopyRect(Rect(0,0,GetWidth(),GetHeight()),bitmapa->Canvas,Rect(0,0,GetWidth(),GetHeight()));
		Form1->Image4->Canvas->CopyRect(Rect(0,0,GetWidth(),GetHeight()),bitmapa2->Canvas,Rect(0,0,GetWidth(),GetHeight()));

		Form1->StringGrid_Maszyna->Cells[1][MT[aktualna_maszyna]->GetNR() + 1] = Form1->WstawSeparator(MT[aktualna_maszyna]->GetIteracja());
		Form1->StringGrid_Maszyna->Cells[3][MT[aktualna_maszyna]->GetNR() + 1] = IntToStr(X) + ":" + IntToStr(Y);
		Form1->StringGrid_Maszyna->Cells[4][MT[aktualna_maszyna]->GetNR() + 1] = IntToStr(MT[aktualna_maszyna]->GetStan());
	}
}

Ogolnie podejscie jest takie : wczytuje bitmapke do TImage, nakladam punkty (miejsca startowe maszyn) i zapuszczam przetwarzanie. bitmapa daje nam obraz przetwarzania na podstawie stanow, a bitmapa2 na podstawie wyjsc. Ilosc zrzutow ustalilem na powiedzmy co 500 iteracji.

Oraz mam drugi problem, znacznie bardziej zlozony (te wizualizacje w miare szybko jeszcze dzialaja). Mianowicie mam tworzyc obraz na podstawie zlepek n poprzednich bitmap.

dla takiej tablicy mam utworzyc :
|2|2|2|2|2|
|2|1|1|1|2|
|2|1|0|1|2|
|2|1|1|1|2|
|2|2|2|2|2|

bitmapa[i][j] = bitmapa w chwili t-index w stringgridzie[i][j].
W tym przypadku bitmapa wynikowa sklada sie z pixeli z 3 bitmap. W chwili t-2, t-1, i obecnej(pixel w centrum).

Dla obrazu 347 x 159 daje nam to okolo 55k iteracji, co straasznie wolno działa :> gdy robie to pixel po pixelu. Da rade jakos nalozyc porcjami ? bo jak widac, taka tablica ma budowe pierscienia, i spokojnie moglbym cala linijka pionowa kopiowac z odpowiedniej bitmapy do biezacej, wartosci piskela.

I co masz na mysli graphics32 ? To jest dodatkowy komponent ? masz przykladowy kod wykorzystania ?

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