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? |
|
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. |
|
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)
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 ); } } }
|
|
DejaVu |
» 2010-11-09 17:57:03 for( int i = 0; i <= F_trans.get_poziom(); i++ ) { for( int t = 0; t < ALL_TILES; t++ ) { } }
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.
|
|
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
|
|
malan |
» 2010-11-09 18:12:52 Czy Ty czasami nie próbujesz osiągnąć efektu scrollowania mapy? |
|
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ż...? |
|
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. |
|
« 1 » 2 |