From 832f11c153c62ed51ed4587a4fcc96157bce66a7 Mon Sep 17 00:00:00 2001 From: "wrenczes@gmail.com" Date: Sun, 17 Oct 2010 16:54:08 +0000 Subject: [PATCH] Switched the managed JQuad container implementation from a vector to a map. This speeds up the cache lookup time from O(n) to O(log n). Hard to see a noticeable difference on win, but it definitely feels snappier on my psp, for instance, when browsing your library for a card, or your graveyard, etc. I'm also noticing that the GetQuad(int) variant never seems to get hit, so I suspect that the ID lookup map is redundant. I left it alone as the JResourceManager base class forces the need for the function; I need to spend more time looking at just how much of JResourceManager we actually use at this point. --- JGE/include/JResourceManager.h | 1 + projects/mtg/include/WResourceManager.h | 9 ++- projects/mtg/src/WResourceManager.cpp | 90 ++++++++++++++----------- 3 files changed, 58 insertions(+), 42 deletions(-) diff --git a/JGE/include/JResourceManager.h b/JGE/include/JResourceManager.h index d3a787762..38c1efa78 100644 --- a/JGE/include/JResourceManager.h +++ b/JGE/include/JResourceManager.h @@ -24,6 +24,7 @@ using namespace std; #define INVALID_ID -1 +#define ALREADY_EXISTS -2 class JRenderer; class JSample; diff --git a/projects/mtg/include/WResourceManager.h b/projects/mtg/include/WResourceManager.h index 87b1403bf..452bea97d 100644 --- a/projects/mtg/include/WResourceManager.h +++ b/projects/mtg/include/WResourceManager.h @@ -162,6 +162,8 @@ public: JQuad* GetQuad(const string &quadName); JQuad* GetQuad(int id); + int AddQuadToManaged(const WManagedQuad& inManagedQuad); + //Our file redirect system. string graphicsFile(const string filename); string avatarFile(const string filename); @@ -207,7 +209,12 @@ private: WCache textureWCache; WCache sampleWCache; WCache psiWCache; - vector managedQuads; + + typedef std::map ManagedQuadMap; + ManagedQuadMap mManagedQuads; + + typedef std::map IDLookupMap; + IDLookupMap mIDLookupMap; //Statistics of record. unsigned int lastTime; diff --git a/projects/mtg/src/WResourceManager.cpp b/projects/mtg/src/WResourceManager.cpp index 0bb238c12..a942ec45a 100644 --- a/projects/mtg/src/WResourceManager.cpp +++ b/projects/mtg/src/WResourceManager.cpp @@ -195,11 +195,6 @@ WResourceManager::~WResourceManager(){ RemoveWFonts(); RemoveWLBFonts(); - for(vector::iterator it=managedQuads.begin();it!=managedQuads.end();it++){ - WManagedQuad* wm = *it; - SAFE_DELETE(wm); - } - managedQuads.clear(); LOG("==Successfully Destroyed WResourceManager=="); } @@ -260,65 +255,78 @@ JQuad * WResourceManager::RetrieveCard(MTGCard * card, int style, int submode){ return NULL; } +int WResourceManager::AddQuadToManaged(const WManagedQuad& inQuad) +{ + int id = mIDLookupMap.size(); + mIDLookupMap.insert(make_pair(id, inQuad.resname)); + mManagedQuads.insert(make_pair(inQuad.resname, inQuad)); + + return id; +} int WResourceManager::CreateQuad(const string &quadName, const string &textureName, float x, float y, float width, float height){ if(!quadName.size() || !textureName.size()) return INVALID_ID; - - string resname = quadName; - vector::iterator it; - int pos = 0; - for(it = managedQuads.begin();it!=managedQuads.end();it++,pos++){ - if((*it)->resname == resname) - return pos; + if (GetQuad(quadName) != NULL) + { + assert(false); + return ALREADY_EXISTS; } WCachedTexture * jtex = textureWCache.Retrieve(0,textureName,RETRIEVE_MANAGE); lastError = textureWCache.mError; - + int id = INVALID_ID; //Somehow, jtex wasn't promoted. if(RETRIEVE_MANAGE && jtex && !jtex->isPermanent()) - return INVALID_ID; + return id; if(jtex){ - WTrackedQuad * tq = jtex->GetTrackedQuad(x,y,width,height,quadName); - + WTrackedQuad * tq = jtex->GetTrackedQuad(x,y,width,height,quadName); + if(tq){ tq->deadbolt(); - WManagedQuad * mq; - mq = NEW WManagedQuad(); - mq->resname = resname; - mq->texture = jtex; - managedQuads.push_back(mq); - } - return (int) (managedQuads.size() - 1); + WManagedQuad mq; + mq.resname = quadName; + mq.texture = jtex; + id = AddQuadToManaged(mq); + } } - return INVALID_ID; + assert(id != INVALID_ID); + return id; } -JQuad * WResourceManager::GetQuad(const string &quadName){ - string lookup = quadName; - - for(vector::iterator it=managedQuads.begin();it!=managedQuads.end();it++){ - if((*it)->resname == lookup) - return (*it)->texture->GetQuad(lookup); +JQuad* WResourceManager::GetQuad(const string &quadName){ + + JQuad* result = NULL; + ManagedQuadMap::const_iterator found = mManagedQuads.find(quadName); + if (found != mManagedQuads.end()) + { + result = found->second.texture->GetQuad(quadName); } - return NULL; + return result; } JQuad * WResourceManager::GetQuad(int id){ - if(id < 0 || id >= (int) managedQuads.size()) - return NULL; - WCachedTexture * jtex = managedQuads[id]->texture; - if(!jtex) - return NULL; + JQuad* result = NULL; + if(id < 0 || id >= (int) mManagedQuads.size()) + return result; - return jtex->GetQuad(managedQuads[id]->resname); + IDLookupMap::const_iterator key = mIDLookupMap.find(id); + if (key != mIDLookupMap.end()) + { + WCachedTexture * jtex = mManagedQuads[key->second].texture; + if(jtex) + { + result = jtex->GetQuad(key->second); + } + } + + return result; } JQuad * WResourceManager::RetrieveTempQuad(string filename,int submode){ @@ -365,10 +373,10 @@ JQuad * WResourceManager::RetrieveQuad(string filename, float offX, float offY, if(!tq) return NULL; if(style == RETRIEVE_MANAGE && resname != ""){ - WManagedQuad * mq = NEW WManagedQuad(); - mq->resname = resname; - mq->texture = jtex; - managedQuads.push_back(mq); + WManagedQuad mq; + mq.resname = resname; + mq.texture = jtex; + AddQuadToManaged(mq); } if(style == RETRIEVE_LOCK)