Erwan - cache fixes - Code review highly appreciated, please criticize my code!

- fix issue 65 (quads when no image  load slowly in shop/deck editor)
- Possibly fix issue 92, please let me know if it reproduces
- Fix issue 97 (Deck editor: weird behavior of deck display)
- Fix issue 39 - please verify
- Issue 56 can probably be closed as well
- Fix issue 86
This commit is contained in:
wagic.the.homebrew@gmail.com
2009-10-13 14:16:30 +00:00
parent 90a29437d2
commit 6f159fb39c
25 changed files with 231 additions and 432 deletions

View File

@@ -72,6 +72,11 @@ protected:
public:
#if defined (WIN32) || defined (LINUX)
#else
int PixelSize(int textureMode);
#endif
//////////////////////////////////////////////////////////////////////////
/// Get the singleton instance
///
@@ -540,7 +545,6 @@ private:
int mCurrentTex;
int mCurrentBlend;
int mCurrentTextureFormat;
int PixelSize(int textureMode);
#endif
bool mVsync;

Binary file not shown.

View File

@@ -60,7 +60,6 @@ public:
MOMIR_MODE_UNLOCKED,
EVILTWIN_MODE_UNLOCKED,
RANDOMDECK_MODE_UNLOCKED,
CACHESIZE,
//Theme metrics. These will be phased out fairly soon.
THEME_METRICS, //Start of theme metrics.
LOADING_TC = THEME_METRICS,
@@ -151,7 +150,7 @@ public:
string str;
//All calls to asColor should include a fallback color for people without a theme.
PIXEL_TYPE asColor(PIXEL_TYPE fallback = ARGB(255,255,255,255));
bool isDefault(); //Returns true when number is 0 abd string is "" or "default"
bool isDefault(); //Returns true when number is 0 abd string is "" or "Default"
GameOption(int value = 0);
GameOption(string);
GameOption(int, string);

View File

@@ -1,7 +1,6 @@
#ifndef _LOGGER_H
#define _LOGGER_H_
#ifdef DOLOG
#define LOG(x) Logger::Log(x);
#else

View File

@@ -52,9 +52,8 @@ public:
~WTrackedQuad();
void Nullify();
void Trash();
unsigned long size();
bool isGood();
unsigned long size();
string resname;
JQuad * quad;
};
@@ -100,7 +99,8 @@ public:
void Nullify();
void Trash();
void Refresh(string filename);
unsigned long size();
unsigned long size();
bool isGood();
bool Attempt(string filename, int submode, int & error);
bool compare(hgeParticleSystemInfo * p) {return (p == particles);};

View File

@@ -7,24 +7,20 @@
#include "MTGCard.h"
#include "WCachedResource.h"
//Soft limits.
#define HUGE_CACHE_LIMIT 10000000
#define HUGE_CACHE_ITEMS 300
#define LARGE_CACHE_LIMIT 5000000
#define LARGE_CACHE_ITEMS 200
#define SMALL_CACHE_LIMIT 3000000
#define SMALL_CACHE_ITEMS 150
#define HUGE_CACHE_LIMIT 6000000 // Size of the cache for Windows and Linux
#define SAMPLES_CACHE_SIZE 1000000 // Size in bytes of the cached samples
#define PSI_CACHE_SIZE 500000 // Size in bytes of the cahed particles
#define TEXTURES_CACHE_MINSIZE 2000000 // Minimum size of the cache on the PSP. The program should complain if the cache ever gets smaller than this
#define OPERATIONAL_SIZE 5000000 // Size required by Wagic for operational stuff. 3MB is not enough. The cache will usually try to take (Total Ram - Operational size)
//Hard Limits.
#define MAX_CACHE_OBJECTS HUGE_CACHE_ITEMS
#define MAX_CACHE_OBJECTS 300
#define MAX_CACHE_ATTEMPTS 10
#define MAX_CACHE_MISSES 200
#define MAX_CACHED_SAMPLES 4
#define MAX_CACHED_SAMPLES 10
#define MAX_CACHE_GARBAGE 10
enum ENUM_WRES_INFO{
WRES_UNLOCKED = 0, //Resource is unlocked.
WRES_MAX_LOCK = 250, //Maximum number of locks for a resource.
@@ -38,7 +34,6 @@ enum ENUM_RETRIEVE_STYLE{
RETRIEVE_LOCK, //As above, locks cached resource. Not for quads.
RETRIEVE_UNLOCK, //As above, unlocks cached resource. Not for quads.
RETRIEVE_RESOURCE, //Only retrieves a managed resource. Does not make a new one.
RETRIEVE_VRAM, //Retrieve it, and use vram if have to we create it. Must still remove it.
RETRIEVE_MANAGE, //Makes resource permanent.
RETRIEVE_THUMB, //Retrieve it as a thumbnail.
CACHE_THUMB = RETRIEVE_THUMB, //Backwords compatibility.
@@ -51,10 +46,9 @@ enum ENUM_CACHE_SUBTYPE{
//Because these bits only modify how a cached resource's Attempt() is called,
//We can use them over and over for each resource type.
TEXTURE_SUB_CARD = (1<<2), //Retrieve using cardFile, not graphicsFile.
TEXTURE_SUB_AVATAR = (1<<6), //Retrieve using avatarFile, not graphicsFile.
TEXTURE_SUB_AVATAR = (1<<5), //Retrieve using avatarFile, not graphicsFile.
TEXTURE_SUB_THUMB = (1<<3),//Retrieve prepending "thumbnails\" to the filename.
TEXTURE_SUB_VRAM = (1<<4), //For textures. If we have to allocate, do it in VRAM.
TEXTURE_SUB_5551 = (1<<5), //For textures. If we have to allocate, use RGBA5551.
TEXTURE_SUB_5551 = (1<<4), //For textures. If we have to allocate, use RGBA5551.
};
@@ -94,14 +88,12 @@ protected:
bool Delete(cacheItem * item); //SAFE_DELETE and garbage collect. If maxCached == 0, nullify first. (This means you have to free that cacheActual later!)
cacheItem* Get(string id, int style = RETRIEVE_NORMAL, int submode = CACHE_NORMAL); //Subordinate to Retrieve.
cacheItem* AttemptNew(string filename, int submode); //Attempts a new cache item, progressively clearing cache if it fails.
cacheItem* Recycle(); //Returns a cache item from the trash.
string makeID(string filename, int submode); //Makes an ID appropriate to the submode.
string makeFilename(string id, int submode); //Makes a filename from an ID.
map<string,cacheItem*> cache;
map<string,cacheItem*> managed; //Cache can be arbitrarily large, so managed items are seperate.
vector<cacheItem*> garbage; //Garbage collection.
unsigned long totalSize;
unsigned long cacheSize;
@@ -126,7 +118,7 @@ public:
WResourceManager();
~WResourceManager();
JQuad * RetrieveCard(MTGCard * card, int style = RETRIEVE_NORMAL, int submode = CACHE_NORMAL); //RetrieveCard is reversed to match current use.
JQuad * RetrieveCard(MTGCard * card, int style = RETRIEVE_NORMAL,int submode = CACHE_NORMAL);
JSample * RetrieveSample(string filename, int style = RETRIEVE_NORMAL, int submode = CACHE_NORMAL);
JTexture * RetrieveTexture(string filename, int style = RETRIEVE_NORMAL, int submode = CACHE_NORMAL);
JQuad * RetrieveQuad(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);
@@ -177,7 +169,7 @@ public:
//Wrapped from JSoundSystem. TODO: Privatize.
JMusic * ssLoadMusic(const char *fileName);
void CacheForState(int state);
void autoResize(); //Recreates the cache size.
void DebugRender();

View File

@@ -638,15 +638,15 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty
}
AIPlayerBaka::AIPlayerBaka(MTGPlayerCards * deck, string file, string fileSmall, string avatarFile) : AIPlayer(deck, file, fileSmall) {
mAvatarTex = resources.RetrieveTexture(avatarFile,RETRIEVE_VRAM,TEXTURE_SUB_AVATAR);
mAvatarTex = resources.RetrieveTexture(avatarFile,RETRIEVE_LOCK,TEXTURE_SUB_AVATAR);
if(!mAvatarTex){
avatarFile = "baka.jpg";
mAvatarTex = resources.RetrieveTexture(avatarFile,RETRIEVE_VRAM,TEXTURE_SUB_AVATAR);
mAvatarTex = resources.RetrieveTexture(avatarFile,RETRIEVE_LOCK,TEXTURE_SUB_AVATAR);
}
if(mAvatarTex)
mAvatar = resources.RetrieveQuad(avatarFile, 0, 0, 35, 50,"bakaAvatar",RETRIEVE_VRAM,TEXTURE_SUB_AVATAR);
mAvatar = resources.RetrieveQuad(avatarFile, 0, 0, 35, 50,"bakaAvatar",RETRIEVE_NORMAL,TEXTURE_SUB_AVATAR);
else
mAvatar = NULL;

View File

@@ -726,11 +726,11 @@ void ActionStack::Fizzle(Interruptible * action){
}
void ActionStack::Render(){
int x0 = 250;
int y0 = 30;
int width = 200;
int height = 90;
int currenty = y0 + 5 ;
float x0 = 250;
float y0 = 30;
float width = 200;
float height = 90;
float currenty = y0 + 5 ;
if (mode == ACTIONSTACK_STANDARD){
if (!askIfWishesToInterrupt || !askIfWishesToInterrupt->displayStack()) return;

View File

@@ -81,27 +81,27 @@ void Credits::compute(Player * _p1, Player * _p2, GameApp * _app){
if (unlocked == -1){
unlocked = isDifficultyUnlocked();
if (unlocked){
unlockedTex = resources.RetrieveTexture("unlocked.png", RETRIEVE_VRAM);
unlockedTex = resources.RetrieveTexture("unlocked.png");
unlockedQuad = resources.RetrieveQuad("unlocked.png", 2, 2, 396, 96);
options[Options::DIFFICULTY_MODE_UNLOCKED] = GameOption(1);
options.save();
} else if ((unlocked = isMomirUnlocked())) {
unlockedTex = resources.RetrieveTexture("momir_unlocked.png", RETRIEVE_VRAM);
unlockedTex = resources.RetrieveTexture("momir_unlocked.png");
unlockedQuad = resources.RetrieveQuad("momir_unlocked.png", 2, 2, 396, 96);
options[Options::MOMIR_MODE_UNLOCKED] = GameOption(1);
options.save();
} else if ((unlocked = isEvilTwinUnlocked())) {
unlockedTex = resources.RetrieveTexture("eviltwin_unlocked.png", RETRIEVE_VRAM);
unlockedTex = resources.RetrieveTexture("eviltwin_unlocked.png");
unlockedQuad = resources.RetrieveQuad("eviltwin_unlocked.png", 2, 2, 396, 96);
options[Options::EVILTWIN_MODE_UNLOCKED] = GameOption(1);
options.save();
}else if((unlocked = isRandomDeckUnlocked())) {
unlockedTex = resources.RetrieveTexture("randomdeck_unlocked.png", RETRIEVE_VRAM);
unlockedTex = resources.RetrieveTexture("randomdeck_unlocked.png");
unlockedQuad = resources.RetrieveQuad("randomdeck_unlocked.png", 2, 2, 396, 96);
options[Options::RANDOMDECK_MODE_UNLOCKED] = GameOption(1);
options.save();
}else if((unlocked = unlockRandomSet())) {
unlockedTex = resources.RetrieveTexture("set_unlocked.png", RETRIEVE_VRAM);
unlockedTex = resources.RetrieveTexture("set_unlocked.png");
unlockedQuad = resources.RetrieveQuad("set_unlocked.png", 2, 2, 396, 96);
options[Options::optionSet(unlocked - 1)] = GameOption(1);
options.save();

View File

@@ -250,19 +250,11 @@ void GameApp::Update()
mCurrentState->End();
mCurrentState = mNextState;
//Automate cache resizing.
for(int x=0;x<MAX_STATE;x++){
if(mNextState == mGameStates[x]){
resources.CacheForState(x);
break;
}
}
#if defined (WIN32) || defined (LINUX)
#else
/*
/*
int maxLinear = ramAvailableLineareMax();
int ram = ramAvailable();
char buf[512];

View File

@@ -46,7 +46,6 @@ const char * Options::optionNames[] = {
"_gprx_rimom",
"_gprx_eviltwin",
"_gprx_rnddeck",
"_gcacheSize",
//Theme metrics
"_tLoadingTC",
"_tStatsTC",
@@ -333,6 +332,8 @@ int GameOptions::load(){
if(file){
while(std::getline(file,s)){
if (!s.size()) continue;
if (s[s.size()-1] == '\r') s.erase(s.size()-1); //Handle DOS files
int found =s.find("=");
string name = s.substr(0,found);
string val = s.substr(found+1);

View File

@@ -123,7 +123,7 @@ void GameStateDeckViewer::Start()
}
//Grab a texture in VRAM.
pspIconsTexture = resources.RetrieveTexture("iconspsp.png",RETRIEVE_VRAM);
pspIconsTexture = resources.RetrieveTexture("iconspsp.png");
char buf[512];
for (int i=0; i < 8; i++){
@@ -201,13 +201,11 @@ void GameStateDeckViewer::addRemove(MTGCard * card){
}
}
stw.needUpdate = true;
//loadIndexes(cardIndex[0]);
}
int GameStateDeckViewer::Remove(MTGCard * card){
if (!card) return 0;
int result = displayed_deck->Remove(card);
//loadIndexes(currentCard);
return result;
}
@@ -233,7 +231,6 @@ void GameStateDeckViewer::Update(float dt)
//Prevent screen from updating.
return;
}
// mParent->effect->UpdateBig(dt);
hudAlpha = 255-(last_user_activity * 500);
if (hudAlpha < 0) hudAlpha = 0;
if (sellMenu){
@@ -419,9 +416,9 @@ void GameStateDeckViewer::renderOnScreenBasicInfo(){
void GameStateDeckViewer::renderSlideBar(){
int total = displayed_deck->getCount(colorFilter);
int filler = 15;
int y = SCREEN_HEIGHT-25;
int bar_size = SCREEN_WIDTH - 2*filler;
float filler = 15;
float y = SCREEN_HEIGHT_F-25;
float bar_size = SCREEN_WIDTH_F - 2*filler;
JRenderer * r = JRenderer::GetInstance();
typedef map<MTGCard *,int,Cmp1>::reverse_iterator rit;
@@ -436,7 +433,7 @@ void GameStateDeckViewer::renderSlideBar(){
for (; it != end; ++it)
if (it->first->hasColor(colorFilter)) currentPos += it->second;
}
int cursor_pos = bar_size * currentPos / total;
float cursor_pos = bar_size * currentPos / total;
r->FillRoundRect(filler + 5,y+5,bar_size,0,3,ARGB(hudAlpha/2,0,0,0));
r->DrawLine(filler+cursor_pos + 5 ,y+5,filler+cursor_pos + 5,y+10,ARGB(hudAlpha/2,0,0,0));
@@ -603,7 +600,7 @@ void GameStateDeckViewer::renderOnScreenMenu(){
font->DrawString(buffer, 10+leftTransition, 10);
int nb_letters = 0;
int posX, posY;
float posX, posY;
DWORD graphColor;
graphColor = ARGB(200, 155, 155, 155);

View File

@@ -144,8 +144,8 @@ void GameStateMenu::Start(){
if (options[Options::MOMIR_MODE_UNLOCKED].number) hasChosenGameType = 0;
if (options[Options::RANDOMDECK_MODE_UNLOCKED].number) hasChosenGameType = 0;
bgTexture = resources.RetrieveTexture("menutitle.png", RETRIEVE_VRAM);
movingWTexture = resources.RetrieveTexture("movingW.png", RETRIEVE_VRAM);
bgTexture = resources.RetrieveTexture("menutitle.png", RETRIEVE_LOCK);
movingWTexture = resources.RetrieveTexture("movingW.png", RETRIEVE_LOCK);
mBg = resources.RetrieveQuad("menutitle.png", 0, 0, 256, 166); // Create background quad for rendering.
mMovingW = resources.RetrieveQuad("movingW.png", 2, 2, 84, 62);
@@ -162,20 +162,6 @@ void GameStateMenu::Start(){
SAFE_DELETE(playerdata);
#if defined DEBUG_CACHE
/*resources.ClearUnlocked(); //So we can tell if we've any extra locks.
if(!resources.menuCached)
resources.menuCached = resources.CountCached();
if(resources.CountCached() != resources.menuCached){
char buf[512];
unsigned int i = resources.CountCached()-resources.menuCached;
sprintf(buf,"Warning: %u leftover locked items.",i);
resources.debugMessage = buf;
}
*/
#endif
}
@@ -336,6 +322,8 @@ void GameStateMenu::Update(float dt)
sprintf(nbcardsStr, "Database: %i cards", mParent->collection->totalCards());
SAFE_DELETE(playerdata);
resetDirectory();
//All major things have been loaded, resize the cache to use it as efficiently as possible
resources.autoResize();
}
break;
case MENU_STATE_MAJOR_FIRST_TIME :

View File

@@ -37,7 +37,6 @@ void GameStateOptions::Start()
optionsList->Add(NEW OptionInteger(Options::INTERRUPT_SECONDS, "Seconds to pause for an Interrupt", 20, 1));
optionsList->Add(NEW OptionInteger(Options::INTERRUPTMYSPELLS, "Interrupt my spells"));
optionsList->Add(NEW OptionInteger(Options::INTERRUPTMYABILITIES, "Interrupt my abilities"));
optionsList->Add(NEW OptionInteger(Options::CACHESIZE, "Use large cache"));
optionsTabs = NEW OptionsMenu();
optionsTabs->Add(optionsList);

View File

@@ -30,7 +30,7 @@ void GameStateShop::Start()
mStage = STAGE_SHOP_SHOP;
bgTexture = resources.RetrieveTexture("shop.jpg", RETRIEVE_VRAM);
bgTexture = resources.RetrieveTexture("shop.jpg");
//alternateRender doesn't lock, so lock our thumbnails for hgeDistort.
altThumb[0] = resources.RetrieveTexture("artifact_thumb.jpg", RETRIEVE_LOCK);

View File

@@ -96,4 +96,5 @@ void GuiAvatars::Render()
r->FillRect(self->actX - w * self->actZ, self->actY - h * self->actZ, w * self->actZ , h * self->actZ, ARGB(200,0,0,0));
}
GuiLayer::Render();
}

View File

@@ -28,8 +28,10 @@ GuiCombat::GuiCombat(GameObserver* go) : GuiLayer(), go(go), active(false), acti
GuiCombat::~GuiCombat()
{
if(ok_tex)
if(ok_tex){
resources.Release(ok_tex);
ok_tex = NULL;
}
for (inner_iterator it = attackers.begin(); it != attackers.end(); ++it)
{

View File

@@ -46,7 +46,7 @@ void GuiPhaseBar::Update(float dt)
void GuiPhaseBar::Render()
{
static const float ICONSCALE = 1.5;
static const unsigned CENTER = SCREEN_HEIGHT / 2 + 10;
static const float CENTER = SCREEN_HEIGHT_F / 2 + 10;
JRenderer* renderer = JRenderer::GetInstance();
GameObserver * g = GameObserver::GetInstance();
unsigned p = (phase->id + Phases - 4) * (Width+1);

View File

@@ -42,7 +42,6 @@ void GuiPlay::VertStack::reset(unsigned total, float x, float y)
{
GuiPlay::CardStack::reset(total, x - CARD_WIDTH, y);
count = 0;
cout << "reset" << endl;
}
void GuiPlay::HorzStack::Render(CardView* card, iterator begin, iterator end)

View File

@@ -4,6 +4,7 @@
#include "../include/GameOptions.h"
#include "../include/WEvent.h"
#include "../include/MTGDeck.h"
#include <assert.h>
#if defined (WIN32) || defined (LINUX)
#include <time.h>
@@ -192,6 +193,7 @@ void MTGGameZone::setOwner(Player * player){
}
MTGCardInstance * MTGGameZone::removeCard(MTGCardInstance * card, int createCopy){
assert(nb_cards < 10000);
int i;
cardsMap.erase(card);
for (i=0; i<(nb_cards); i++) {

View File

@@ -35,7 +35,7 @@ void PlayGuiObject::Update(float dt){
if (mHeight < defaultHeight)
mHeight = defaultHeight;
}
wave = (wave +2) % 255;
wave = (wave +2 * (int) (100 * dt) ) % 255;
for (vector<Effect*>::iterator it = effects.begin(); it != effects.end(); ++it)
(*it)->Update(dt);
Pos::Update(dt);

View File

@@ -24,7 +24,6 @@ void Player::End(){
Player::~Player(){
SAFE_DELETE(manaPool);
resources.Release(mAvatar);
resources.Release(mAvatarTex);
mAvatar = NULL;
mAvatarTex = NULL;
@@ -59,9 +58,9 @@ Player * Player::opponent(){
}
HumanPlayer::HumanPlayer(MTGPlayerCards * deck, string file, string fileSmall) : Player(deck, file, fileSmall) {
mAvatarTex = resources.RetrieveTexture("avatar.jpg",RETRIEVE_VRAM,TEXTURE_SUB_AVATAR);
mAvatarTex = resources.RetrieveTexture("avatar.jpg",RETRIEVE_LOCK,TEXTURE_SUB_AVATAR);
if (mAvatarTex)
mAvatar = resources.RetrieveQuad("avatar.jpg",0,0,35,50,"playerAvatar",RETRIEVE_VRAM,TEXTURE_SUB_AVATAR);
mAvatar = resources.RetrieveQuad("avatar.jpg",0,0,35,50,"playerAvatar",RETRIEVE_NORMAL,TEXTURE_SUB_AVATAR);
else
mAvatar = NULL;
}

View File

@@ -139,30 +139,11 @@ void ShopItem::Render(){
}
JRenderer * renderer = JRenderer::GetInstance();
//float x0 = mX;
//float y0 = mY - (mScale > 1 ? 4 : 0);
/* if (GetId()%2){
float xs[] = {mX, mX, mX+230,mX+230};
float ys[] = {mY-5+17,mY-5+19,mY-5+35,mY-5} ;
renderer->FillPolygon(xs,ys,4,ARGB(200,0,0,0));
x0 = mX + 230 -30;
mFont->DrawString(mText.c_str(), x0, mY + 8,JGETEXT_RIGHT);
}else{
float xs[] = {mX-5, mX-5, mX-5+230,mX-5+230,};
float ys[] = {mY-5,mY-5+35,mY-5+17,mY-5+19} ;
renderer->FillPolygon(xs,ys,4,ARGB(128,0,0,0));
mFont->DrawString(mText.c_str(), mX + 30, mY + 8);
}*/
//renderer->FillRect(mX-5, mY-5,230,35, );
if (mesh){
mesh->Render(0,0);
//renderer->RenderQuad(thumb,x0,y0,0,mScale * 0.45,mScale * 0.45);
}else{
//NOTHING
//ERROR Management
}
if (mHasFocus){
if (card) quad = resources.RetrieveCard(card);

View File

@@ -128,15 +128,13 @@ bool WCachedTexture::ReleaseQuad(JQuad* quad){
}
WTrackedQuad * WCachedTexture::GetTrackedQuad(float offX, float offY, float width, float height,string resname){
if(texture == NULL)
return NULL;
if(!texture) return NULL;
bool allocated = false;
WTrackedQuad * tq = NULL;
JQuad * quad = NULL;
vector<WTrackedQuad*>::iterator it;
std::transform(resname.begin(),resname.end(),resname.begin(),::tolower);
if(width == 0.0f || width > texture->mWidth)
width = texture->mWidth;
@@ -150,24 +148,15 @@ WTrackedQuad * WCachedTexture::GetTrackedQuad(float offX, float offY, float widt
}
}
if(tq == NULL){
if(!tq){
allocated = true;
vector<WTrackedQuad*>::iterator gtq = WCachedTexture::garbageTQs.begin();
if(gtq != WCachedTexture::garbageTQs.end())
{
tq = *gtq;
garbageTQs.erase(gtq);
}
else
tq = NEW WTrackedQuad(resname);
tq = NEW WTrackedQuad(resname);
if(!tq) return NULL;
}
if(tq == NULL)
return NULL;
quad = tq->quad;
if(quad == NULL){
if(!quad){
quad = NEW JQuad(texture,offX,offY,width,height);
if(!quad) {
//Probably out of memory. Try again.
@@ -178,20 +167,19 @@ WTrackedQuad * WCachedTexture::GetTrackedQuad(float offX, float offY, float widt
if(!quad){
if(allocated && tq)
SAFE_DELETE(tq);
fprintf(stderr, "WCACHEDRESOURCE:GetTrackedQuad - Quad is null\n");
return NULL; //Probably a crash.
}
tq->quad = quad;
trackedQuads.push_back(tq);
return tq;
}
else{
//Update JQ's values to what we called this with.
quad->SetTextureRect(offX,offY,width,height);
if (allocated) trackedQuads.push_back(tq);
return tq;
}
return NULL;
//Update JQ's values to what we called this with.
quad->SetTextureRect(offX,offY,width,height);
return tq;
}
JQuad * WCachedTexture::GetQuad(float offX, float offY, float width, float height,string resname){
@@ -206,7 +194,6 @@ JQuad * WCachedTexture::GetQuad(float offX, float offY, float width, float heigh
JQuad * WCachedTexture::GetQuad(string resname){
vector<WTrackedQuad*>::iterator it;
std::transform(resname.begin(),resname.end(),resname.begin(),::tolower);
for(it = trackedQuads.begin();it!=trackedQuads.end();it++){
if((*it) && (*it)->resname == resname){
@@ -225,17 +212,20 @@ JQuad * WCachedTexture::GetCard(float offX, float offY, float width, float heigh
}
unsigned long WCachedTexture::size(){
if(!texture)
return 0;
return texture->mTexHeight*texture->mTexWidth;
if(!texture) return 0;
unsigned int pixel_size = 4;
#if defined WIN32 || defined LINUX
#else
pixel_size = JRenderer::GetInstance()->PixelSize(texture->mTextureFormat);
#endif
return texture->mTexHeight*texture->mTexWidth*pixel_size;
}
bool WCachedTexture::isGood(){
if(!texture)
return false;
return true;
return (texture != NULL);
}
void WCachedTexture::Refresh(string filename){
int error = 0;
JTexture* old = texture;
@@ -287,12 +277,8 @@ bool WCachedTexture::Attempt(string filename, int submode, int & error){
if(submode & TEXTURE_SUB_5551)
format = GU_PSM_5551;
//Use Vram?
if(submode & TEXTURE_SUB_VRAM){
texture = JRenderer::GetInstance()->LoadTexture(realname.c_str(),TEX_TYPE_USE_VRAM,format);
}
else
texture = JRenderer::GetInstance()->LoadTexture(realname.c_str(),TEX_TYPE_NORMAL,format);
texture = JRenderer::GetInstance()->LoadTexture(realname.c_str(),TEX_TYPE_USE_VRAM,format);
//Failure.
if(!texture){

View File

@@ -9,6 +9,7 @@
#include <JFileSystem.h>
#include "../include/WResourceManager.h"
WResourceManager resources;
unsigned int vTime = 0;
int WResourceManager::RetrieveError(){
@@ -36,12 +37,8 @@ void WResourceManager::DebugRender(){
font->SetScale(DEFAULT_MAIN_FONT_SCALE);
renderer->FillRect(0,0,SCREEN_WIDTH,20,ARGB(128,155,0,0));
#ifdef DEBUG_CACHE
if(debugMessage.size())
renderer->FillRect(0,SCREEN_HEIGHT-30,SCREEN_WIDTH,40,ARGB(128,155,0,0));
else
#endif
renderer->FillRect(0,SCREEN_HEIGHT-20,SCREEN_WIDTH,40,ARGB(128,155,0,0));
renderer->FillRect(0,SCREEN_HEIGHT-20,SCREEN_WIDTH,40,ARGB(128,155,0,0));
char buf[512];
@@ -167,9 +164,9 @@ WResourceManager::WResourceManager(){
mFontList.reserve(4);
mFontMap.clear();
psiWCache.Resize(SMALL_CACHE_LIMIT,6); //Plenty of room for mana symbols, or whatever.
sampleWCache.Resize(SMALL_CACHE_LIMIT,MAX_CACHED_SAMPLES);
textureWCache.Resize(LARGE_CACHE_LIMIT,MAX_CACHE_OBJECTS);
psiWCache.Resize(PSI_CACHE_SIZE,20);
sampleWCache.Resize(SAMPLES_CACHE_SIZE,MAX_CACHED_SAMPLES);
textureWCache.Resize(TEXTURES_CACHE_MINSIZE,MAX_CACHE_OBJECTS);
lastTime = 0;
lastError = CACHE_ERROR_NONE;
}
@@ -192,32 +189,33 @@ WResourceManager::~WResourceManager(){
LOG("==Successfully Destroyed WResourceManager==");
}
JQuad * WResourceManager::RetrieveCard(MTGCard * card, int style, int submode){
//Cards are never, ever resource managed, so just check cache.
if(!card || options[Options::DISABLECARDS].number)
return NULL;
JQuad * WResourceManager::RetrieveCard(MTGCard * card, int style, int submode){
//Cards are never, ever resource managed, so just check cache.
if(!card || options[Options::DISABLECARDS].number)
return NULL;
submode = submode | TEXTURE_SUB_CARD;
string filename = card->getSetName();
filename += "/";
filename += card->getImageName();
JQuad * jq = RetrieveQuad(filename,0,0,0,0,"",style,submode|TEXTURE_SUB_5551);
lastError = textureWCache.mError;
if(jq){
jq->SetHotSpot(jq->mTex->mWidth / 2, jq->mTex->mHeight / 2);
return jq;
}
return NULL;
}
submode = submode | TEXTURE_SUB_CARD;
string filename = card->getSetName();
filename += "/";
filename += card->getImageName();
JQuad * jq = RetrieveQuad(filename,0,0,0,0,"",style,submode|TEXTURE_SUB_5551);
lastError = textureWCache.mError;
if(jq){
jq->SetHotSpot(jq->mTex->mWidth / 2, jq->mTex->mHeight / 2);
return jq;
}
return NULL;
}
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;
std::transform(resname.begin(),resname.end(),resname.begin(),::tolower);
vector<WManagedQuad*>::iterator it;
int pos = 0;
@@ -253,7 +251,6 @@ int WResourceManager::CreateQuad(const string &quadName, const string &textureNa
JQuad * WResourceManager::GetQuad(const string &quadName){
string lookup = quadName;
std::transform(lookup.begin(),lookup.end(),lookup.begin(),::tolower);
for(vector<WManagedQuad*>::iterator it=managedQuads.begin();it!=managedQuads.end();it++){
if((*it)->resname == lookup)
@@ -289,11 +286,7 @@ JQuad * WResourceManager::RetrieveQuad(string filename, float offX, float offY,
}
//Aliases.
if(style == RETRIEVE_VRAM){
submode = submode | TEXTURE_SUB_VRAM;
style = RETRIEVE_LOCK;
}
else if(style == RETRIEVE_THUMB){
if(style == RETRIEVE_THUMB){
submode = submode | TEXTURE_SUB_THUMB;
style = RETRIEVE_NORMAL;
}
@@ -319,8 +312,7 @@ JQuad * WResourceManager::RetrieveQuad(string filename, float offX, float offY,
if(jtex){
WTrackedQuad * tq = jtex->GetTrackedQuad(offX,offY,width,height,resname);
if(tq == NULL)
return NULL;
if(!tq) return NULL;
if(style == RETRIEVE_MANAGE && resname != ""){
WManagedQuad * mq = NEW WManagedQuad();
@@ -398,11 +390,7 @@ JTexture * WResourceManager::RetrieveTexture(string filename, int style, int sub
WCachedTexture * res = NULL;
//Aliases.
if(style == RETRIEVE_VRAM){
submode = submode | TEXTURE_SUB_VRAM;
style = RETRIEVE_LOCK;
}
else if(style == RETRIEVE_THUMB){
if(style == RETRIEVE_THUMB){
submode = submode | TEXTURE_SUB_THUMB;
style = RETRIEVE_NORMAL;
}
@@ -521,9 +509,8 @@ string WResourceManager::graphicsFile(const string filename, const string specif
//Check the theme folder.
string theme = options[Options::ACTIVE_THEME].str;
std::transform(theme.begin(), theme.end(), theme.begin(), ::tolower);
if(theme != "" && theme != "default"){
if(theme != "" && theme != "Default"){
sprintf(buf,"themes/%s/%s",theme.c_str(),filename.c_str());
if(fileOK(buf,true))
return buf;
@@ -531,9 +518,8 @@ string WResourceManager::graphicsFile(const string filename, const string specif
//Failure. Check mode graphics
string mode = options[Options::ACTIVE_MODE].str;
std::transform(mode.begin(), mode.end(), mode.begin(), ::tolower);
if(mode != "" && mode != "defualt"){
if(mode != "" && mode != "Default"){
sprintf(buf,"modes/%s/graphics/%s",mode.c_str(),filename.c_str());
if(fileOK(buf,true))
return buf;
@@ -567,8 +553,8 @@ string WResourceManager::avatarFile(const string filename, const string specific
//Check the profile folder.
string profile = options[Options::ACTIVE_PROFILE].str;
std::transform(profile.begin(), profile.end(), profile.begin(), ::tolower);
if(profile != "" && profile != "default"){
if(profile != "" && profile != "Default"){
sprintf(buf,"profiles/%s/%s",profile.c_str(),filename.c_str());
if(fileOK(buf,true))
return buf;
@@ -580,9 +566,8 @@ string WResourceManager::avatarFile(const string filename, const string specific
//Check the theme folder.
string theme = options[Options::ACTIVE_THEME].str;
std::transform(theme.begin(), theme.end(), theme.begin(), ::tolower);
if(theme != "" && theme != "default"){
if(theme != "" && theme != "Default"){
sprintf(buf,"themes/%s/%s",theme.c_str(),filename.c_str());
if(fileOK(buf,true))
return buf;
@@ -590,9 +575,8 @@ string WResourceManager::avatarFile(const string filename, const string specific
//Failure. Check mode graphics
string mode = options[Options::ACTIVE_MODE].str;
std::transform(mode.begin(), mode.end(), mode.begin(), ::tolower);
if(mode != "" && mode != "defualt"){
if(mode != "" && mode != "Default"){
sprintf(buf,"modes/%s/graphics/%s",mode.c_str(),filename.c_str());
if(fileOK(buf,true))
return buf;
@@ -615,9 +599,12 @@ string WResourceManager::avatarFile(const string filename, const string specific
string WResourceManager::cardFile(const string filename, const string specific){
JFileSystem* fs = JFileSystem::GetInstance();
//PUT Back the following when we have an actual usage for it (theme, or whatever)
//Right now I'm removing this for performance
/*
char buf[512];
//Check the specific location, if any.
if(specific != ""){
sprintf(buf,"%s/sets/%s",specific.c_str(),filename.c_str());
@@ -627,9 +614,8 @@ string WResourceManager::cardFile(const string filename, const string specific){
//Check the theme folder.
string theme = options[Options::ACTIVE_THEME].str;
std::transform(theme.begin(), theme.end(), theme.begin(), ::tolower);
if(theme != "" && theme != "default"){
if(theme != "" && theme != "Default"){
sprintf(buf,"themes/%s/sets/%s",theme.c_str(),filename.c_str());
if(fileOK(buf,true))
return buf;
@@ -637,14 +623,14 @@ string WResourceManager::cardFile(const string filename, const string specific){
//Failure. Check mode
string mode = options[Options::ACTIVE_MODE].str;
std::transform(mode.begin(), mode.end(), mode.begin(), ::tolower);
if(mode != "" && mode != "defualt"){
if(mode != "" && mode != "Default"){
sprintf(buf,"modes/%s/sets/%s",mode.c_str(),filename.c_str());
if(fileOK(buf,true))
if(fileOK(buf,true))
return buf;
}
*/
//Failure. Check sets
char defdir[512];
sprintf(defdir,"sets/%s",filename.c_str());
@@ -687,9 +673,8 @@ string WResourceManager::musicFile(const string filename, const string specific)
//Check the theme folder.
string theme = options[Options::ACTIVE_THEME].str;
std::transform(theme.begin(), theme.end(), theme.begin(), ::tolower);
if(theme != "" && theme != "default"){
if(theme != "" && theme != "Default"){
sprintf(buf,"themes/%s/sound/%s",theme.c_str(),filename.c_str());
if(fileOK(buf,true))
return buf;
@@ -697,9 +682,8 @@ string WResourceManager::musicFile(const string filename, const string specific)
//Failure. Check mode
string mode = options[Options::ACTIVE_MODE].str;
std::transform(mode.begin(), mode.end(), mode.begin(), ::tolower);
if(mode != "" && mode != "defualt"){
if(mode != "" && mode != "Default"){
sprintf(buf,"modes/%s/sound/%s",mode.c_str(),filename.c_str());
if(fileOK(buf,true))
return buf;
@@ -727,9 +711,8 @@ string WResourceManager::sfxFile(const string filename, const string specific){
//Check the theme folder.
string theme = options[Options::ACTIVE_THEME].str;
std::transform(theme.begin(), theme.end(), theme.begin(), ::tolower);
if(theme != "" && theme != "default"){
if(theme != "" && theme != "Default"){
sprintf(buf,"themes/%s/sound/sfx/%s",theme.c_str(),filename.c_str());
if(fileOK(buf,true))
return buf;
@@ -737,8 +720,7 @@ string WResourceManager::sfxFile(const string filename, const string specific){
//Failure. Check mode
string mode = options[Options::ACTIVE_MODE].str;
std::transform(mode.begin(), mode.end(), mode.begin(), ::tolower);
if(mode != "" && mode != "defualt"){
if(mode != "" && mode != "Default"){
sprintf(buf,"modes/%s/sound/sfx/%s",mode.c_str(),filename.c_str());
if(fileOK(buf,true))
return buf;
@@ -793,40 +775,20 @@ int WResourceManager::LoadJLBFont(const string &fontName, int height){
else
return itr->second;
}
void WResourceManager::CacheForState(int state){
#if (defined WIN32 || defined LINUX) && !defined DEBUG_CACHE
textureWCache.Resize(HUGE_CACHE_LIMIT,HUGE_CACHE_ITEMS);
return;
#else
switch(state){
//Default is not to change cache sizes.
case GAME_STATE_MENU:
case GAME_STATE_OPTIONS:
break;
//Duels use a smaller cache, so there's more room for game stuff.
case GAME_STATE_DUEL:
if (options[Options::CACHESIZE].number)
textureWCache.Resize(LARGE_CACHE_LIMIT,LARGE_CACHE_ITEMS);
else
textureWCache.Resize(SMALL_CACHE_LIMIT,SMALL_CACHE_ITEMS);
sampleWCache.Resize(SMALL_CACHE_LIMIT,MAX_CACHED_SAMPLES);
break;
//Deck editor and shop are entirely cache safe, so give it near infinite resources.
case GAME_STATE_SHOP:
case GAME_STATE_DECK_VIEWER:
textureWCache.Resize(HUGE_CACHE_LIMIT,HUGE_CACHE_ITEMS);
break;
//Anything unknown, use large cache.
default:
textureWCache.Resize(LARGE_CACHE_LIMIT,LARGE_CACHE_ITEMS);
break;
}
//Switching game states clears the cache on PSP.
ClearUnlocked();
void WResourceManager::autoResize(){
#if defined WIN32 || defined LINUX
textureWCache.Resize(HUGE_CACHE_LIMIT,MAX_CACHE_OBJECTS);
#else
unsigned int ram = ramAvailable();
unsigned int myNewSize = ram - OPERATIONAL_SIZE + textureWCache.totalSize;
if (myNewSize < TEXTURES_CACHE_MINSIZE){
fprintf(stderr, "Error, Not enough RAM for Cache: %i - total Ram: %i\n", myNewSize, ram);
}
textureWCache.Resize(myNewSize,MAX_CACHE_OBJECTS);
#endif
return;
}
JMusic * WResourceManager::ssLoadMusic(const char *fileName){
@@ -993,17 +955,6 @@ void WCache<cacheItem, cacheActual>::Resize(unsigned long size, int items){
maxCached = items;
}
template <class cacheItem, class cacheActual>
cacheItem* WCache<cacheItem, cacheActual>::Recycle(){
typename vector<cacheItem*>::iterator it = garbage.begin();
if(it == garbage.end())
return NULL;
cacheItem * item = (*it);
garbage.erase(it);
return item;
}
template <class cacheItem, class cacheActual>
cacheItem* WCache<cacheItem, cacheActual>::AttemptNew(string filename, int submode){
@@ -1012,70 +963,49 @@ cacheItem* WCache<cacheItem, cacheActual>::AttemptNew(string filename, int submo
return NULL;
}
cacheItem* item = NULL;
item = Recycle();
//There was nothing to recycle. Make absolutely certain we have an item.
if(item == NULL){
item = NEW cacheItem;
if(item)
mError = CACHE_ERROR_NONE;
else{
//Try a few times to get an item.
for(int attempt=0;attempt<MAX_CACHE_ATTEMPTS;attempt++){
if(!RemoveOldest() || item)
break;
item = NEW cacheItem;
}
//We /really/ shouldn't get this far.
cacheItem* item = NEW cacheItem;
if(!item) {
//Try a few times to get an item.
for(int attempt=0;attempt<MAX_CACHE_ATTEMPTS;attempt++){
if(!RemoveOldest() || item)
break;
item = NEW cacheItem;
}
//We /really/ shouldn't get this far.
if(!item){
resources.ClearUnlocked();
item = NEW cacheItem;
if(!item){
resources.ClearUnlocked();
item = NEW cacheItem;
if(!item){
//Nothing let us make an item. Failure.
mError = CACHE_ERROR_BAD_ALLOC;
return NULL;
}
//Nothing let us make an item. Failure.
mError = CACHE_ERROR_BAD_ALLOC;
return NULL;
}
}
}
//Attempt to populate item.
mError = CACHE_ERROR_NONE;
for(int attempts = 0; attempts < MAX_CACHE_ATTEMPTS;attempts++)
{
//We use try/catch so any memory alloc'd in Attempt isn't lost.
try{
//If we don't get a good item, remove oldest cache and continue trying.
if(!item->Attempt(filename,submode,mError) || !item->isGood())
if(!item->Attempt(filename,submode,mError) || !item->isGood()) {
//No such file. Fail on first try.
if(mError == CACHE_ERROR_404){
SAFE_DELETE(item);
return NULL;
}
throw std::bad_alloc();
}
}
catch(std::bad_alloc){
RemoveOldest();
}
//No such file. Fail on first try.
if(item && mError == CACHE_ERROR_404){
if(garbage.size() < MAX_CACHE_GARBAGE){
item->Trash();
garbage.push_back(item);
}
else
SAFE_DELETE(item);
return NULL;
}
//Succeeded, so enforce limits and return.
if(item->isGood()){
mError = CACHE_ERROR_NONE;
item->lock();
Cleanup();
item->unlock();
return item;
}
//Succeeded
if(item->isGood())
break;
}
//Still no result, so clear local cache, then try again.
@@ -1089,23 +1019,18 @@ cacheItem* WCache<cacheItem, cacheActual>::AttemptNew(string filename, int submo
//Failed, so clear every cache we've got in prep for the next try.
resources.ClearUnlocked();
}
try{
if(!item->Attempt(filename,submode,mError) || !item->isGood())
throw std::bad_alloc();
}
catch(std::bad_alloc){
//Complete failure. Trash this object and return NULL.
if(item && !item->isGood()){
if(garbage.size() < MAX_CACHE_GARBAGE){
item->Trash();
garbage.push_back(item);
}
else
if(!item->isGood()){
try{
if(!item->Attempt(filename,submode,mError) || !item->isGood())
throw std::bad_alloc();
}
catch(std::bad_alloc){
//Complete failure. Trash this object and return NULL.
if(!item->isGood()){
SAFE_DELETE(item);
mError = CACHE_ERROR_BAD;
return NULL;
mError = CACHE_ERROR_BAD;
return NULL;
}
}
}
}
@@ -1136,15 +1061,19 @@ cacheItem * WCache<cacheItem, cacheActual>::Retrieve(string filename, int style,
//Perform lock or unlock on entry.
if(tc){
if(style == RETRIEVE_LOCK) tc->lock();
else if(style == RETRIEVE_UNLOCK) tc->unlock();
else if(style == RETRIEVE_MANAGE && !tc->isPermanent()) {
//Unlink the managed resource from the cache.
UnlinkCache(tc);
//Post it in managed resources.
managed[makeID(filename,submode)] = tc;
tc->deadbolt();
switch(style){
case RETRIEVE_LOCK: tc->lock(); break;
case RETRIEVE_UNLOCK: tc->unlock(); break;
case RETRIEVE_MANAGE:
if (!tc->isPermanent()) {
//Unlink the managed resource from the cache.
UnlinkCache(tc);
//Post it in managed resources.
managed[makeID(filename,submode)] = tc;
tc->deadbolt();
}
break;
}
}
@@ -1154,10 +1083,8 @@ cacheItem * WCache<cacheItem, cacheActual>::Retrieve(string filename, int style,
tc->hit();
return tc; //Everything fine.
}
else{
//Something went wrong.
RemoveItem(tc);
}
//Something went wrong.
RemoveItem(tc);
}
//Record managed failure. Cache failure is recorded in Get().
@@ -1196,113 +1123,62 @@ cacheItem * WCache<cacheItem, cacheActual>::Get(string id, int style, int submod
//Something is managed.
if(it != managed.end()) {
if(!it->second && style == RETRIEVE_RESOURCE)
return NULL; //A miss.
else
return it->second; //A hit.
return it->second; //A hit.
}
//Failed to find managed resource and won't create one. Record a miss.
else if(style == RETRIEVE_RESOURCE){
if(style == RETRIEVE_RESOURCE){
managed[lookup] = NULL;
return NULL;
}
//Not managed, so look in cache.
if(it == managed.end() && style != RETRIEVE_MANAGE && style != RETRIEVE_RESOURCE ){
if(style != RETRIEVE_MANAGE){
it = cache.find(lookup);
//Well, we've found something...
if(it != cache.end()) {
if(!it->second && (submode & CACHE_EXISTING)){
mError = CACHE_ERROR_404;
return NULL; //A miss.
}
else
return it->second; //A hit.
return it->second; //A hit.
}
}
cacheItem * item = NULL;
if(style != RETRIEVE_MANAGE)
item = cache[lookup]; //We don't know about this one yet.
//Found something.
if(item){
//Item went bad?
if(!item->isGood()){
//If we're allowed, attempt to revive it.
if(!(submode & CACHE_EXISTING))
item->Attempt(id,submode,mError);
//Still bad, so remove it and return NULL
if(submode & CACHE_EXISTING || !item->isGood()){
if(!item->isLocked()){
RemoveItem(item); //Delete it.
mError = CACHE_ERROR_BAD;
}
//Worst case scenerio. Hopefully never happens.... hasn't so far.
else{
item->Nullify(); //We're giving up on anything allocated here.
mError = CACHE_ERROR_LOST; //This is a potential memory leak, but might prevent a crash.
}
return NULL;
}
}
//Alright, everythings fine!
mError = CACHE_ERROR_NONE;
return item;
}
//Didn't exist in cache.
if(submode & CACHE_EXISTING ){
RemoveMiss(lookup);
mError = CACHE_ERROR_NOT_CACHED;
return NULL;
}
else{
//Space in cache, make new texture
item = AttemptNew(id,submode);
//Couldn't make GOOD new item.
if(item && !item->isGood())
{
if(garbage.size() < MAX_CACHE_GARBAGE){
item->Trash();
garbage.push_back(item);
}
else
SAFE_DELETE(item);
}
}
//Space in cache, make new texture
cacheItem * item = AttemptNew(id,submode);
if(style == RETRIEVE_MANAGE){
managed[lookup] = item; //Record hit or miss
if(item)
if(item){
managed[lookup] = item; //Record a hit.
item->deadbolt(); //Make permanent.
}
else{
//Record it, hit or miss.
cache[lookup] = item;
}
//Succeeded in making a new item.
if(item){
unsigned long isize = item->size();
totalSize += isize;
mError = CACHE_ERROR_NONE;
if(style != RETRIEVE_MANAGE){
cacheItems++;
cacheSize += isize;
}
return item;
else if(mError == CACHE_ERROR_404)
managed[lookup] = NULL; //File not found. Record a miss
}
else {
if(item || mError == CACHE_ERROR_404)
cache[lookup] = item;
}
//Failure.
return NULL;
if (!item) return NULL; //Failure
//Succeeded in making a new item.
unsigned long isize = item->size();
totalSize += isize;
mError = CACHE_ERROR_NONE;
if(style != RETRIEVE_MANAGE){
cacheItems++;
cacheSize += isize;
}
return item;
}
template <class cacheItem, class cacheActual>
@@ -1327,7 +1203,7 @@ WCache<cacheItem, cacheActual>::WCache(){
cacheSize = 0;
totalSize = 0;
maxCacheSize = SMALL_CACHE_LIMIT;
maxCacheSize = TEXTURES_CACHE_MINSIZE;
maxCached = MAX_CACHE_OBJECTS;
cacheItems = 0;
@@ -1340,24 +1216,13 @@ WCache<cacheItem, cacheActual>::~WCache(){
//Delete from cache & managed
for(it=cache.begin();it!=cache.end();it++){
if(!it->second)
continue;
SAFE_DELETE(it->second);
}
for(it=managed.begin();it!=managed.end();it++){
if(!it->second)
continue;
SAFE_DELETE(it->second);
}
//Clean up all the garbage
typename vector<cacheItem*>::iterator g;
for(g=garbage.begin();g!=garbage.end();g++){
SAFE_DELETE(*g);
}
}
@@ -1462,24 +1327,17 @@ bool WCache<cacheItem, cacheActual>::Delete(cacheItem * item){
if(maxCached == 0)
item->Nullify();
unsigned long isize = item->size();
totalSize -= isize;
cacheSize -= isize;
unsigned long isize = item->size();
totalSize -= isize;
cacheSize -= isize;
#ifdef DEBUG_CACHE
if(cacheItems == 0)
OutputDebugString("cacheItems out of sync.\n");
if(cacheItems == 0)
OutputDebugString("cacheItems out of sync.\n");
#endif
cacheItems--;
cacheItems--;
if(garbage.size() > MAX_CACHE_GARBAGE)
SAFE_DELETE(item);
else{
item->Trash();
item->lastTime = 0;
item->loadedMode = 0;
garbage.push_back(item);
}
SAFE_DELETE(item);
return true;
}