[Scummvm-cvs-logs] SF.net SVN: scummvm:[46102] scummvm/trunk/engines/made

john_doe at users.sourceforge.net john_doe at users.sourceforge.net
Mon Nov 23 16:31:58 CET 2009


Revision: 46102
          http://scummvm.svn.sourceforge.net/scummvm/?rev=46102&view=rev
Author:   john_doe
Date:     2009-11-23 15:31:58 +0000 (Mon, 23 Nov 2009)

Log Message:
-----------
Optimized object property access speed

Modified Paths:
--------------
    scummvm/trunk/engines/made/database.cpp
    scummvm/trunk/engines/made/database.h

Modified: scummvm/trunk/engines/made/database.cpp
===================================================================
--- scummvm/trunk/engines/made/database.cpp	2009-11-23 06:44:40 UTC (rev 46101)
+++ scummvm/trunk/engines/made/database.cpp	2009-11-23 15:31:58 UTC (rev 46102)
@@ -320,13 +320,28 @@
 		obj->setString(str);
 }
 
+int16 *GameDatabase::findObjectPropertyCached(int16 objectIndex, int16 propertyId, int16 &propertyFlag) {
+	uint32 id = (objectIndex << 16) | propertyId;
+	ObjectPropertyCacheMap::iterator iter = _objectPropertyCache.find(id);
+	int16 *propertyPtr = NULL;
+	if (iter != _objectPropertyCache.end()) {
+		propertyPtr = (*iter)._value;
+	} else {
+		propertyPtr = findObjectProperty(objectIndex, propertyId, propertyFlag);
+		_objectPropertyCache[id] = propertyPtr;
+	}
+	propertyFlag = 1;
+	return propertyPtr;
+}
+
 int16 GameDatabase::getObjectProperty(int16 objectIndex, int16 propertyId) {
 
 	if (objectIndex == 0)
 		return 0;
 
 	int16 propertyFlag;
-	int16 *property = findObjectProperty(objectIndex, propertyId, propertyFlag);
+	//int16 *property = findObjectProperty(objectIndex, propertyId, propertyFlag);
+	int16 *property = findObjectPropertyCached(objectIndex, propertyId, propertyFlag);
 
 	if (property) {
 		return (int16)READ_LE_UINT16(property);
@@ -342,7 +357,8 @@
 		return 0;
 
 	int16 propertyFlag;
-	int16 *property = findObjectProperty(objectIndex, propertyId, propertyFlag);
+	//int16 *property = findObjectProperty(objectIndex, propertyId, propertyFlag);
+	int16 *property = findObjectPropertyCached(objectIndex, propertyId, propertyFlag);
 
 	if (property) {
 		if (propertyFlag == 1) {

Modified: scummvm/trunk/engines/made/database.h
===================================================================
--- scummvm/trunk/engines/made/database.h	2009-11-23 06:44:40 UTC (rev 46101)
+++ scummvm/trunk/engines/made/database.h	2009-11-23 15:31:58 UTC (rev 46102)
@@ -27,6 +27,7 @@
 #define MADE_DATABASE_H
 
 #include "common/array.h"
+#include "common/hashmap.h"
 #include "common/util.h"
 #include "common/file.h"
 #include "common/stream.h"
@@ -141,6 +142,7 @@
 	void setObjectString(int16 index, const char *str);
 
 	virtual int16 *findObjectProperty(int16 objectIndex, int16 propertyId, int16 &propertyFlag) = 0;
+	int16 *findObjectPropertyCached(int16 objectIndex, int16 propertyId, int16 &propertyFlag);
 	virtual const char *getString(uint16 offset) = 0;
 	virtual bool getSavegameDescription(const char *filename, Common::String &description, int16 version) = 0;
 	virtual int16 savegame(const char *filename, const char *description, int16 version) = 0;
@@ -152,8 +154,10 @@
 	void dumpObject(int16 index);
 
 protected:
+	typedef Common::HashMap<uint32, int16*> ObjectPropertyCacheMap;
 	MadeEngine *_vm;
 	Common::Array<Object*> _objects;
+	ObjectPropertyCacheMap _objectPropertyCache;
 	byte *_gameState;
 	uint32 _gameStateSize;
 	int16 _mainCodeObjectIndex;


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list