aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authoruruk2014-07-03 00:39:23 +0200
committeruruk2014-07-04 12:58:46 +0200
commitb9dc93c451d891704d828e3c384aae015a63ff40 (patch)
treec3acbd4063db352acd98a37ee9988261a4cc8094 /engines
parent1305bc8aa8b46459dfea08ad52309a57dbda64d8 (diff)
downloadscummvm-rg350-b9dc93c451d891704d828e3c384aae015a63ff40.tar.gz
scummvm-rg350-b9dc93c451d891704d828e3c384aae015a63ff40.tar.bz2
scummvm-rg350-b9dc93c451d891704d828e3c384aae015a63ff40.zip
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.
Diffstat (limited to 'engines')
-rw-r--r--engines/cge2/cge2.cpp2
-rw-r--r--engines/cge2/cge2_main.cpp8
-rw-r--r--engines/cge2/snail.cpp5
-rw-r--r--engines/cge2/spare.cpp3
-rw-r--r--engines/cge2/vga13h.cpp14
-rw-r--r--engines/cge2/vga13h.h2
6 files changed, 9 insertions, 25 deletions
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 {