CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Optymalizacja procesu malowania

Optymalizacja procesu malowania

problemy z tworzeniem aplikacji graficznych oraz audio i wideo

Re: Optymalizacja procesu malowania

Nowy postprzez Cyfrowy Baron » środa, 3 listopada 2010, 13:27

Nowy jest jakby odszumiony.
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: Optymalizacja procesu malowania

Nowy postprzez Corvis » środa, 3 listopada 2010, 13:30

Nie widać na nim zagęszczenia danych w poszczególnych miejscach.
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaChrome

Re: Optymalizacja procesu malowania

Nowy postprzez polymorphism » środa, 3 listopada 2010, 13:48

Nie bardzo rozumiem, zamienić X z Y ???

Chodzi mi o to, że teraz współrzędna TeX: x początku linii jest o jeden piksel mniejsza od jej końca, przez co konieczne będzie użycie, wewnątrz GDI oczywiście, bardziej złożonego algorytmu rysującego linię, ponieważ linia jest ukośna. Ta optymalizacja jest średniego poziomu, więc nie oczekuj jakiś wielkich różnic w czasie.
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: Optymalizacja procesu malowania

Nowy postprzez Cyfrowy Baron » środa, 3 listopada 2010, 23:42

GDI linie ukośne rysuje za pomocą punktów, linii pionowych i poziomych, więc stosuje już jakiś algorytm przeliczający piksele. By zrobić jak piszesz, czyli rysować linie pionowe, przy przesunięciu np. o jeden piksel trzeba by opracować własny algorytm. Nie wydaje mi się, by własny algorytm był szybszy od algorytmu GDI, więc w ten sposób raczej nic nie uda się zyskać, lecz wprost przeciwnie.
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: Optymalizacja procesu malowania

Nowy postprzez polymorphism » czwartek, 4 listopada 2010, 00:17

Ale ja nie piszę o własnym algorytmie, tylko o tym, że implementacja algorytmu (wewnątrz GDI) rysującego pionowe linie jest po prostu szybsza od algorytmu rysującego linie ukośne. Kiedyś też miałem problem z wizualizowaniem plików audio, i w trakcie różnych prób wyszło mi, że pionowe linie są rysowane nieco szybciej. Nie wiem, czy to dziś ma jakieś znaczenie, wszak moje testy przeprowadzałem dość dawno, ale warto to sprawdzić, zważywszy, że nakład pracy żaden.
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: Optymalizacja procesu malowania

Nowy postprzez Cyfrowy Baron » czwartek, 4 listopada 2010, 08:59

Źle więc ciebie zrozumiałe. Jak rozumiem proponujesz by był to wykres zupełnie pozbawiony linii ukośnych, a zbudowany tylko z pionowych i poziomych, czy też z samych kresek pionowych. Jeżeli miały by to być tylko pionowe kreski, to pewnie kod byłby szybciej rysowany. Przypuszczam jednak, że niewiele szybszy, gdyż algorytmy GDI są raczej bardzo wydajne.
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: Optymalizacja procesu malowania

Nowy postprzez polymorphism » czwartek, 4 listopada 2010, 11:48

No, tak. Pisałem, że to optymalizacja średniego poziomu, która jest bardziej szlifem niż radykalną zmianą koncepcji. Ma prawo nie działać, ponieważ jest uzależniona od zewnętrznych czynników, w tym przypadku implementacji GDI. Sprawdziłem teraz u siebie, czy są jakieś znaczące różnice w czasach rysowania miliona linii. Wyszło mi, że nie nie ma...
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: Optymalizacja procesu malowania

Nowy postprzez Corvis » czwartek, 4 listopada 2010, 12:33

Dzieki za wszystkie info :-). Zastanawiam się teraz jak najlepiej rysować np 10 wykresów. I wychodzi mi ( pseudo kod ) tak:
KOD cpp:     UKRYJ  
int Pixel = 0;
for(int i = Start; i <= Koniec; ++i)  {
    for(int wykres = 0; wykres < IloscWykresow; ++w) {
       // Ustawienie wszystkich informacji o wykresie: kolorów itp
        d  = wartosci[i][ADRES_WARTOSCI]; // Pobranie wartosci dla danego wykresu planuje je trzymac tak : vector<vector<int> > wartosci
        if(Pixel != int(X+Paczka)) {
           myCanvas->LineTo(X, Wysokosc - d + Przesuniecie);
        }
        X+= (Paczka);
        Pixel = X;
    }
}
 




Ps. swoją drogą. Baronie nie da się zrobić tabulatora w polu edycji ?? bo robienie odstepow spacja w kodzie troche meczy ;)
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaChrome

Re: Optymalizacja procesu malowania

Nowy postprzez polymorphism » czwartek, 4 listopada 2010, 13:21

Rysuj wykresy po kolei, a nie wszystkie na raz.

Trochę mnie dziwi, że nie widzisz nieoptymalności swojego rozwiązania, przecież co pozycję i będziesz wielokrotnie zmieniał ustawienia Canvasa, czyli TeX: (Koniec - Start) *  IloscWykresow zmian. Jest to skrajnie niewydajne, a chyba o wydajność chodziło?
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
Corvis
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: Optymalizacja procesu malowania

Nowy postprzez Cyfrowy Baron » czwartek, 4 listopada 2010, 13:36

Ps. swoją drogą. Baronie nie da się zrobić tabulatora w polu edycji ?? bo robienie odstepow spacja w kodzie troche meczy ;)


Z obiektem typu TEdit nie da się tego zrobić, gdyż w miejscu tabulatora zostanie wstawiony kwadracik. Możesz zamiast TEdit użyć TMemo charakteryzując ten obiekt na TEdit, wtedy wystarczy użyć jako tabulatora znaku: \t

KOD cpp:     UKRYJ  
  Memo1->Text = "kolumna 1\tkolumna 2";


Jeżeli właściwości WantReturns i WordWrap obiektu Memo ustawisz na false, to będziesz mógł pisać tylko w pierwszej linii, a po wciśnięciu przycisku ENTER nie przejdzie do nowej linii, więc będzie zachowywał się dokładnie jak TEdit.
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: Optymalizacja procesu malowania

Nowy postprzez polymorphism » czwartek, 4 listopada 2010, 13:38

Jemu chodziło o okno edycyjne forum :x
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: Optymalizacja procesu malowania

Nowy postprzez Cyfrowy Baron » czwartek, 4 listopada 2010, 13:42

A ot o mu chodziło. :x Niestety nie ja tworzyłem skrypty tego forum i na dobrą sprawę niewielkie mam pojęcie o PHP, a co za tym idzie nie potrafię wprowadzić do tych skryptów zmian.

Co do tych spacji, to ja po prostu piszę kod najpierw w edytorze środowiska lub w notatniku - a tam mogę używać tabulatorów - i potem wklej go na forum. Nie muszę martwić się o spacje, gdyż forum zachowa w miarę możliwości oryginalne formatowanie w znacznikach CODE, CPP itp.
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: Optymalizacja procesu malowania

Nowy postprzez Corvis » piątek, 5 listopada 2010, 11:11

Co myślicie o takim pomyśle (narazie, jeszcze słabo to działa)


KOD cpp:     UKRYJ  
        for(int i = Start; i <= Koniec; ++i)  {
                d  = (dane[i] - Min) * Skala;
                if(IloscNaPixel<=1) {
                        myCanvas->LineTo(X, Wysokosc - d + Przesuniecie);
                } else {
                        int min = 99999;
                        int max = -99999;

                        for(double p = (i*IloscNaPixel); p<((i+1)*IloscNaPixel);p++) {
                                d  = (dane[p] - Min) * Skala;
                                if(d>max) max = d;
                                if(d<min) min = d;
                        }
                        myCanvas->LineTo(X, Wysokosc - min + Przesuniecie);
                        myCanvas->LineTo(X, Wysokosc - max + Przesuniecie);
                }
                X+= (Paczka);
        }
 


Jeżeli Ilość na Pixel jest > 1 to szukam w tym pixelu min i max i potem to rysuje. Narazie mi coś to przesuwa wykres i źle go rysuje ale to pewnie kwestia warunku w pętli szukającej min i max. Powinno to dać możliwość oglądania bardziej dokładnego wykresu co za tym idzie o wiele szybciej ten dokładny wykres będzie rysowany.
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaChrome

Re: Optymalizacja procesu malowania

Nowy postprzez polymorphism » piątek, 5 listopada 2010, 11:48

KOD cpp:     UKRYJ  
for(int i = Start; i <= Koniec; ++i)  
{
        ...

                for(double p = (i * IloscNaPixel); p < ((i + 1) * IloscNaPixel); p++)
                {
                        ...
                }

        ...
}
 

Wielokrotnie przerabiasz te same dane. i jest zawsze powiększane o jeden, niezależnie od wartości IloscNaPixel. Nie rozumiem, dlaczego chcesz wszystko upchać w jednej pętli. Zrób dwie małe, jedną dla skali 1:1, drugą dla 1:n.

Prawą stronę warunku wewnętrznej pętli da się obliczyć wcześniej, nie musi ona być wyliczana co iterację. Pamiętaj o takich rzeczach, jeśli starasz się pisać optymalny kod.
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

Poprzednia 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 2 gości

cron