Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Dużo wskaźników, problemy z szybkością programu.

Ostatnio zmodyfikowano 2010-11-09 20:39
Autor Wiadomość
kizia
Temat założony przez niniejszego użytkownika
Dużo wskaźników, problemy z szybkością programu.
» 2010-11-09 15:58:35
Witam
Mam 5 wskaźników, każdy z nich ma dynamicznie przydzieloną tablice narazie jest to 2500.

Field *wsk_field[5] ;
for(int i = 0 ; i < 5 ; i++)
wsk_field = new Field[2500] ;
Później chciał bym żeby jedna tablica miała na oko 250.000 może więcej.
Lecz problem pojawia się przy wyświetlaniu tych elementów, są to kwadraty i w zależności czy doszło do kolizji kwadratu z kamerą, to go wyświetlamy lub nie. Jeżeli wyświetlam tylko jedną warstwe (np. wsk_field[0]) to wszystko w porządku, ale gdy chce wyświetlić więcej warstw to program zaczyna działać dużo wolniej w zależności od tego ile tych warst jest do wyświelenia.
W ogóle to wątpie czy tyle wskaźników wsk_field[250000] nie zakłuciło by normalnej pracy programu?
Powinienem to zrobić w jakiś inny sposób, żebym nie musiał przydzielać tyle elementów tablic?
P-23732
pekfos
» 2010-11-09 16:22:36
powiem tyle: wskaźniki nie mają w ogóle żadnej obsługi błędów więc są najszybsze. po co ci tego tyle? próbuj przerabiać projekt. możesz się zajmować wyświetlaniem tylko tych elementów które faktycznie masz zamiar wyświetlić. tych 100 px za kamerą nie musisz. pominięcie elementu jest szybsze od rysowania za kamerą.

co do przydzielania to możesz użyć kontenerów STL ale one są wolniejsze od wskaźników. wybór odpowiedniego ma znaczenie. std::vector ma najszybsze iterowanie jednak dodanie elementu wiąże się z kopiowaniem całego kontenera. std::deque dość szybko dodaje i dość szybko iteruje a std::list najszybciej dodaje ale iteruje wolno.

w zależności od dalszego kodu możesz wybrać jakiś kontener. jak ilość się nie zmienia to możesz użyć std::vector(po wcześniejszym wywołaniu std::vector::reserve by zabezpieczyć się przed wolnym startem wywołanym kopiowaniem przy dodawaniu, zobacz w dokumentacji) lub wskaźniki.
P-23734
kizia
Temat założony przez niniejszego użytkownika
» 2010-11-09 17:44:42
No potrzebne mi tyle bo chciałem sporą mapę zbudować.

Na ekranie mieści mi się przy rozmiarze tekstury 40x40 chyba 600 kafli. I ja mam to zrobine tak że dla każdego kafla sprawdzam kolizje z kamerą, ale wyświetlam tylko te z kolizją. I teraz nie wiem czy działanie programu spowalnia to sprawdzanie kolizji czy wklejanie zdjęć dla każdego kafla.

Bo jeżeli wyświetlam tylko jeden poziom czyli 600 kafli to jest spokuj ale jeżeli np. 5 poziomów to już jest 3000 kafli. I jak myślicie że to będzie powodować wolną prace czy raczej to że przy wyświetlaniu 5 poziomów sprawdzam kolizje dla 5 * 2500?
Fragment kodu : (wyświetlanie kafli)
C/C++
SDL_Rect field;
field.w = TILE_WIDTH;
field.h = TILE_HEIGHT;
for( int i = 0; i <= F_trans.get_poziom(); i++ )
{
    for( int t = 0; t < ALL_TILES; t++ )
    {
        field.x = wsk_field[ i ][ t ].get_x();
        field.y = wsk_field[ i ][ t ].get_y();
        if( check_collision( box, field ) )
        {
            if( wsk_field[ i ][ t ].get_type() == - 1 )
            {
                apply_surface( field.x - box.x + panel.w, field.y - box.y, S_kratka, S_screen );
            }
            else
            {
                apply_surface( field.x - box.x + panel.w, field.y - box.y, S_sprites, S_screen,
                B_sprites[ wsk_field[ i ][ t ].get_type() ].get_clips() );
            }
           
            std::stringstream tekst;
            tekst << t << ".";
            S_message = TTF_RenderText_Solid( font, tekst.str().c_str(), TC );
           
            apply_surface( field.x - box.x + panel.w + 3, field.y - box.y, S_message, S_screen );
        }
    }
}
P-23746
DejaVu
» 2010-11-09 17:57:03
C/C++
for( int i = 0; i <= F_trans.get_poziom(); i++ )
{
    for( int t = 0; t < ALL_TILES; t++ )
    {
        //...__costam__
    } //for
} //for
Szybkość działania programu wynika ze złożoności stosowanych algorytmów. Twój algorytm ma złożoność: F_trans.get_poziom()*ALL_TILES*__costam__. Jeżeli nie masz żadnych pętli w funkcjach znajdujących się w bloku __costam__ to costam przyjmuje się, że wynosi 1, więc złożoność masz kwadratową. Policz sobie ile milionów operacji Twój algorytm musi wykonać w jednym przebiegu, a zrozumiesz czemu wolno działa.
P-23747
kizia
Temat założony przez niniejszego użytkownika
» 2010-11-09 18:05:16

for( int i = 0; i <= 5 i++ )
{
    for( int t = 0; t < 2500; t++ )
    {
        //...__costam__
    } //for
} //for
Przy takich wartościach już jest widoczne spowolnienie programu.
Myślałem jeszcze rozwiązać to tak żeby wcale nie sprawdzxać kolizji tylko odrazu wyświetlać te elementy które są
w obrębie kamery, tylko sobie algorytmu nie mogłem ułożyć. Ale takie coś będzie dobre jezeli nie będę sprawdzał tej kolizji ? Czyli coś takiego :

for( int i = 0; i <= 5 i++ )
{
    for( int t = 0; t < 600 ; t++ )
    {
        //...__costam__
    } //for
} //for
Noo w ostateczności bez poziomów czyli :

    for( int t = 0; t < 600 ; t++ )
    {
        //...__costam__
    } //for
P-23750
malan
» 2010-11-09 18:12:52
Czy Ty czasami nie próbujesz osiągnąć efektu scrollowania mapy?
P-23751
Elaine
» 2010-11-09 18:25:40
możesz użyć kontenerów STL ale one są wolniejsze od wskaźników
Twierdzisz tak, gdyż...?
P-23753
kizia
Temat założony przez niniejszego użytkownika
» 2010-11-09 18:57:03
efekt scrollowania mapy to ja już osiągłem poruszania się pomiedzy poziomami też, tylko chciałbym żeby program mi nie zwalniał tak znacznie.
P-23757
« 1 » 2
  Strona 1 z 2 Następna strona