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
Zarządzanie pamięcią(ogolnie) (ale też odnośnie obiektów w grze) - parę pytań
» 2014-05-03 14:44:01
Tyle sie pisze ze c++ to taki język, w którym niestety to my musimy pisac cały kod odpowiedzialny za zarządzanie pamięcią i w ogole... (mam nadzieje ze wiadomo o co chodzi) Dlatego chce się upewnić paru rzeczy:

1) Rozumiem, że chodzi tu o operatory new i delete? (innej możliwości zarządzania pamięcią w c++ nie znam, jeśli jest to prosze napisać)
2) Mając sobie gre gdzie można strzeleć to chodzi o to, żeby ją napisać tak, aby niezależnie od ilości pocisków, mobów itp pamięć nie rosła (?)
    2.1) Czy taki rozwiązanie jest dobre: ?
C/C++
std::vector < Bullets *> bullets;
//przy strzale
Bullet * b = new Bullet;
bullets.push_back( b )
//potem usuwanie tego
delete bullets[ i ];
3) Czy to prawda, że wektor pozostawia śmieci w pamięci? Czy na tyle duze że "zaszkodzą" programowi i czy nieistotne?
4) Lepiej używać std::vektor czy std::list?
5) Mając:
C/C++
class Bullet {
    ParticleEmitter emitter;
}
a emitter tworzy swoje cząsteczki operatorem new i zawiera liste wskaźników na nie, to usuwając Bullet jak w pytaniu 2.1 usuną mi sie wszystkie cząsteczki emittera? (mam funkcje kasująca na wszelki wypadek, ale pytam też z ciekawkości)
P-109169
pekfos
» 2014-05-03 15:01:32
1) Rozumiem, że chodzi tu o operatory new i delete?
A malloc() i free()?

2) Mając sobie gre gdzie można strzeleć to chodzi o to, żeby ją napisać tak, aby niezależnie od ilości pocisków, mobów itp pamięć nie rosła (?)
O.o, nie.

3) Czy to prawda, że wektor pozostawia śmieci w pamięci? Czy na tyle duze że "zaszkodzą" programowi i czy nieistotne?
Jak wrzucisz 1000 elementów, to vector<> będzie trzymać pamięć na co najmniej 1000 elementów, ale jak usuniesz wszystkie to dalej będzie trzymać tą samą ilość pamięci.

4) Lepiej używać std::vektor czy std::list?
"Lepiej używać miksera, czy samochodu?"

a emitter tworzy swoje cząsteczki operatorem new i zawiera liste wskaźników na nie, to usuwając Bullet jak w pytaniu 2.1 usuną mi sie wszystkie cząsteczki emittera?
Za mało informacji.
P-109170
colorgreen19
Temat założony przez niniejszego użytkownika
» 2014-05-03 15:43:12
1) Czytałem ze malloc i free są przestarzałe w stosunku to new i delete chociaz mozna je uzywac, ale ja akurat nie moge

2) zle sie wyraziłem: strzelając "generuje" pewna ilośc pocisków, on jak trafią albo jak upłynie ich "czas życia" to się usuną. i chodzi o to że pamięć zużyta przed ich wygenerowaniem powinna być taka sama jak po ich usunięciu. Czyż nie tak?

4) wiem, ze mają one swoje wady i zalety ale odnośnie tego 3 to myslałem, że to jakoś inaczej wygląda
5) Uproszcze troche:
C/C++
class ParticleEmiter {
    struct P
    {
        sf::Vector2f velocity;
        sf::Vector2f position;
        sf::Color color;
        sf::Time lifetime;
    };
    std::list < P * > m_particles;
   
    void AddParticles( int count )
    {
        for( int i = 0; i < count; i++ )
        {
            P * p = new P;
            //..nadaje cechy cząsteczce
            m_particles.push_back( p );
        }
    }
   
    void Delete()
    {
       
        delete this; //..Czy to usunie wszystkie cząsteczki z m_particles
        //czy lepiej żebym wywołał jeszcze ClearParticles(); przed "delete this" ?
    }
   
    void ClearParticles()
    {
        for( m_it = m_particles.begin(); m_it != m_particles.end(); m_it++ )
        {
            delete( * m_it );
        }
    }
   
}
P-109177
MrPoxipol
» 2014-05-03 16:11:26
1) Czytałem ze malloc i free są przestarzałe w stosunku to new i delete
Nie są.
P-109183
Wrzud
» 2014-05-03 16:48:18
Alokacja dynamiczna każdego pocisku z osobna jest zbędna. Wraz ze wzrostem liczebności ich na mapie spadnie wydajność gry za sprawą kasowania wskaźników.
P-109187
pekfos
» 2014-05-03 19:00:39
C/C++
void Delete()
{
   
    delete this; //..Czy to usunie wszystkie cząsteczki z m_particles
    //czy lepiej żebym wywołał jeszcze ClearParticles(); przed "delete this" ?
}
Może usunie, a może nie. To ma niezdefiniowane zachowanie.

5) Uproszcze troche:
NIE. Każda zaalokowana pamięć powinna być zwolniona - i tyle. Póki program spełnia tę prostą regułę, jest dobry. Przynajmniej pod tym względem.. Te pytanie dotyczy tylko tego, że nie wiesz co robisz.
P-109200
colorgreen19
Temat założony przez niniejszego użytkownika
» 2014-05-03 19:07:11
4) to w takim razie jak to "okiełznać"? usunąć to z "zewnątrz"?
tzn zamiast:
C/C++
void ParticleEmitter::Delete()
{
    ClearParticles();
    delete this;
}
//..
emitter.Delete();
zrobić to:
C/C++
emitter.ClearParticles();
delete emitter;
?

5) to było tylko upenienie sie czy dobrze to rozumuje. używalem przed tym fukcji czyszczącej ten vektor m_particles i wiem, że każda zaalokowana pamięc powinna byc zwolniona
P-109202
pekfos
» 2014-05-03 19:21:26
C/C++
emitter.ClearParticles();
delete emitter;
Ponownie - nie wiesz co robisz. Słyszałeś o czymś takim, jak destruktor?
P-109204
« 1 » 2 3 4
  Strona 1 z 4 Następna strona