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: ? std::vector < Bullets *> bullets;
Bullet * b = new Bullet; bullets.push_back( b )
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: 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) |
|
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. |
|
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: 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; m_particles.push_back( p ); } } void Delete() { delete this; } void ClearParticles() { for( m_it = m_particles.begin(); m_it != m_particles.end(); m_it++ ) { delete( * m_it ); } } }
|
|
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ą. |
|
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. |
|
pekfos |
» 2014-05-03 19:00:39 void Delete() { delete this; }
|
Może usunie, a może nie. To ma niezdefiniowane zachowanie. 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. |
|
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: void ParticleEmitter::Delete() { ClearParticles(); delete this; }
emitter.Delete(); zrobić to: 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 |
|
pekfos |
» 2014-05-03 19:21:26 emitter.ClearParticles(); delete emitter;
|
Ponownie - nie wiesz co robisz. Słyszałeś o czymś takim, jak destruktor? |
|
« 1 » 2 3 4 |