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;
int typesCount;
SAGAResourceTypes resType;
SceneResourceDataArray resourceList;
getResourceTypes(types, typesCount);
for (i = 0; i < _sceneLUT.size(); i++) {
gDebugLevel = -1;
loadSceneDescriptor(_sceneLUT[i]);
loadSceneResourceList(_sceneDescription.resourceListResourceId);
loadSceneResourceList(_sceneDescription.resourceListResourceId, resourceList);
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, "\tresourceListCount %i", (int)_resourceList.size());
for (SceneResourceDataArray::iterator j = _resourceList.begin(); j != _resourceList.end(); ++j) {
debug(DUMP_SCENES_LEVEL, "\tresourceListCount %i", (int)resourceList.size());
for (SceneResourceDataArray::iterator j = resourceList.begin(); j != resourceList.end(); ++j) {
if (j->resourceType >= typesCount) {
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);
}
_resourceList.clear();
}
}
#endif
@ -677,25 +677,11 @@ void Scene::loadScene(LoadSceneParams &loadSceneParams) {
loadSceneDescriptor(_sceneResourceId);
loadSceneResourceList(_sceneDescription.resourceListResourceId);
// 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);
}
}
}
}
SceneResourceDataArray resourceList;
loadSceneResourceList(_sceneDescription.resourceListResourceId, resourceList);
// Process resources from scene resource list
processSceneResources();
processSceneResources(resourceList);
if (_sceneDescription.flags & kSceneFlagISO) {
_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;
_resourceList.clear();
resourceList.clear();
if (resourceId == 0) {
return;
@ -923,14 +909,14 @@ void Scene::loadSceneResourceList(uint32 resourceId) {
ByteArrayReadStreamEndian readS(resourceListData, _sceneContext->isBigEndian());
// Allocate memory for scene resource list
_resourceList.resize(resourceListData.size() / SAGA_RESLIST_ENTRY_LEN);
debug(3, "Scene resource list contains %i entries", (int)_resourceList.size());
resourceList.resize(resourceListData.size() / SAGA_RESLIST_ENTRY_LEN);
debug(3, "Scene resource list contains %i entries", (int)resourceList.size());
// Load scene resource list from raw scene
// resource table
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->resourceType = readS.readUint16();
// 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;
SAGAResourceTypes *types = 0;
int typesCount = 0;
@ -949,11 +936,23 @@ void Scene::processSceneResources() {
getResourceTypes(types, typesCount);
// 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) {
continue;
}
ByteArray &resourceData = resource->buffer;
if (resource->resourceType >= typesCount) {
error("Scene::processSceneResources() wrong resource type %i", resource->resourceType);
@ -1178,9 +1177,6 @@ void Scene::endScene() {
_bgMask.loaded = false;
}
// Free scene resource list
_resourceList.clear();
// Free animation info list
_vm->_anim->reset();