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

Zarządzanie pamięcią(ogolnie) (ale też odnośnie obiektów w grze) - parę pytań

Ostatnio zmodyfikowano 2014-05-07 13:26
Autor Wiadomość
colorgreen19
Temat założony przez niniejszego użytkownika
» 2014-05-05 17:20:10
C/C++
for( int l = 0; l < Game_Manager.GetMob().size(); l++ ) ///"przegladam" wektor ze wskaznikami na moby utworzone operatorem new w pamieci
{
    if( Game_Manager.GetMob()[ l ]->GetBounds().contains( Game_Manager.GetPlayer()[ k ]->GetWeapon()[ i ]->GetPosition().x, //jeżeli jakas strzała trafila moba
    Game_Manager.GetPlayer()[ k ]->GetWeapon()[ i ]->GetPosition().y ) )
    /*HIT OPERATIONS*/ {
        Game_Manager.GetPlayer()[ k ]->GetWeapon()[ i ]->Hit(); //funkcja kasujaca pocisk, nieistotne
       
        Game_Manager.GetMob()[ l ]->Defend( Game_Manager.GetPlayer()[ k ]->Attack() ); //zadaje obrażenia
       
        if( typeid( * Game_Manager.GetPlayer()[ k ]->GetWeapon()[ i ] ) == typeid( AmmoWizardExplosion ) ) //jeżeli pocisk jest pociskiem wybuchajacym, razie kilka mobów w promieniu
        {
            for( int n = 0; n < Game_Manager.GetMob().size(); n++ ) //przeglądam ponownie moby
            {
                if( n == l ) continue; //pominiącie pętli jeżeli mob przeglądany jest juz mobem przeglądniętym w wyzszej pętli
               
                int tmp = sqrt( pow( Game_Manager.GetMob()[ n ]->GetPosition().x + Game_Manager.GetMob()[ n ]->GetSize().x / 2
                - Game_Manager.GetPlayer()[ k ]->GetWeapon()[ i ]->GetPosition().x, 2 )
                + pow( Game_Manager.GetMob()[ n ]->GetPosition().y + Game_Manager.GetMob()[ n ]->GetSize().y / 2
                - Game_Manager.GetPlayer()[ k ]->GetWeapon()[ i ]->GetPosition().y, 2 ) ); //odliczam odleglosc moba od pocisku pitagorasem
                float tmpf = 1.f - tmp / 130.f; //obliczam współczynnik proporcjonalności obrazen do odległosci
               
                if( tmp < 130 ) // jeżeli odległosc moba jest mniejsza od 130
                {
                    Game_Manager.GetMob()[ n ]->Defend( Game_Manager.GetPlayer()[ k ]->Attack() * tmpf ); //zadaje obrazenia
                   
                    if( Game_Manager.GetMob()[ n ]->GetHp() <= 0 ) //jezeli zycie moba jest mniejsze od 0, czyli umiera
                    {
                        delete Game_Manager.GetMob()[ n ]; //WADLIWA LINIJKA
                        Game_Manager.GetMob().erase( Game_Manager.GetMob().begin() + n ); //usuwam wskaznik na moba z wektora
                    }
                }
            }
        } ///----------------|
        /*DELETING MOB*/
        if( Game_Manager.GetMob()[ l ]->GetHp() <= 0 ) //jezeli mob poczatkowy umiera
        {
            delete Game_Manager.GetMob()[ l ]; //usuwam obiekt z pamieci
            Game_Manager.GetMob().erase( Game_Manager.GetMob().begin() + l ); //usuwam wskaznik na niego z wektora
        }
        break;
    }
}

Co się dzieje jest w kodzie opisane. Szwankuje "WADLIWA LINIJKA". Wiadomo, ma ona na celu zadanie usunąć moba z pamięci. Na pewno tam on bedzie bo pominąłem ryzyko dwukrotnej próby usuniącia ifem. Co dziwne program crashuje się od razu przy uruchomieniu, nie zdążam nic kliknąć. Co dziwne x2 na wersji debug działa, na release nie (używam C::B 13.12)
P-109335
DejaVu
» 2014-05-05 18:55:39
Powód jest prosty: masz dwie pętle zagnieżdżone. W takiej sytuacji powinieneś oznaczać tylko i wyłącznie, że obiekt ma zostać zniszczony (jakaś zmienna typu bool wewnątrz obiektu), a po wykonaniu przetwarzania zrobić dodatkową pętlę która usunie obiekty oznaczone do skasowania.
P-109338
colorgreen19
Temat założony przez niniejszego użytkownika
» 2014-05-06 15:17:48
Dzięki za pomysł i rozwiązanie, zastosowałem to nie tylko dla mobów. Bądź co bądź mimo, że usuwam już wszystko deletem (moby, cząsteczki, obiekty(strzały czy inne) ) to nadal gdzieś jest wyciek tej pamięci. Nie wiem jak to określic ale na 2 min działania progamy (cały czas generuje czasteczki czy strzały lub moby) przybywa 200 kb. nie wiem czy to dużo i nigdzie nie moge zidentyfikować przyczyny, destruktory wszystkie działaja jak powinny. Zauważyłem chyba taką "zależność", że tej pamięci przybywa do pewnego stopnia. Nie wiem czy nie ma to związku z wektorem trzymającym wskaźnika na moby (ktory potem tej pamięci nie zwalnia), ale przeciez one są skasowane, więc takie troche jst to niedorzeczne.

PS: Nie w temacie, najwyżej utworze nowy, ale zna ktoś jakąś pomoc do napisania AI przy mapie kafelkowej 2d "z profilu" (cos jak mario)?
P-109371
Wrzud
» 2014-05-06 16:53:58
Co do wycieków to.. valgrind w google :P
P-109374
colorgreen19
Temat założony przez niniejszego użytkownika
» 2014-05-06 17:43:44
Dzięki, ale mam problem z uruchomieniem. Pobrałem, wchodze przez cmd do folderu głownego tego programu i wpisuje jak każą na stronie "  valgrind --leak-check=yes myprog arg1 arg2 " pod myprog daje sciezke do mojego programu. klikam enter a emd pisze ze valgrind nie jest rozpoznawany....
cos zle robie?
P-109377
CodeMeister
» 2014-05-06 23:50:11
a odpalasz go będąc w katalogu z valgrindem czy od razu po odpaleniu cmd?
P-109401
colorgreen19
Temat założony przez niniejszego użytkownika
» 2014-05-07 13:26:58
wchodze przez cmd do folderu głownego tego programu
 wiec tak. tylko nie wiem czy mam być w głównym czy jeszcze w jakimś podfolderze
P-109420
1 2 3 « 4 »
Poprzednia strona Strona 4 z 4