SAGA: reduce memory usage

svn-id: r53782
This commit is contained in:
Andrew Kurushin 2010-10-24 22:52:57 +00:00
parent 599094d3a0
commit 0970cdf5e5
2 changed files with 30 additions and 36 deletions

View file

@ -179,17 +179,18 @@ Scene::Scene(SagaEngine *vm) : _vm(vm) {
SAGAResourceTypes *types; SAGAResourceTypes *types;
int typesCount; int typesCount;
SAGAResourceTypes resType; SAGAResourceTypes resType;
SceneResourceDataArray resourceList;
getResourceTypes(types, typesCount); getResourceTypes(types, typesCount);
for (i = 0; i < _sceneLUT.size(); i++) { for (i = 0; i < _sceneLUT.size(); i++) {
gDebugLevel = -1; gDebugLevel = -1;
loadSceneDescriptor(_sceneLUT[i]); loadSceneDescriptor(_sceneLUT[i]);
loadSceneResourceList(_sceneDescription.resourceListResourceId); loadSceneResourceList(_sceneDescription.resourceListResourceId, resourceList);
gDebugLevel = backUpDebugLevel; gDebugLevel = backUpDebugLevel;
debug(DUMP_SCENES_LEVEL, "Dump Scene: number %i, descriptor resourceId %i, resourceList resourceId %i", i, _sceneLUT[i], _sceneDescription.resourceListResourceId); debug(DUMP_SCENES_LEVEL, "Dump Scene: number %i, descriptor resourceId %i, resourceList resourceId %i", i, _sceneLUT[i], _sceneDescription.resourceListResourceId);
debug(DUMP_SCENES_LEVEL, "\tresourceListCount %i", (int)_resourceList.size()); debug(DUMP_SCENES_LEVEL, "\tresourceListCount %i", (int)resourceList.size());
for (SceneResourceDataArray::iterator j = _resourceList.begin(); j != _resourceList.end(); ++j) { for (SceneResourceDataArray::iterator j = resourceList.begin(); j != resourceList.end(); ++j) {
if (j->resourceType >= typesCount) { if (j->resourceType >= typesCount) {
error("wrong resource type %i", j->resourceType); error("wrong resource type %i", j->resourceType);
} }
@ -197,7 +198,6 @@ Scene::Scene(SagaEngine *vm) : _vm(vm) {
debug(DUMP_SCENES_LEVEL, "\t%s resourceId %i", SAGAResourceTypesString[resType], j->resourceId); debug(DUMP_SCENES_LEVEL, "\t%s resourceId %i", SAGAResourceTypesString[resType], j->resourceId);
} }
_resourceList.clear();
} }
} }
#endif #endif
@ -677,25 +677,11 @@ void Scene::loadScene(LoadSceneParams &loadSceneParams) {
loadSceneDescriptor(_sceneResourceId); loadSceneDescriptor(_sceneResourceId);
loadSceneResourceList(_sceneDescription.resourceListResourceId); SceneResourceDataArray resourceList;
loadSceneResourceList(_sceneDescription.resourceListResourceId, resourceList);
// Load resources from scene resource list
for (SceneResourceDataArray::iterator resource = _resourceList.begin(); resource != _resourceList.end(); ++resource) {
if (!resource->invalid) {
_vm->_resource->loadResource(_sceneContext, resource->resourceId, resource->buffer);
if (resource->buffer.size() >= 6) {
if (!memcmp(resource->buffer.getBuffer(), "DUMMY!", 6)) {
resource->invalid = true;
warning("DUMMY resource %i", resource->resourceId);
}
}
}
}
// Process resources from scene resource list // Process resources from scene resource list
processSceneResources(); processSceneResources(resourceList);
if (_sceneDescription.flags & kSceneFlagISO) { if (_sceneDescription.flags & kSceneFlagISO) {
_outsetSceneNumber = _sceneNumber; _outsetSceneNumber = _sceneNumber;
@ -907,10 +893,10 @@ void Scene::loadSceneDescriptor(uint32 resourceId) {
} }
} }
void Scene::loadSceneResourceList(uint32 resourceId) { void Scene::loadSceneResourceList(uint32 resourceId, SceneResourceDataArray &resourceList) {
ByteArray resourceListData; ByteArray resourceListData;
_resourceList.clear(); resourceList.clear();
if (resourceId == 0) { if (resourceId == 0) {
return; return;
@ -923,14 +909,14 @@ void Scene::loadSceneResourceList(uint32 resourceId) {
ByteArrayReadStreamEndian readS(resourceListData, _sceneContext->isBigEndian()); ByteArrayReadStreamEndian readS(resourceListData, _sceneContext->isBigEndian());
// Allocate memory for scene resource list // Allocate memory for scene resource list
_resourceList.resize(resourceListData.size() / SAGA_RESLIST_ENTRY_LEN); resourceList.resize(resourceListData.size() / SAGA_RESLIST_ENTRY_LEN);
debug(3, "Scene resource list contains %i entries", (int)_resourceList.size()); debug(3, "Scene resource list contains %i entries", (int)resourceList.size());
// Load scene resource list from raw scene // Load scene resource list from raw scene
// resource table // resource table
debug(3, "Loading scene resource list"); debug(3, "Loading scene resource list");
for (SceneResourceDataArray::iterator resource = _resourceList.begin(); resource != _resourceList.end(); ++resource) { for (SceneResourceDataArray::iterator resource = resourceList.begin(); resource != resourceList.end(); ++resource) {
resource->resourceId = readS.readUint16(); resource->resourceId = readS.readUint16();
resource->resourceType = readS.readUint16(); resource->resourceType = readS.readUint16();
// demo version may contain invalid resourceId // demo version may contain invalid resourceId
@ -940,7 +926,8 @@ void Scene::loadSceneResourceList(uint32 resourceId) {
} }
} }
void Scene::processSceneResources() { void Scene::processSceneResources(SceneResourceDataArray &resourceList) {
ByteArray resourceData;
const byte *palPointer; const byte *palPointer;
SAGAResourceTypes *types = 0; SAGAResourceTypes *types = 0;
int typesCount = 0; int typesCount = 0;
@ -949,11 +936,23 @@ void Scene::processSceneResources() {
getResourceTypes(types, typesCount); getResourceTypes(types, typesCount);
// Process the scene resource list // Process the scene resource list
for (SceneResourceDataArray::iterator resource = _resourceList.begin(); resource != _resourceList.end(); ++resource) { for (SceneResourceDataArray::iterator resource = resourceList.begin(); resource != resourceList.end(); ++resource) {
if (resource->invalid) {
continue;
}
_vm->_resource->loadResource(_sceneContext, resource->resourceId, resourceData);
if (resourceData.size() >= 6) {
if (!memcmp(resourceData.getBuffer(), "DUMMY!", 6)) {
resource->invalid = true;
warning("DUMMY resource %i", resource->resourceId);
}
}
if (resource->invalid) { if (resource->invalid) {
continue; continue;
} }
ByteArray &resourceData = resource->buffer;
if (resource->resourceType >= typesCount) { if (resource->resourceType >= typesCount) {
error("Scene::processSceneResources() wrong resource type %i", resource->resourceType); error("Scene::processSceneResources() wrong resource type %i", resource->resourceType);
@ -1178,9 +1177,6 @@ void Scene::endScene() {
_bgMask.loaded = false; _bgMask.loaded = false;
} }
// Free scene resource list
_resourceList.clear();
// Free animation info list // Free animation info list
_vm->_anim->reset(); _vm->_anim->reset();

View file

@ -110,7 +110,6 @@ enum SAGAResourceTypes {
struct SceneResourceData { struct SceneResourceData {
uint32 resourceId; uint32 resourceId;
int resourceType; int resourceType;
ByteArray buffer;
bool invalid; bool invalid;
SceneResourceData() : resourceId(0), resourceType(0), invalid(false) { SceneResourceData() : resourceId(0), resourceType(0), invalid(false) {
@ -360,9 +359,9 @@ class Scene {
private: private:
void loadScene(LoadSceneParams &loadSceneParams); void loadScene(LoadSceneParams &loadSceneParams);
void loadSceneDescriptor(uint32 resourceId); void loadSceneDescriptor(uint32 resourceId);
void loadSceneResourceList(uint32 resourceId); void loadSceneResourceList(uint32 resourceId, SceneResourceDataArray &resourceList);
void loadSceneEntryList(const ByteArray &resourceData); void loadSceneEntryList(const ByteArray &resourceData);
void processSceneResources(); void processSceneResources(SceneResourceDataArray &resourceList);
void getResourceTypes(SAGAResourceTypes *&types, int &typesCount); void getResourceTypes(SAGAResourceTypes *&types, int &typesCount);
@ -382,7 +381,6 @@ class Scene {
bool _chapterPointsChanged; bool _chapterPointsChanged;
bool _inGame; bool _inGame;
SceneDescription _sceneDescription; SceneDescription _sceneDescription;
SceneResourceDataArray _resourceList;
SceneProc *_sceneProc; SceneProc *_sceneProc;
SceneImage _bg; SceneImage _bg;
SceneImage _bgMask; SceneImage _bgMask;