Akceleracja w Canvasie

0

Witam!

Pisze komponent graficzny, ale grafikę wykorzystuje pierwszy raz, więc potrzebuje rady. Otóż ten komponent ma do narysowania "siatki" z kwadratów. Ta "siatka" może wyglądać następująco:

[][][][][][][][][][][][][][][][][][][][][][][][][][][][]
[][][][][][][][][][][][][][][][][][][][][][][][][][][][]
[][][][][][][][][][][][][][][][][][][][][][][][][][][][]
[][][][][][][][][][][][][][][][][][][][][][][][][][][][]
[][][][][][][][][][][][][][][][][][][][][][][][][][][][]

tylko z tym, że tych kwadratów może być więcej - dużo więcej bo ok. 2000. I problem tkwi w szybkości, bo narysowanie takiego czegoś nie sprawiło mi kłopotu. Nie było by problemu, jeżeli to miało by być narysowane jeden raz lub rysowane po sobie w dłuższych odstępach czasu, ale to ma być rysowane np. co 0,1 sekundy...
Chodzi mi o jakąś akceleracje tego...myślałem o DX'ach, ale nie wiem czy to dobry pomysł, może coś doradzicie? Będę wdzieczny...

ps. aha rysuje to funkcją Canvas.Rectangle i wykorzystuje dwie pętle zagnieżdżone for jako x i y Mam nadzieję, że dobrze to wytlumaczyłem.

pozdrawiam

0

ladnie skopiowales swoj poprzedni post.

co do tematu to tak:
DX'y - owszem przsypiesza, bo odciazaja system z rysowania.
sprobuj Double Buffered - moze cos pomoze
sprobuj takze watkow.

0

Tak, przyznaje się bez bicia - skopiowałem, ale myślę w tym poście otrzymam jakąś wskazówkę (stary można usunąć) :)

A co do Twojej odpowiedzi to obawiam się, że DX to za dużo jak na taki komponencik, co do DoubleBuffered - nic nie daje - już próbowałem, a wątki też chyba nic nie dadzą...
ale gdzieś mi się obiło o "uszy", że trzeba wykorzystać jakąś bibliotekę graficzną, ale zupełnie nie wiem o jaką bibliotekę chodzi...może ktoś wie?

0

A na Canvasie czego rysujesz ?

0

Nie lepiej było by użyć zamiast Rectangle ? MoveTo oraz LineTo i tak rysować siatkę przez dany obszar. Zamiast rysować ileś tam kwadratów narysujesz kilka linii i po kłopocie?

procedure TForm1.Button1Click(Sender: TObject);
Var
 I, L : Integer;
begin
 Image1.Picture.Bitmap.Width  := Image1.Width;
 Image1.Picture.Bitmap.Height := Image1.Height;
 I := 0;
 L := 500;
 With Image1.Picture.Bitmap.Canvas Do
  Begin
   Pen.Color   := RGB(159, 164, 187);
   Brush.Color := RGB(255, 255, 255);
   Repeat
    Inc(I, 10);
    MoveTo(I, 0);
    LineTo(I, Image1.Height);
    MoveTo(0, I);
    LineTo(Image1.Width, I);
   Until I = L;
  End;
end;
0

A na Canvasie czego rysujesz ?

TCustomControl

user image
To jest siatka na której można rysować i wszystko było by ok, ale jeżeli rozdzielczość tej siatki jest odpowiednio mała. Dodatkowo chciałbym tutaj uzyskać efekty w stylu przesuwania zaświeconych kwadratów co kilkanaście milisekund i wtedy pojawia się problem, ponieważ rysowanie tego trwa zbyt długo...

0

Nie rysuj bezpośrednio po Canvasie TCustomControl. Rysuj po Canvasie jakiegoś TBitmap i potem skopiuj zawartość. Btw. dodatkową optymalizację da Ci narysowanie wcześniej nieaktywniej matrycy.
Potem kopiujesz ze wzorca do tej Twojej TBitmap, na niej "zapalasz" piksele i potem kopiujesz do TCustomControl. Rozumiesz?

0

Wymyśliłem metodę, dzięki której może się uda, ale popatrzcie co tutaj jest źle, bo ja zaraz szału dostanę:

//BackBitmap to siatka, gdzie wszystkie piksele są "zgaszone"
//ActiveBitmap - tutaj będą tylko piskele zaświecone oznaczone dowolnym kolorem oprócz np. białego
//ResultBitmap to bitmapa, gdzie nałożą się dwie warstwy, czyli bitmapa BackBitmap i ActiveBitmap z wykluczeniem koloru białego tutaj - potrzebna do procedury Paint;
//Wiem, że tak powinno zadziałać bo próbowałem na formie, ale w komponencie nie działa

ResultBitmap.Canvas.Draw(0,0,BackBitmap);
ResultBitmap.Canvas.BrushCopy(Rect(0,0,BackBitmap.Width,BackBitmap.Height),ActiveBitmap,Rect(0,0,BackBitmap.Width,BackBitmap.Height),clWhite);
Canvas.Draw(0,0,ResultBitmap);

//Aha i wszystkie te bitmapy są stworzone i ustawione wielkości
jeżeli wyremuje 2 linijkę to jest to tło co chciałem, a jak zostawie tak jak teraz to jest białe tło, a powinny się jeszcze nanieść elementy z ActiveBitmap

i nie pomaga ustawienie przeźroczystości na biały kolor, dalej białe tło

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