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

Optymalizacja procesu malowania

problemy z tworzeniem aplikacji graficznych oraz audio i wideo

Optymalizacja procesu malowania

Nowy postprzez Corvis » środa, 3 listopada 2010, 11:07

Witam,

Mam pytanie, ma ktoś może pomysł na zoptymalizowanie tego programu który wrzuciłem ?? Nie patrzecie na sposób jego napisania bo szukam dopiero algorytmu wiec program wygląda jak wygląda :) Zmienne są podeklarowane jak są.

Problem polega na tym, że jak wybieram dużą ilość danych do namalowania wszystko robi się wolno. Wystarczy tam wpisać Ile Danych np. 99999999 ( program sam określi max ) i zobaczycie jak to się maluje.

Moje pomysły:

1. Malować na BMP potem kopiować na Canvas
2. Może jakaś średnia danych przy dużej ilości próbek na 1 pixel ??? - jak np jest 1000 próbek na jeden pixel to poco ten pixel malować 1000 razy ??
3. Zrobic typ wykresu i wrzucac wykresy do namalowania do wektora ( narazie jest jeden ale to dla testów - ale już widać, że malowani jednego boli a co bedize przy 10 ?? szok :shock: )
4. Zoptymalizować wczytywanie danych jak w temacie SZYBKI PARSER CSV.

Z góry dzięki za pomoc.

Może razem coś ciekawego wymyślimy :)
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
"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, 11:39

Mogłeś dać też skompilowaną wersję aplikacji, bo nie każdy ma buildera...
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 » środa, 3 listopada 2010, 11:46

W załączniku

Zmieniaj tylko Dane Od i Ilość danych i wciśnij przycisk
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
"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, 12:06

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

        if(dane[ i ] < Min) d1 = Min;
        if(dane[ i ] > Max) d1 = Max;

        d = (dane[ i ] - Min) * Skala;

        PaintBox1->Canvas->LineTo(X, Wysokosc - d + Przesuniecie);
        X += (Paczka);
}

LineTo powinno być wywołane tylko wtedy, gdy X przeskoczy do następnego piksela. Teraz może być wywoływane kilkaset/kilka tysięcy razy w miejscu, co skutecznie zamuli całą procedurę. Rysuj pionowymi liniami, nie ukośnymi (chodzi o to, że algorytm rysujący pionowe linie jest prostszy, mniej złożony obliczeniowo, a co za tym idzie szybszy).

Napisz coś więcej o aplikacji, charakterze danych, ich pochodzeniu itd. Bez tego nie da się dobrać skutecznej metody optymalizacji. Czy te dane muszą być autoskalowane w pionie?
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 » środa, 3 listopada 2010, 12:14

Przez autoskalowanie w pionie rozumiesz ustawienie Poz Min i Poz Max w programie ??? No musi tak zostać bo jak będzie pare wykresów to potem będzie łatwo je przesuwać nakładać na siebie itp.
"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 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
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 » środa, 3 listopada 2010, 12:28

---- w odpowiedzi na priva ----

Czy te dane, przychodzące w paczkach, są doklejane do już istniejących, czy też wyświetlane są jako całość, nie mająca związku z poprzednimi paczkami.
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, 12:30

Mi wydawało się, że są doklejane, gdyż odrysowywanie od początku byłoby wyjątkowo nieekonomiczne.
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, 12:42

Doklejane (dochodzą cały czas), ale program nie musi na tą chwilę chodzić ONLINE - chociaż sposób na rozwiązanie tego ONLINE też chętnie poznam.
Tak myślę, że jak Ilosc na Piexel jest > 1 to trzeba znaleśc min i max w tej ilości i namalować min i max. Powinno zacząć lepiej chodzić.

Wrzucenie wątku w taka aplikacje ma jakiś sens ??
"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 Cyfrowy Baron » środa, 3 listopada 2010, 13:05

Wątek ma tą zaletę, że podczas rysowania wykresu program nie będzie wstrzymywany. Nie opłaca się tutaj dodawać funkcji odświeżającej kolejkę komunikatów, gdyż powodowałaby ona dodatkowe opóźnienia.
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:09

KOD cpp:     UKRYJ  
int Pixel = 0;
for(int i = Start; i <= Koniec; ++i)  {
    d  = (dane[i] - Min) * Skala;
    if(Pixel != int(X+Paczka)) {
        myCanvas->LineTo(X, Wysokosc - d + Przesuniecie);
     }
    X+= (Paczka);
    Pixel = X;
}
 


Na szybko zrobiłem coś takiego o czym pisał polymorphism. Rysuje wtedy jak X zmieni Pixel. Różnica jest kolosalna !! Muszę sprawdzić czy nie zniekształcam wykresu przez to.
"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 Cyfrowy Baron » środa, 3 listopada 2010, 13:12

Sprawdź to też na powiększonym wykresie.
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 » środa, 3 listopada 2010, 13:14

Corvis napisał(a):Powinno zacząć lepiej chodzić.

No, tak, pisałem o tym. Dodatkowo, przy czytaniu pliku, możesz tworzyć tablice, w których każdy element zawiera wartość min-max serii próbek, np. 256, 4096 itd. Dzięki temu, przy dużych zoom-outach, całość będzie szybciej rysowana, bo zamiast robić przykładowo 4096 iteracji per piksel, w celu wyliczenia wartości szczytowych, wystarczy tylko jedna. Wydaje mi się, że już Ci kiedyś wspominałem o tej metodzie...

--- dodane ---

Na szybko zrobiłem coś takiego o czym pisał polymorphism. Rysuje wtedy jak X zmieni Pixel. Różnica jest kolosalna !!

Spróbuj jeszcze malować pionowymi liniami, teraz ryzujesz ukośnymi, co może spowalniać nieco całość.
Ostatnio edytowano środa, 3 listopada 2010, 13:18 przez polymorphism, łącznie edytowano 1 raz
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 Corvis » środa, 3 listopada 2010, 13:18

Obrazek - Stary sposób
Obrazek - Nowy sposób
"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 Corvis » środa, 3 listopada 2010, 13:26

polymorphism napisał(a):Spróbuj jeszcze malować pionowymi liniami, teraz ryzujesz ukośnymi, co może spowalniać nieco całość.


Nie bardzo rozumiem, zamienić X z Y ???
"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

Nastę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