CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Przyspieszenie wyświetlania na ekranie

Przyspieszenie wyświetlania na ekranie

problemy z tworzeniem aplikacji graficznych oraz audio i wideo

Re: Przyspieszenie wyświetlania na ekranie

Nowy postprzez polymorphism » poniedziałek, 10 stycznia 2011, 19:06

Przeprowadziłem dwa testy z pomiarem czasu:

Zbyt małe różnice. Żeby wyniki były miarodajne, musiałbyś przeprowadzić pomiar kilkuset operacji. A tak, 6ms mieści się w marginesie błędu systemowego timera. Nie wierzę w to, że drugi kod jest szybszy od pierwszego.

U mnie pięciusetkrotne wypełnienie bitmapy 1500x1500 trwa ~2625ms, czyli ~5.25ms na wywołanie.
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 polymorphism » poniedziałek, 10 stycznia 2011, 20:57

Pomiarów ciąg dalszy...

Te same testy z wykorzystaniem GDI+, lekka półprzeźroczystość: 20328ms, co daje ~40,6ms na wywołanie.
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 » poniedziałek, 10 stycznia 2011, 21:00

Przeprowadziłem testy na wszystkich trzech przykładach wywołując zmiany 10 krotnie:

1 przykład = 60 ms
2 przykład = 10 ms
3 przykład = 250 ms

Bitmapa w rozdzielczości 1280 x 1024.
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 » poniedziałek, 10 stycznia 2011, 21:58

Pytanie, jakim cudem 2 jest szybsza od 1, przecież robi dokładnie to samo co 1, dodatkowo tworzy nową i usuwa starą bitmapę? Wynik 3 to już w ogóle jakiś kosmos...


Gdzieś robisz błąd.
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 » poniedziałek, 10 stycznia 2011, 23:27

Przecież napisałem, że mimo iż przykład 2 wykonuje więcej operacji to działa najszybciej, jak sądzę jest to spowodowane tym, że operacja wypełnienia FillRect jest wykonywana na pustej bitmapie. W pomocy do TCanvas nie mam szczegółowych opisów tych funkcji, a jedynie opis tego co robią, więc nie wiem jak to działa.
Testy były przeprowadzane w pętli, czyli:

przykład 1: 60 ms
KOD cpp:     UKRYJ  
 float Start = GetTickCount();

 for(int i = 0; i < 10; i++)
 {
  Image1->Picture->Bitmap->Canvas->Brush->Color = clBlue;
  Image1->Picture->Bitmap->Canvas->FillRect(Image1->ClientRect);
 }

 float End = GetTickCount();

 ShowMessage(FloatToStr(End - Start) + " ms");


Przykład 2: 10 ms
KOD cpp:     UKRYJ  
 float Start = GetTickCount();
 
 for(int i = 0; i < 10; i++)
 {
  std::auto_ptr<Graphics::TBitmap> tmpBmp(new Graphics::TBitmap);
  tmpBmp->Width = Image1->Width;
  tmpBmp->Height = Image1->Height;
  tmpBmp->Canvas->Brush->Color = clBlue;
  tmpBmp->Canvas->FillRect(Image1->ClientRect);
  Image1->Picture->Bitmap->Assign(tmpBmp.release());
 }

 float End = GetTickCount();

 ShowMessage(FloatToStr(End - Start) + " ms");


Przykład 3: 250 ms
KOD cpp:     UKRYJ  
 float Start = GetTickCount();

 for(int i = 0; i < 10; i++)
 {
  Buffer->Canvas->Brush->Color = clBlue;
  Buffer->Canvas->FillRect(Image1->ClientRect);
  Image1->Picture->Bitmap->Assign(Buffer);
 }

 float End = GetTickCount();

 ShowMessage(FloatToStr(End - Start) + " ms");


Testy powtórzone kilkakrotnie zawsze z tym samym wynikiem, na bitmapie wczytanej do Image1 i Buffor w rozdzielczości 1280x1024 i w 24 bitowej głębi kolorów. Obiekt Buffor zawiera tą samą bitmapę co Image1. W programie zmieniał się tylko kod w pętli, nic ponad to. Test przeprowadzałem przy uruchomionym tylko środowisku C++Builder, ale poza środowiskiem. Program był skompilowany pod kontem wydajności, nie rozmiaru.

Mam wątpliwości, czy tego typu testy są wogóle miarodajne. Poza tym nie chce mi się już kontynuować tego tematu. Zaproponowałem rozwiązanie ze sterowaniem stylem pędzla i odświeżaniem tylko przesłoniętego fragmentu tła, więc jest to w miarę wydajne. Nic więcej nie wymyślę z GDI, bo nie wiem co w zasadzie można by zmienić. Co do funkcji FillRect to przypuszczam, że nie jest wywoływana każdorazowo, gdy zachodzą zmiany w tle, bo niby po co, więc problem wydajności na tym polu jest raczej drugorzędny. Jeżeli jednak autor wątku tak właśnie robi, to powinien przemyśleć koncepcję całego programu, gdyż nawet najwydajniejsze funkcje niewiele zdziałają, jeżeli zostaną użyte w niewłaściwy sposób. Z GDI można zrobić dużo, ale nie wydajną grę, a odnoszę wrażenie, że autor wątku chce stworzyć jakiś program z wydajnością gry, a to wymaga użycia DirectX.

Na co dzień często korzystam z programu Photoshop, który jest bardzo wydajnym programem graficznym, ale wykonywanie niektórych operacji jak np. przesuwanie jednej warstwy po drugiej, przy dużych bitmapach nie odbywa się jakoś specjalnie płynnie. Nie sposób uzyskać w GDI szybkości rzędu 60 klatek na sekundę, bez bardzo mocnego procesora i bardzo dobrej karty graficznej. Podkreślam - program przetwarzający grafikę to nie gra, a chcesz zrobić grę, zrób ją w DirectX lub OpenGL.
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 » wtorek, 11 stycznia 2011, 11:38

(...) jak sądzę jest to spowodowane tym, że operacja wypełnienia FillRect jest wykonywana na pustej bitmapie.

To akurat nie ma żadnego związku. Pusta, niepusta, i tak musi ustawić każdy piksel.

W drugim przykładzie masz wyciek...

Mam wątpliwości, czy tego typu testy są wogóle miarodajne.

Są miarodajne, bo możesz określić wąskie gardła. Tu nie chodzi o konkretną wartość, bo ta, wiadomo, może różnić się w zależności od sprzętu czy systemu, chodzi tu o stosunki między różnymi wartościami pomiarów.

Co do funkcji FillRect to przypuszczam, że nie jest wywoływana każdorazowo, gdy zachodzą zmiany w tle, bo niby po co

FillRect jest tylko przykładem, ponieważ to ona tworzy tło. Jeśli tłem byłaby bitmapa, wtedy rozważana byłaby CopyRect.
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 » wtorek, 11 stycznia 2011, 13:50

moje testy wprawiły mnie w konfuzję.
np. wg TickCount na zintegrowanej GMA X4500 jak i na Radeonie 2600 XT 1000 razy wywołane FillRect na zmaksymalizowanym oknie 1920x1080 zajmuje około 2500 ms... w tym czasie cały system się zamraża a Radek kręci wentylatorkiem jak szalony.
przecież przy tego rzędu wielkościach taki czas pojedynczego wykonywania FillRect'a (2,5 ms) nie powinien mieć wcale znaczenia dla płynności aplikacji. nie mam pojęcia o co tu chodzi...
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 » wtorek, 11 stycznia 2011, 14:43

w tym czasie cały system się zamraża

To na czym Ty to testujesz, Win9x?! :o
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 » wtorek, 11 stycznia 2011, 15:07

na XP. FillRect w pętli i w tym czasie wszystko stoi, z Menedżerem Zadań włącznie.
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 » wtorek, 11 stycznia 2011, 15:10

Hmm, dziwne. U mnie poza aplikacją wszystko chodzi bez problemu.
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 » środa, 12 stycznia 2011, 10:07

polymorphism napisał(a):W drugim przykładzie masz wyciek...


Nie mam. Wzorzec klasy auto_ptr sam po sobie sprząta.



GrassHoppeR napisał(a):np. wg TickCount na zintegrowanej GMA X4500 jak i na Radeonie 2600 XT 1000 razy wywołane FillRect na zmaksymalizowanym oknie 1920x1080 zajmuje około 2500 ms... w tym czasie cały system się zamraża a Radek kręci wentylatorkiem jak szalony.


Podobny test, czas podobny, ale brak opisanych przez Ciebie objawów. Nie bardzo rozumiem, co u ciebie tak obciąża kartę graficzną. Musisz mieć jakieś błędy w systemie.
Przeprowadziłem test z obiektem PaintBox i osiągnąłem czas siedmiokrotnie krótszy dla tej samej operacji. Dla tego obiektu funkcja FillRect jest tak szybka jak powinna. W przypadku PaintBox trzeba jednak w odróżnieniu od Image kod rysujący umieszczać w zdarzeniu OnRepaint obiektu PaintBox lub formularza, w przeciwnym razie przesłonięcie okna innym wymarza zawartość PaintBox, czyli grafika musi być cały czas odświeżana, gdyż w odróżnieniu od Image, PaintBox nie zarządza samodzielnie odświeżaniem.
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 » środa, 12 stycznia 2011, 10:55

Cyfrowy Baron napisał(a):Nie mam. Wzorzec klasy auto_ptr sam po sobie sprząta.

KOD cpp:     UKRYJ  
...

Image1->Picture->Bitmap->Assign(tmpBmp.release());

Przeczytaj w dokumentacji, co robi metoda release.
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 » środa, 12 stycznia 2011, 10:58


The member replaces the stored pointer myptr with a null pointer and returns the previously stored pointer.



Jak rozumiem zrzeka się kontroli na obiektem i go zeruje.
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 » środa, 12 stycznia 2011, 11:04

Nie 'go zeruje', tylko sam siebie zeruje.
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 » środa, 12 stycznia 2011, 11:09

No tak, traci nad nim kontrolę. Powinienem więc użyć get() zamiast release().
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 1 gość