SAGA: reduce memory usage
svn-id: r53782
This commit is contained in:
parent
599094d3a0
commit
0970cdf5e5
2 changed files with 30 additions and 36 deletions
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue