Three improvements involving image caching:

1) prevent the textureQuad map from containing references to cards when we're returning a temp (card backdrop) image in the threaded version.
2) we had two copies of the pspicon image in the cache (ie the regular & managed).  Changed the reference in the DeckMenu code to use the managed instance.
3) Fixed a problem with a default constructor param that would set RESOURCE_LOCKED on certain images.  I noticed that the 'NEW' image was locking itself in the cache because no resource modes was being passed in, so the default constructor param was setting it to locked.  This seems like a bad idea - if you're not explicitly locking a resource in the call, that shouldn't be the default behaviour.

Also added an assert safeguard to catch the possibility of 'overlocking' an image resource, as this probably means the image fetching routine is being abused somehow.
This commit is contained in:
wrenczes@gmail.com
2011-07-07 07:37:17 +00:00
parent 93d96fe52b
commit c5963c3c23
4 changed files with 22 additions and 7 deletions
+4 -1
View File
@@ -8,6 +8,9 @@
const std::string kGenericCardID = "back";
const std::string kGenericCardThumbnailID = "back_thumb";
const std::string kGenericCard("back.jpg");
const std::string kGenericThumbCard("back_thumb.jpg");
enum ENUM_WRES_INFO
{
WRES_UNLOCKED = 0, //Resource is unlocked.
@@ -74,7 +77,7 @@ public:
virtual JQuadPtr RetrieveCard(MTGCard * card, int style = RETRIEVE_NORMAL,int submode = CACHE_NORMAL) = 0;
virtual JSample * RetrieveSample(const string& filename, int style = RETRIEVE_NORMAL, int submode = CACHE_NORMAL) = 0;
virtual JTexture * RetrieveTexture(const string& filename, int style = RETRIEVE_NORMAL, int submode = CACHE_NORMAL) = 0;
virtual JQuadPtr RetrieveQuad(const string& filename, float offX=0.0f, float offY=0.0f, float width=0.0f, float height=0.0f, string resname="", int style = RETRIEVE_LOCK, int submode = CACHE_NORMAL, int id = 0) = 0;
virtual JQuadPtr RetrieveQuad(const string& filename, float offX=0.0f, float offY=0.0f, float width=0.0f, float height=0.0f, string resname="", int style = RETRIEVE_NORMAL, int submode = CACHE_NORMAL, int id = 0) = 0;
virtual JQuadPtr RetrieveTempQuad(const string& filename, int submode = CACHE_NORMAL) = 0;
virtual hgeParticleSystemInfo * RetrievePSI(const string& filename, JQuad * texture, int style = RETRIEVE_NORMAL, int submode = CACHE_NORMAL) = 0;
virtual int RetrieveError() = 0;
+1 -1
View File
@@ -184,7 +184,7 @@ void DeckMenu::initMenuItems()
mSelectionTargetY = selectionY = sY;
//Grab a texture in VRAM.
pspIconsTexture = WResourceManager::Instance()->RetrieveTexture("iconspsp.png", RETRIEVE_LOCK);
pspIconsTexture = WResourceManager::Instance()->RetrieveTexture("iconspsp.png", RETRIEVE_MANAGE);
char buf[512];
for (int i = 0; i < 8; i++)
+17 -2
View File
@@ -39,6 +39,9 @@ void WResource::deadbolt()
void WResource::lock()
{
if (locks < WRES_MAX_LOCK) locks++;
// watch out for this - if the lock count increases beyond a reasonable threshold,
// someone is probably not releasing the texture correctly
assert(locks < 50);
}
void WResource::unlock(bool force)
@@ -97,7 +100,19 @@ JQuadPtr WCachedTexture::GetQuad(float offX, float offY, float width, float heig
if (width == 0.0f || width > static_cast<float> (texture->mWidth)) width = static_cast<float> (texture->mWidth);
if (height == 0.0f || height > static_cast<float> (texture->mHeight)) height = static_cast<float> (texture->mHeight);
std::map<string, JQuadPtr>::iterator iter = mTrackedQuads.find(resname);
// If we're fetching a card resource, but it's not available yet, we'll be attempting to get the Quad from the temporary back image.
// If that's the case, don't stash a separate tracked quad entry for each card name in the the Back/BackThumbnail's resource
string resource(resname);
if (mFilename == kGenericCard)
{
resource = kGenericCardID;
}
else if (mFilename == kGenericThumbCard)
{
resource = kGenericCardThumbnailID;
}
std::map<string, JQuadPtr>::iterator iter = mTrackedQuads.find(resource);
if (iter != mTrackedQuads.end())
return iter->second;
@@ -105,7 +120,7 @@ JQuadPtr WCachedTexture::GetQuad(float offX, float offY, float width, float heig
//Update JQ's values to what we called this with.
quad->SetTextureRect(offX, offY, width, height);
mTrackedQuads.insert(std::pair<string, JQuadPtr>(resname, quad));
mTrackedQuads.insert(std::pair<string, JQuadPtr>(resource, quad));
return quad;
}
-3
View File
@@ -23,9 +23,6 @@ namespace
const std::string kExtension_gbk(".gbk");
const std::string kExtension_font(".font");
const std::string kGenericCard("back.jpg");
const std::string kGenericThumbCard("back_thumb.jpg");
// mutex meant for the cache map
boost::mutex sCacheMutex;
// mutex meant to protect against unthread-safe calls into JFileSystem, etc.