From b9dc93c451d891704d828e3c384aae015a63ff40 Mon Sep 17 00:00:00 2001 From: uruk Date: Thu, 3 Jul 2014 00:39:23 +0200 Subject: CGE2: Heavily rework memory management of Sprites. Hopefully it will solve a bunch of memory leak problems. Now Spare is a central container, which stores pointers to every Sprite currently used by the engine. Because of that, there's no more need for Queue's clear(). In case of snKill(), it's just a safeguard, since it's only used by the engine to "kill" the speech bubbles, but we will check Spare anyway, so it's the safest this way. --- engines/cge2/cge2.cpp | 2 +- engines/cge2/cge2_main.cpp | 8 ++------ engines/cge2/snail.cpp | 5 +++-- engines/cge2/spare.cpp | 3 +++ engines/cge2/vga13h.cpp | 14 -------------- engines/cge2/vga13h.h | 2 -- 6 files changed, 9 insertions(+), 25 deletions(-) (limited to 'engines') diff --git a/engines/cge2/cge2.cpp b/engines/cge2/cge2.cpp index 1a9f48d317..e6df241ea9 100644 --- a/engines/cge2/cge2.cpp +++ b/engines/cge2/cge2.cpp @@ -126,6 +126,7 @@ void CGE2Engine::init() { } void CGE2Engine::deinit() { + delete _spare; delete _resman; delete _vga; delete _fx; @@ -138,7 +139,6 @@ void CGE2Engine::deinit() { delete _eyeTab[i]; } delete _eye; - delete _spare; delete _sprite; delete _commandHandler; delete _commandHandlerTurbo; diff --git a/engines/cge2/cge2_main.cpp b/engines/cge2/cge2_main.cpp index dead21d5a4..5a4b2c1443 100644 --- a/engines/cge2/cge2_main.cpp +++ b/engines/cge2/cge2_main.cpp @@ -280,8 +280,6 @@ void CGE2Engine::loadSprite(const char *fname, int ref, int scene, V3D &pos) { _sprite = h; } } else { - if (_sprite) - delete _sprite; _sprite = new Sprite(this); if (_sprite) _sprite->gotoxyz(pos); @@ -414,7 +412,6 @@ void CGE2Engine::movie(const char *ext) { _commandHandler->addCommand(kCmdClear, -1, 0, nullptr); _commandHandlerTurbo->addCommand(kCmdClear, -1, 0, nullptr); - _vga->_showQ->clear(); _spare->clear(); _now = now; } @@ -725,7 +722,6 @@ void CGE2Engine::runGame() { _commandHandler->addCommand(kCmdClear, -1, 0, nullptr); _commandHandlerTurbo->addCommand(kCmdClear, -1, 0, nullptr); _mouse->off(); - _vga->_showQ->clear(); } void CGE2Engine::loadUser() { @@ -749,7 +745,6 @@ void CGE2Engine::loadHeroes() { // Original name: loadGame() h = new Hero(this); *(Sprite*)h = *s; delete s; - s = nullptr; h->expand(); _spare->update(h); } @@ -757,6 +752,7 @@ void CGE2Engine::loadHeroes() { // Original name: loadGame() s = _spare->take(152); _vga->_showQ->insert(s); _heroTab[0]->_face = s; + _spare->update(s); // initialize Wacek/Vincent s = _spare->take(141); @@ -764,7 +760,6 @@ void CGE2Engine::loadHeroes() { // Original name: loadGame() h = new Hero(this); *(Sprite*)h = *s; delete s; - s = nullptr; h->expand(); _spare->update(h); } @@ -772,6 +767,7 @@ void CGE2Engine::loadHeroes() { // Original name: loadGame() s = _spare->take(151); _vga->_showQ->insert(s); _heroTab[1]->_face = s; + _spare->update(s); //--- start! switchHero(_sex); diff --git a/engines/cge2/snail.cpp b/engines/cge2/snail.cpp index 9b77fe359e..609196cc26 100644 --- a/engines/cge2/snail.cpp +++ b/engines/cge2/snail.cpp @@ -344,9 +344,10 @@ void CGE2Engine::snKill(Sprite *spr) { hide1(spr); _vga->_showQ->remove(spr); _eventManager->clearEvent(spr); - if (spr->_flags._kill) + if (spr->_flags._kill) { + _spare->take(spr->_ref); delete spr; - else { + } else { spr->setScene(-1); _spare->dispose(spr); } diff --git a/engines/cge2/spare.cpp b/engines/cge2/spare.cpp index d202be9aff..dde37d4fbe 100644 --- a/engines/cge2/spare.cpp +++ b/engines/cge2/spare.cpp @@ -35,6 +35,9 @@ void Spare::sync(Common::Serializer &s) { } void Spare::clear() { + for (int i = 0; i < _container.size(); i++) + delete _container[i]; + _container.clear(); } diff --git a/engines/cge2/vga13h.cpp b/engines/cge2/vga13h.cpp index a181621008..3ce690ed6a 100644 --- a/engines/cge2/vga13h.cpp +++ b/engines/cge2/vga13h.cpp @@ -761,20 +761,6 @@ void Sprite::sync(Common::Serializer &s) { Queue::Queue(bool show) : _head(NULL), _tail(NULL) { } -Queue::~Queue() { - clear(); -} - -void Queue::clear() { - while (_head) { - Sprite *s = remove(_head); - if (s->_flags._kill) { - delete s; - s = nullptr; - } - } -} - void Queue::append(Sprite *spr) { if (spr->_flags._back) spr->backShow(); diff --git a/engines/cge2/vga13h.h b/engines/cge2/vga13h.h index c42b7a746e..ce914ce2c8 100644 --- a/engines/cge2/vga13h.h +++ b/engines/cge2/vga13h.h @@ -284,7 +284,6 @@ class Queue { Sprite *_tail; public: Queue(bool show); - ~Queue(); void append(Sprite *spr); void insert(Sprite *spr, Sprite *nxt); @@ -298,7 +297,6 @@ public: } Sprite *locate(int ref); bool locate(Sprite *spr); - void clear(); }; class Vga { -- cgit v1.2.3