przez Cyfrowy Baron » środa, 3 listopada 2010, 12:22
Opóźnienie rysowanie tylko po części wynika z samego rysowania, reszta to czas którego pętla potrzebuje wykonanie wszystkich operacji. Rysowanie bezpośrednio w zdarzeniu OnPaint obiektu PaintBox ma tą wadę, że zdarzenie będzie odrysowywać wszystko za każdym razem, gdy zajdzie potrzeba odświeżenia okna programu, a przecież wykres powinien być odrysowywany tylko wtedy, gdy zmienia się zawartość wykresu, oraz gdy zmienia się rozmiar pola w którym wykres jest rysowany.
Użycie bufora w postaci obiektu klasy TBitmap zmniejszy czas potrzebny na wykonanie wykresu, czyli wykres narysuje się szybciej ponieważ, nie będzie rysowany na bieżąco lecz wyświetlany gotowy w PainBox1, nie skróci to jednak czasu potrzebnego na wykonanie działań przez pętlę. Bitmapa ma również tą zaletę, że przechowuje gotowy wykres, tak długo jak długo się on nie zmienia, a przerysowanie go do PainBox1 zawsze gdy zachodzi potrzeba odświeżenia okna będzie przebiegać niezauważalnie. Przy zmianie rozmiaru okna, trzeba jednak przerysować cały wykres. Tak czy inaczej użycie bufora w postaci bitmapy do dobry pomysł, gdyż zwiększa wydajność programu.
Co zrobić by działał jeszcze szybciej? Trzeba zoptymalizować pętlę. Może rysować linie w pętli po kilka bloków na raz, np. po cztery bloki: for(int i = Start; i <= Koniec/4; ++i). Musiałbyś oczywiście odpowiednio zmodyfikować kod wewnątrz pętli, tak by każdy kolejny blok był rysowany we właściwym miejscu. Jest jeszcze kwestia dzielenia zmiennej Koniec, czy dzieli się bez reszty. Nie wiem jak to zrobić, gdyż aż tak dokładnie to nie analizowałem Twojego kodu, więc sam musisz nad tym popracować.
W załączniku jest Twój kod z wykorzystaniem bufora w postaci obiektu typu TBitmap.
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
-
Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
- Corvis