aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Horn2005-04-30 22:01:16 +0000
committerMax Horn2005-04-30 22:01:16 +0000
commited4b43df73f8051a2c35c1278041dfbd89d83527 (patch)
treee167213444435d35f9485d3ae2de7496dda43727
parent280abe9e91c164548b8f2c6692de232c9e316315 (diff)
downloadscummvm-rg350-ed4b43df73f8051a2c35c1278041dfbd89d83527.tar.gz
scummvm-rg350-ed4b43df73f8051a2c35c1278041dfbd89d83527.tar.bz2
scummvm-rg350-ed4b43df73f8051a2c35c1278041dfbd89d83527.zip
Only allocate the actor sorting array once
svn-id: r17875
-rw-r--r--scumm/actor.cpp15
-rw-r--r--scumm/scumm.cpp2
-rw-r--r--scumm/scumm.h1
3 files changed, 7 insertions, 11 deletions
diff --git a/scumm/actor.cpp b/scumm/actor.cpp
index ea761c538d..09163b4481 100644
--- a/scumm/actor.cpp
+++ b/scumm/actor.cpp
@@ -979,30 +979,25 @@ static int compareDrawOrder(const void* a, const void* b)
void ScummEngine::processActors() {
int numactors = 0;
- // TODO : put this actors as a member array. It never has to grow or shrink
- // since _numActors is constant within a game.
- Actor** actors = new Actor * [_numActors];
-
// Make a list of all actors in this room
for (int i = 1; i < _numActors; i++) {
if (_version == 8 && _actors[i]._layer < 0)
continue;
if (_actors[i].isInCurrentRoom() && _actors[i]._costume)
- actors[numactors++] = &_actors[i];
+ _sortedActors[numactors++] = &_actors[i];
}
if (!numactors) {
- delete [] actors;
return;
}
// Sort actors by position before we draw them (to ensure that actors in
// front are drawn after those "behind" them).
- qsort(actors, numactors, sizeof (Actor*), compareDrawOrder);
+ qsort(_sortedActors, numactors, sizeof (Actor*), compareDrawOrder);
- Actor** end = actors + numactors;
+ Actor** end = _sortedActors + numactors;
// Finally draw the now sorted actors
- for (Actor** ac = actors; ac != end; ++ac) {
+ for (Actor** ac = _sortedActors; ac != end; ++ac) {
Actor* a = *ac;
CHECK_HEAP
a->drawActorCostume();
@@ -1010,8 +1005,6 @@ void ScummEngine::processActors() {
a->animateCostume();
}
- delete [] actors;
-
if (_features & GF_NEW_COSTUMES)
akos_processQueue();
}
diff --git a/scumm/scumm.cpp b/scumm/scumm.cpp
index 94158ae417..b0e504d062 100644
--- a/scumm/scumm.cpp
+++ b/scumm/scumm.cpp
@@ -1175,6 +1175,7 @@ ScummEngine::~ScummEngine() {
_mixer->stopAll();
delete [] _actors;
+ delete [] _sortedActors;
delete _2byteFontPtr;
delete _charset;
@@ -1546,6 +1547,7 @@ void ScummEngine::scummInit() {
// Allocate and Initialize actors
Actor::initActorClass(this);
_actors = new Actor[_numActors];
+ _sortedActors = new Actor * [_numActors];
for (i = 0; i < _numActors; i++) {
_actors[i]._number = i;
_actors[i].initActor(1);
diff --git a/scumm/scumm.h b/scumm/scumm.h
index d5fad5ca20..5afc978229 100644
--- a/scumm/scumm.h
+++ b/scumm/scumm.h
@@ -462,6 +462,7 @@ protected:
byte _numActors;
Actor *_actors; // Has _numActors elements
+ Actor **_sortedActors;
byte *_arraySlot;
uint16 *_inventory;