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 GrassHoppeR » czwartek, 13 stycznia 2011, 00:31

niestety przez GDI+ nie mogę tego nijak skompilować. wystarczyłby zwykły Rectangle z GDI...
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 GrassHoppeR » czwartek, 13 stycznia 2011, 01:58

GrassHoppeR napisał(a):niestety przez GDI+ nie mogę tego nijak skompilować. wystarczyłby zwykły Rectangle z GDI...

poradziłem sobie wywalając GDI+ jakby co. nie wiem co powoduje różnicę w wydajności, przecież to się prawie nie różni od tego, co ja testowałem. czyżby umieszczenie Draw w PaintBox1Paint? dlaczego komunikaty o zmianie rozmiaru okna są przechwytywane a nie obsługiwane w Form1Resize?
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, 10:10

czyżby umieszczenie Draw w PaintBox1Paint?


TPaintBox jest szybszy, dokładnie dlaczego to nie wiem, ale jest to chyba związane w faktem, że ten obiekt udostępnia tylko powierzchnię do rysowania i narzędzia TCanvas, podczas gdy Image sam zarządza tym co się w tym obiekcie narysuje i odświeża go zbyt często. Obiekt PaintBox w moim przykładzie jest odświeżany tylko raz po uruchomieniu programu, potem jeżeli nie przysłonisz okna programu żadnym innym oknem i nie zmienisz rozmiaru, to PainBox nie jest odświeżany, czyli nie jest przerysowywany. W celu osiągnięcia dużej wydajności nie stosowałem odrysowywania tła, lecz tylko fragmentu tła zmienionego przez prostokąt i linie. Steruje tym ta funkcja:

KOD cpp:     UKRYJ  
void __fastcall TForm1::DrawCopyRect(TRect rCopy)
{
 TRect lineRect = Rect(rCopy.Left, 0, rCopy.Left + 1, PaintBox1->Height);
 PaintBox1->Canvas->CopyRect(lineRect, bitmapa->Canvas, lineRect);

 lineRect = Rect(rCopy.Right, 0, rCopy.Right + 1, PaintBox1->Height);
 PaintBox1->Canvas->CopyRect(lineRect, bitmapa->Canvas, lineRect);

 PaintBox1->Canvas->CopyRect(rCopy, bitmapa->Canvas, rCopy);
}
Kopiowane są fragmenty tła z bufora bitmapa, który stanowi również tło dla PaintBox.



dlaczego komunikaty o zmianie rozmiaru okna są przechwytywane a nie obsługiwane w Form1Resize?


Dokładnie to sam nie wiem, ale przechwytywanie komunikatu o zmianie rozmiaru okna daje inny efekt niż użycie zdarzenia OnResize.



niestety przez GDI+ nie mogę tego nijak skompilować. wystarczyłby zwykły Rectangle z GDI...


Trochę mało informacji. Dlaczego nie dał się skompilować? Nie wiem czy wersja C++Builder 6 wogóle ma obsługę GDI+, jeżeli ma a nie działa, to trzeba w sekcji include pliku źródłowego Unit1.cpp dodać:

KOD cpp:     UKRYJ  
#define STRICT // < -- dodano

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"

#include <windows.h> // <-- dodano
#include <algorithm> // <-- dodano
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

#pragma link "gdiplus.lib" // <-- dodano

using std::min; // <-- dodano
using std::max; // <-- dodano


Jest o tym napisane w serwisie Cyfrowy Baron w dziale: porady -> grafika -> Wyświetlanie grafiki z wykorzystaniem biblioteki gdiplus.dll GDI+. Jest tam również napisane, że GDI+ jest dostępne w C++BUilder 6.
w pliku nagłówkowym Unit1.h również w sekcji include:

Kod: Zaznacz cały
#include <gdiplus.h>


Możliwe jest również, że w C++Builder 6 biblioteka gdiplus.lib jest niekompatybilna z biblioteką gdiplus.dll. W tej sytuacji trzeba wejść katalogu ..\Windows\System32\ uruchomić konsolę CMD w tym katalogu i użyć polecenia:

implib -c -f gdiplus.lib gdiplus.dll

Jeżeli wszystko zrobiłeś prawidłowo, to w tym katalogu zostanie utworzony plik gdiplus.lib, który należy skopiować do katalogu środowiska C++Builder 6, nie pamiętam dokładnie ścieżki dostępu, ale to coś w rodzaju: c:\Program Files\Borland\CBuilder\6\lib\psdk\ zastępując nim znajdujący się tam już taki plik. Jeżeli w tym katalogu środowiska C++Builder nie ma takiego pliku, to najpewniej C++Builder 6 nie ma obsługi GDI+. Bibliotekę LIB należy podmienić tylko w sytuacji, gdy kod działa, ale sama obsługa grafiki kuleje, przedtem dobrze jest sobie zrobić kopię tej biblioteki. Jeżeli we wspomnianym katalogu masz bibliotekę gdiplus.lib to nie ma takiej możliwości by to nie działało.
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, 11:49

Hmm, nie wiem jak u Was, ale ostatni przykład Barona ma tę samą "wadę", która dla autora wątku była duży problemem. U mnie w porywach osiąga 30%.
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, 12:32

Raczej trudno oczekiwać, by program graficzny nie korzystał wogóle z procesora i karty graficznej. W tej chwili przeprowadzam konwersję filmu programem, który całą dostępną moc procesora. By przeprowadzić test, który reprezentuje niżej przedstawiony graf ustawiłem konwerterowi priorytet poniżej normalnego a swojemu programowi priorytet powyżej normalnego. Przesuwanie klocka odbywało się płynnie, szybko, bez skoków, a procesor był wykorzystywany jak widać.
graph.png
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 » czwartek, 13 stycznia 2011, 13:21

Raczej trudno oczekiwać, by program graficzny nie korzystał wogóle z procesora i karty graficznej.

No, to wiadomo. Chodzi mi o to, że wcześniej GrassHoppeRowi przeszkadzało zużycie na poziomie 20-30%, a teraz nagle nie, mimo że dostał ode mnie rozwiązanie, które redukuje zużycie do ~2%.
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, 13:35

Program należy tak pisać, by optymalnie wykorzystywał zasoby, ale nie można go pisać w taki sposób, że ma np. wykorzystywać 10 % procesora, bo to akurat zależy od wielu czynników. Nie wszystkie operacje wykonuje procesor główny, bo część operacji graficzny jest wykonywana przez procesor graficzny. Poza tym wszystko zależy od możliwości procesora. Przeprowadziłem test tego programu jednocześnie z programem konwertującym film i program działał płynnie, bez zacinani, migotania, skoków itp. Czas procesora był przydzielany dynamicznie do potrzeb wszystkich działających programów.

Twój program rzeczywiście wykorzystuje procesor w niewielkim stopniu, ale odbywa się to kosztem programu. Animacja migocze i skacze. Trzeba więc ustalić jakieś priorytety, albo program ma działać sprawnie, albo ma w niewielkim stopniu absorbować komputer.

Ja np. u siebie w systemie wyłączyłem plik wymiany, dzięki czemu zyskałem na szybkości operacji wykonywanych w pamięci. Ma to jednak swoja wadę. Gdy uruchomię zbyt dużo programów pamięciożernych to w pewnym momencie wyskakuje niebieski ekran, a wszystko przez to, że w pewnym momencie brakuje pamięci RAM. Coś za coś.
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 GrassHoppeR » czwartek, 13 stycznia 2011, 14:02

polymorphism napisał(a):
Raczej trudno oczekiwać, by program graficzny nie korzystał wogóle z procesora i karty graficznej.

No, to wiadomo. Chodzi mi o to, że wcześniej GrassHoppeRowi przeszkadzało zużycie na poziomie 20-30%, a teraz nagle nie, mimo że dostał ode mnie rozwiązanie, które redukuje zużycie do ~2%.

spoko, wnioski wyciągnąłem. klucz do wydajności to tak jak napisałeś już wcześniej obsługa co jakiś minimalny interwał a nie za każdym ruchem myszki, bo wtedy procesor nic nie robi tylko odświeża widok. zastosowałem DoubleBurrefing i rysowanie na bitmapie (bez GDI+) oraz interwał czasowy więc myślę, że nie będzie ani migotać ani zwalniać i dzięki temu program będzie działać sprawnie i w niewielkim stopniu absorbować procesor.
w związku z tym jeszcze pytanie - jak elegancko rozwiązać wywoływanie danej funkcji co dany interwał czasowy, np. 50 ms?
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 » czwartek, 13 stycznia 2011, 14:07

Twój program rzeczywiście wykorzystuje procesor w niewielkim stopniu, ale odbywa się to kosztem programu. Animacja migocze i skacze.

Ech, Baron, przecież pisałem, żeby nie zwracać na to uwagi, bo nie nie o to mi chodziło. I nic nie odbywało się kosztem programu, po prostu nie chało mi się pisać kodu, który poza estetyką nic nie wnosił. No, ale ok, w załączniku masz program bez migotania.
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
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 » czwartek, 13 stycznia 2011, 14:11

jak elegancko rozwiązać wywoływanie danej funkcji co dany interwał czasowy, np. 50 ms?

No przecież Ci pokazałem jak!

50ms to za dużo. Przy 40ms jest już widoczny brak płynności. Najlepiej dać między 10 a 20ms, więcej nie ma sensu.
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, 14:15

polymorphism napisał(a):No przecież Ci pokazałem jak!

ale to nie jest elegancko ;)

chciałbym wywoływać funkcję, która co jakiś czas sprawdza, czy trzeba odświeżyć widok. szukam czegoś jak wywoływanie zdarzenia timerem.
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 » czwartek, 13 stycznia 2011, 14:33

ale to nie jest elegancko

Bo? Biorąc pod uwagę kod z pierwszego posta, na temat elegancji powinieneś się wypowiadać dość ostrożnie :P

Można jeszcze zrobić tak, że m_last_repaint_time byłaby lokalną zmienną statyczną, ale to nie jest eleganckie rozwiązanie.

szukam czegoś jak wywoływanie zdarzenia timerem.

Hmm, timer? :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 GrassHoppeR » czwartek, 13 stycznia 2011, 14:39

polymorphism napisał(a):Bo?

...chciałbym wywoływać funkcję, która co jakiś czas sprawdza, czy trzeba odświeżyć widok.

polymorphism napisał(a):Biorąc pod uwagę kod z pierwszego posta, na temat elegancji powinieneś się wypowiadać dość ostrożnie

kod z pierwszego posta to okrojona na maxa wersja testowa i niezoptymalizowana, poglądowa, żeby było widać gdzie tkwi błąd. ale nawet w nim stosując interwał byłoby w miarę dobrze.

polymorphism napisał(a):Hmm, timer?

a co? bo nie w temacie jestem.
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 » czwartek, 13 stycznia 2011, 14:45

...chciałbym wywoływać funkcję, która co jakiś czas sprawdza, czy trzeba odświeżyć widok.

Tylko jak to się ma do elegancji mojego kodu/rozwiązania/whatever?
a co?

Chodzi mi o to, że to 'coś', czego szukasz, to timer.
Ostatnio edytowano czwartek, 13 stycznia 2011, 14:49 przez polymorphism, łącznie edytowano 1 raz
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, 14:49

polymorphism napisał(a):Chodzi mi o to, że to 'coś', czego szukasz, to timer.

tak, ale szukam jak to coś wykorzystać.

polymorphism napisał(a):p.s. nie odpowiedziałeś mi na pytanie, co w mojej propozycji jest nieeleganckiego?

działa tylko przy ruchu klocka, a przydałoby aby działało też przy resize okna i przesuwaniu widoku. chcę to zrobić w jednym miejscu po prostu.
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

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 4 gości