Przyspieszenie wyświetlania na ekranie

problemy z tworzeniem aplikacji graficznych oraz audio i wideo

Re: Przyspieszenie wyświetlania na ekranie

Nowy postprzez polymorphism » czwartek, 13 stycznia 2011, 21:30

panowie, przecież problem został już rozwiązany!

Spokojnie, przecież wiem(y). Dyskutowaliśmy sobie po prostu.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Przyspieszenie wyświetlania na ekranie

Nowy postprzez GrassHoppeR » czwartek, 13 stycznia 2011, 21:56

ależ nie chciałem jej kończyć. miałem tylko na myśli, że bez interwału zużycie procesora nie jest proporcjonalne do czasu rysowania klocka jeśli następuje, że się tak wyrażę, "natłok zdarzeń". a im szybciej widok się narysuje tym szybciej zacznie się następne rysowanie (przy szybkim ruchu). stąd tak wysokie zużycie procesora.

nie jest więc to obiektywna ocena wydajności algorytmu zamazywania i rysowania. proponuję rysować kilkaset czy nawet kilka tysięcy klocków, gdyż zadanie to jest strasznie szybkie i w testach, które robiłem wyszło mi, że 10 000 klocków 100x32 rysowało się metodą Rectangle 124 ms... stąd poprawa wydajności w ten sposób wydawała mi się niewłaściwą drogą, choć teraz, kiedy już program działa tak błyskawicznie również i tym się zajmę.
Avatar użytkownika
GrassHoppeR
Homos antropiczny
Homos antropiczny
 
Posty: 63
Dołączył(a): wtorek, 4 stycznia 2011, 01:17
Podziękował : 3
Otrzymał podziękowań: 0
System operacyjny: Windows XP
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 2491715
    Windows XPFirefox

Re: Przyspieszenie wyświetlania na ekranie

Nowy postprzez Cyfrowy Baron » czwartek, 13 stycznia 2011, 22:26

polymorphism napisał(a):Klocek rysujesz na bitmapie z tłem, tylko zanim to zrobisz, kopiujesz do pomocniczej bitmapy ten fragment tła, który zostanie zamalowany przez klocek [...]


Sam na to wpadłem i przeprowadziłem test. Niestety nic to nie dało, program nie nadąża z przerysowywaniem przy szybkich ruchach myszką i migotanie pozostaje. Problem w tym, że to migotanie występuje nawet wtedy gdy klocek jest nieprzeźroczysty i rysowany w GDI, pojawia się jednak rzadziej. Zauważ jednak, że ja próbuję zachować cały czas płynność w przesuwaniu klocka, z tym, że ta płynność jest jak na potrzeby programu za duża, gdyż wynosi 50 klatek na sekundę - tyle razy klocek jest odrysowywany w ciągu jednej sekund. Po zastąpieniu obiektu PaintBox obiektem Image migotanie znika, ale klocek jest odrysowywany tylko 9 razy na sekundę i uzyskuję taki sam efekt jak w Twoim programie. Po wyłączeniu DoubleBuffering, częstotliwość rośnie do 11 klatek na sekundę.

Znalazłem jednak rozwiązanie - zamiast PaintBox używam Image, ale tak jak PaintBox, czyli grafiki nie ładuję do Picture->Bitmap, lecz odrysowuję Image->Canvas->Draw, znika migotanie, a animacja wynosi 40 klatek na sekundę. I to jest to, jednak Image, ale bez Picture.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Przyspieszenie wyświetlania na ekranie

Nowy postprzez polymorphism » czwartek, 13 stycznia 2011, 22:39

Coś musiałeś zrobić nie tak. U mnie właśnie tą metodą to działa.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Przyspieszenie wyświetlania na ekranie

Nowy postprzez Cyfrowy Baron » czwartek, 13 stycznia 2011, 22:58

Uzupełniłem swój poprzedni post. Nie będę go przepisywał, więc przeczytaj go jeszcze raz. Mam jednak pytanie, na jakiej powierzchni rysujesz, TImage, TPaintBox, czy może bezpośrednio na formularzu?
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Przyspieszenie wyświetlania na ekranie

Nowy postprzez Cyfrowy Baron » czwartek, 13 stycznia 2011, 23:09

Zamieszczam przykładowy program. By program zajmował mniej miejsca posłużyłem się plikiem JPEG, który jest oczywiście konwertowany przez program na bitmapę.
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Przyspieszenie wyświetlania na ekranie

Nowy postprzez polymorphism » piątek, 14 stycznia 2011, 12:21

Cyfrowy Baron napisał(a):Mam jednak pytanie, na jakiej powierzchni rysujesz, TImage, TPaintBox, czy może bezpośrednio na formularzu?

Jak już wcześniej pisałem, nie piszę w VCL-u, więc nie mam takich klas, jak TImage czy TPaintBox. Użyłem dwóch bitmap (klasa wxBitmap), a rysowanie odbywało się w obsłudze wxEVT_PAINT (wx'owy odpowiednik WM_PAINT).

(...) ale klocek jest odrysowywany tylko 9 razy na sekundę i uzyskuję taki sam efekt jak w Twoim programie. Po wyłączeniu DoubleBuffering, częstotliwość rośnie do 11 klatek na sekundę.

Z moich pomiarów wyszło, że okno odmalowywane jest średnio z częstotliwością 62fps, czyli co ~16ms.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Przyspieszenie wyświetlania na ekranie

Nowy postprzez Cyfrowy Baron » piątek, 14 stycznia 2011, 13:03

Z moich pomiarów wyszło, że okno odmalowywane jest średnio z częstotliwością 62fps, czyli co ~16ms.


Nie wiem już czego ta wypowiedź się tyczy. Pisząc o 9 klatkach na sekundę, chodziło mi o testy na programie, którego jednak tutaj nie zamieściłem, poza tym nie mierzyłem ile razy okno zostało odświeżone, lecz ile razy klocek został odrysowany w ciągu jednej sekundy.

Ostatni przykład jaki zamieściłem w zupełności mnie zadowala. Przeprowadzałem jeszcze testy z ograniczeniem liczby klatek na sekundę, czyli liczby odrysować klocka do 25, ale nie przesuwał się zbyt płynnie, spadło jednak wykorzystanie procesora.

Piszesz, że okno jest odmalowywane 62fps, nie wiem czego to się tyczy. W moich przykładach okno było odmalowywane tylko w zdarzeniu OnPaint, a podczas przesuwania klocka był odrysowywany tylko fragment.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Przyspieszenie wyświetlania na ekranie

Nowy postprzez polymorphism » piątek, 14 stycznia 2011, 13:40

Nie wiem już czego ta wypowiedź się tyczy.

Tyczy się tych 9 czy 11 klatek. Tak mała liczba mnie nieco zdziwiła, więc podałem Ci liczbę klatek w moim programie, coby był jakiś punkt odniesienia.

(...) poza tym nie mierzyłem ile razy okno zostało odświeżone, lecz ile razy klocek został odrysowany w ciągu jednej sekundy.

U mnie na jedno wychodzi, ponieważ każde wywołanie wxEVT_PAINT wiąże się z odmalowaniem klocka (a raczej całego widoku).

Ostatni przykład jaki zamieściłem w zupełności mnie zadowala.

Działa jak trzeba.

Piszesz, że okno jest odmalowywane 62fps, nie wiem czego to się tyczy.

Jak już pisałem, jest to częstotliwość wywołań obsługi wxEVT_PAINT.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Przyspieszenie wyświetlania na ekranie

Nowy postprzez GrassHoppeR » piątek, 14 stycznia 2011, 15:36

nowa wersja mojego programu http://grasshopper.no-ip.info/Project1.zip
wykorzystuje timer, GDI+ oraz rysowanie bitmapy tylko w zmienionych przez klocek miejscach.

a propos timera - rozumiem, że onTimer przerywa działanie obsługi zdarzeń takich jak onMouseMove? czy można zrobić tak, by poczekał aż się ono skończy czy coś? jakaś kolejka? jak jest w ogóle rozwiązana obsługa jednoczesnych zdarzeń? można je wyłączać?
Avatar użytkownika
GrassHoppeR
Homos antropiczny
Homos antropiczny
 
Posty: 63
Dołączył(a): wtorek, 4 stycznia 2011, 01:17
Podziękował : 3
Otrzymał podziękowań: 0
System operacyjny: Windows XP
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 2491715
    Windows XPFirefox

Re: Przyspieszenie wyświetlania na ekranie

Nowy postprzez polymorphism » piątek, 14 stycznia 2011, 15:59

Nie, timer zatrzymuje działanie pętli komunikatów, a co za tym idzie komunikaty czekające w kolejce komunikatów nie są przetwarzane. Co nie znaczy, że żaden komunikat nie zostanie obsłużony/wywołany. Nie wszystkie komunikaty są kolejkowane.

p.s. program działa ok.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Przyspieszenie wyświetlania na ekranie

Nowy postprzez Cyfrowy Baron » piątek, 14 stycznia 2011, 16:01

Timer to tylko zegar, a zdarzenie OnTimer jest wywoływane zawsze po tyknięciu zegara. Nigdzie nie znalazłem informacji o tym, ale nie sądzę by jedno zdarzenie przerywało drugie.

Nie bardzo rozumiem czemu służyć ma ta cała optymalizacja. Niby klocek przesuwa się skokowo, a w ekstremalnym teście gdy klocek jest przesuwany szybko wydajność pozostawia wiele do życzenia.

graph.png


Coś jest wogóle źle zrobione w tym programie, gdyż kliknięcie na okno jeszcze bez klocka absorbuje procesor w 6%. Powolne przesuwanie klocka zużywa około 32% CPU. W moim ostatnim programie przesuwanie klocka powoli absorbuje procesor w około 23%, kliknięcie w okno wogóle nie wywołuje reakcji procesora lub jest ona raczej poniżej 1%. Prawdziwą niespodzianką było dla mnie jednak to, że przy szybkim przesuwaniu klocka (mój program) wykorzystanie procesora jest takie samo jak przy wolnym i nigdy nie przekroczyło 24%.

Odnoszę wrażenie, że już przekombinowałeś z tym programem. :)
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Przyspieszenie wyświetlania na ekranie

Nowy postprzez polymorphism » piątek, 14 stycznia 2011, 16:07

Baron, może powiedz, co to jest za program, którym robisz odczyty, bo według process explorer jego program zużywa ~2% CPU.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Przyspieszenie wyświetlania na ekranie

Nowy postprzez GrassHoppeR » piątek, 14 stycznia 2011, 16:15

:o
u mnie zużycie procesora jest tak nikłe, że prawie niezauważalne. sięga max 2%. u kolegi, który go testował też. co prawda na maszynie wirtualnej w VirtualBox zużycie jest o wiele większe, ale zwaliłem to na brak przyspieszenia sprzętowego...
Avatar użytkownika
GrassHoppeR
Homos antropiczny
Homos antropiczny
 
Posty: 63
Dołączył(a): wtorek, 4 stycznia 2011, 01:17
Podziękował : 3
Otrzymał podziękowań: 0
System operacyjny: Windows XP
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 2491715
    Windows XPFirefox

Re: Przyspieszenie wyświetlania na ekranie

Nowy postprzez Cyfrowy Baron » piątek, 14 stycznia 2011, 16:31

Wtyczka procesy programu Total Commander Ultimate Prime. Częstotliwość odświeżania danych wynosi 50 ms.
Zauważ jednak że obydwa programy są testowane w tych samych warunkach. Poza tym tutaj nie trzeba specjalnych programów, uruchom Menadżera zadań, ustaw dużą częstotliwość odświeżania przejdź do wykresu i zobacz jak zmienia się, gdy klocek jest przesuwany.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Poprzednia stronaNastępna strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Aplikacje multimedialne, graficzne

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 0 gości