First pass at reducing the overall memory footprint: moved GetFormattedText() out of CardPrimitives and into MTGCard. The idea being, only keep the formatted text around for cards that are actually in use.
Also fixed a subtle memory pooling issue in the RenderCountersBig() routine: if you're in regular card display mode, the idea is that formatted text is only fetched if you flip into alternate render mode. However, in this function, if counters are being drawn, it would fetch the formatted text in order to determine where to draw the counters, EVEN IF the counters count was zero. So it had nothing to draw, but it meanwhile pooled the formatted strings into memory anyway.
This commit is contained in:
@@ -13,7 +13,6 @@ using namespace std;
|
|||||||
class CardPrimitive
|
class CardPrimitive
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
vector<string> ftdText;
|
|
||||||
string lcname;
|
string lcname;
|
||||||
ManaCost manaCost;
|
ManaCost manaCost;
|
||||||
|
|
||||||
@@ -84,7 +83,6 @@ public:
|
|||||||
void getRestrictions();
|
void getRestrictions();
|
||||||
void setOtherRestrictions(string _restriction);
|
void setOtherRestrictions(string _restriction);
|
||||||
void getOtherRestrictions();
|
void getOtherRestrictions();
|
||||||
const vector<string>& formattedText();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ protected:
|
|||||||
int mtgid;
|
int mtgid;
|
||||||
char rarity;
|
char rarity;
|
||||||
char image_name[MTGCARD_NAME_SIZE];
|
char image_name[MTGCARD_NAME_SIZE];
|
||||||
|
vector<string> mFormattedText;
|
||||||
int init();
|
int init();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@@ -33,12 +34,15 @@ public:
|
|||||||
MTGCard();
|
MTGCard();
|
||||||
MTGCard(int set_id);
|
MTGCard(int set_id);
|
||||||
MTGCard(MTGCard * source);
|
MTGCard(MTGCard * source);
|
||||||
|
virtual ~MTGCard();
|
||||||
|
|
||||||
void setMTGId(int id);
|
void setMTGId(int id);
|
||||||
void setRarity(char _rarity);
|
void setRarity(char _rarity);
|
||||||
//void setImageName( char * value);
|
//void setImageName( char * value);
|
||||||
void setPrimitive(CardPrimitive * cp);
|
void setPrimitive(CardPrimitive * cp);
|
||||||
|
|
||||||
|
const vector<string>& GetFormattedText();
|
||||||
|
|
||||||
int getMTGId() const;
|
int getMTGId() const;
|
||||||
int getId() const;
|
int getId() const;
|
||||||
char getRarity() const;
|
char getRarity() const;
|
||||||
|
|||||||
@@ -24,8 +24,9 @@ struct Pos;
|
|||||||
#include <list>
|
#include <list>
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
class MTGCardInstance: public CardPrimitive, public MTGCard, public Damageable {
|
class MTGCardInstance: public CardPrimitive, public MTGCard, public Damageable
|
||||||
protected:
|
{
|
||||||
|
protected:
|
||||||
int untapping;
|
int untapping;
|
||||||
int nb_damages;
|
int nb_damages;
|
||||||
string sample;
|
string sample;
|
||||||
@@ -37,7 +38,7 @@ class MTGCardInstance: public CardPrimitive, public MTGCard, public Damageable {
|
|||||||
int addBlocker(MTGCardInstance * c);
|
int addBlocker(MTGCardInstance * c);
|
||||||
int removeBlocker(MTGCardInstance * c);
|
int removeBlocker(MTGCardInstance * c);
|
||||||
int init();
|
int init();
|
||||||
public:
|
public:
|
||||||
int setAttacker(int value);
|
int setAttacker(int value);
|
||||||
int setDefenser(MTGCardInstance * c);
|
int setDefenser(MTGCardInstance * c);
|
||||||
MTGGameZone * currentZone;
|
MTGGameZone * currentZone;
|
||||||
@@ -158,7 +159,6 @@ class MTGCardInstance: public CardPrimitive, public MTGCard, public Damageable {
|
|||||||
int bury();
|
int bury();
|
||||||
int destroy();
|
int destroy();
|
||||||
|
|
||||||
|
|
||||||
int addToToughness(int value);
|
int addToToughness(int value);
|
||||||
int setToughness(int value);
|
int setToughness(int value);
|
||||||
|
|
||||||
|
|||||||
@@ -1409,7 +1409,6 @@ int AIPlayerBaka::computeActions()
|
|||||||
//am im not interupting my own spell, or the stack contains nothing.
|
//am im not interupting my own spell, or the stack contains nothing.
|
||||||
{
|
{
|
||||||
findingCard = true;
|
findingCard = true;
|
||||||
CardDescriptor cd;
|
|
||||||
ManaCost * icurrentMana = getPotentialMana();
|
ManaCost * icurrentMana = getPotentialMana();
|
||||||
bool ipotential = false;
|
bool ipotential = false;
|
||||||
if (icurrentMana->getConvertedCost())
|
if (icurrentMana->getConvertedCost())
|
||||||
@@ -1454,7 +1453,6 @@ int AIPlayerBaka::computeActions()
|
|||||||
}
|
}
|
||||||
else if(p == this && g->mLayers->stackLayer()->count(0, NOT_RESOLVED) == 0)
|
else if(p == this && g->mLayers->stackLayer()->count(0, NOT_RESOLVED) == 0)
|
||||||
{ //standard actions
|
{ //standard actions
|
||||||
CardDescriptor cd;
|
|
||||||
switch (currentGamePhase)
|
switch (currentGamePhase)
|
||||||
{
|
{
|
||||||
case Constants::MTG_PHASE_FIRSTMAIN:
|
case Constants::MTG_PHASE_FIRSTMAIN:
|
||||||
|
|||||||
@@ -368,7 +368,7 @@ void CardGui::AlternateRender(MTGCard * card, const Pos& pos)
|
|||||||
// Write the description
|
// Write the description
|
||||||
{
|
{
|
||||||
font->SetScale(kWidthScaleFactor * pos.actZ);
|
font->SetScale(kWidthScaleFactor * pos.actZ);
|
||||||
const std::vector<string> txt = card->data->formattedText();
|
const std::vector<string> txt = card->GetFormattedText();
|
||||||
unsigned i = 0;
|
unsigned i = 0;
|
||||||
unsigned h = neofont ? 14 : 11;
|
unsigned h = neofont ? 14 : 11;
|
||||||
for (std::vector<string>::const_iterator it = txt.begin(); it != txt.end(); ++it, ++i)
|
for (std::vector<string>::const_iterator it = txt.begin(); it != txt.end(); ++it, ++i)
|
||||||
@@ -577,7 +577,7 @@ void CardGui::TinyCropRender(MTGCard * card, const Pos& pos, JQuad * quad)
|
|||||||
renderer->RenderQuad(q.get(), x, pos.actY, pos.actT, scale, scale);
|
renderer->RenderQuad(q.get(), x, pos.actY, pos.actT, scale, scale);
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::vector<string> txt = card->data->formattedText();
|
const std::vector<string> txt = card->GetFormattedText();
|
||||||
size_t nbTextLines = txt.size();
|
size_t nbTextLines = txt.size();
|
||||||
|
|
||||||
//Render the image on top of that
|
//Render the image on top of that
|
||||||
@@ -785,12 +785,12 @@ void CardGui::RenderBig(MTGCard* card, const Pos& pos)
|
|||||||
void CardGui::RenderCountersBig(const Pos& pos)
|
void CardGui::RenderCountersBig(const Pos& pos)
|
||||||
{
|
{
|
||||||
// Write Named Counters
|
// Write Named Counters
|
||||||
if (card->counters)
|
if (card->counters && card->counters->mCount > 0)
|
||||||
{
|
{
|
||||||
WFont * font = WResourceManager::Instance()->GetWFont(Fonts::MAGIC_FONT);
|
WFont * font = WResourceManager::Instance()->GetWFont(Fonts::MAGIC_FONT);
|
||||||
font->SetColor(ARGB((int)pos.actA, 0, 0, 0));
|
font->SetColor(ARGB((int)pos.actA, 0, 0, 0));
|
||||||
font->SetScale(kWidthScaleFactor * pos.actZ);
|
font->SetScale(kWidthScaleFactor * pos.actZ);
|
||||||
std::vector<string> txt = card->formattedText();
|
std::vector<string> txt = card->GetFormattedText();
|
||||||
unsigned i = txt.size() + 1;
|
unsigned i = txt.size() + 1;
|
||||||
Counter * c = NULL;
|
Counter * c = NULL;
|
||||||
for (int t = 0; t < card->counters->mCount; t++, i++)
|
for (int t = 0; t < card->counters->mCount; t++, i++)
|
||||||
|
|||||||
@@ -61,23 +61,6 @@ int CardPrimitive::init()
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
const vector<string>& CardPrimitive::formattedText()
|
|
||||||
{
|
|
||||||
if (ftdText.empty())
|
|
||||||
{
|
|
||||||
std::string s = text;
|
|
||||||
std::string::size_type found = s.find_first_of("{}");
|
|
||||||
while (found != string::npos)
|
|
||||||
{
|
|
||||||
s[found] = '/';
|
|
||||||
found = s.find_first_of("{}", found + 1);
|
|
||||||
}
|
|
||||||
WFont * mFont = WResourceManager::Instance()->GetWFont(Fonts::MAGIC_FONT);
|
|
||||||
mFont->FormatText(s, ftdText);
|
|
||||||
}
|
|
||||||
return ftdText;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CardPrimitive::isCreature()
|
bool CardPrimitive::isCreature()
|
||||||
{
|
{
|
||||||
return hasSubtype(Subtypes::TYPE_CREATURE);
|
return hasSubtype(Subtypes::TYPE_CREATURE);
|
||||||
|
|||||||
@@ -251,10 +251,11 @@ void GameApp::Create()
|
|||||||
JSoundSystem::GetInstance()->SetSfxVolume(options[Options::SFXVOLUME].number);
|
JSoundSystem::GetInstance()->SetSfxVolume(options[Options::SFXVOLUME].number);
|
||||||
JSoundSystem::GetInstance()->SetMusicVolume(options[Options::MUSICVOLUME].number);
|
JSoundSystem::GetInstance()->SetMusicVolume(options[Options::MUSICVOLUME].number);
|
||||||
|
|
||||||
|
DebugTrace("size of MTGCardInstance: " << sizeof(MTGCardInstance));
|
||||||
DebugTrace("size of MTGCard: "<< sizeof(MTGCard));
|
DebugTrace("size of MTGCard: "<< sizeof(MTGCard));
|
||||||
DebugTrace("size of CardPrimitive: "<< sizeof(CardPrimitive));
|
DebugTrace("size of CardPrimitive: "<< sizeof(CardPrimitive));
|
||||||
DebugTrace("size of ExtraCost: " << sizeof(ExtraCost));
|
DebugTrace("size of ExtraCost: " << sizeof(ExtraCost));
|
||||||
DebugTrace("Size of ManaCost: " << sizeof(ManaCost));
|
DebugTrace("size of ManaCost: " << sizeof(ManaCost));
|
||||||
|
|
||||||
LOG("Game Creation Done.");
|
LOG("Game Creation Done.");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,9 +23,9 @@ MTGCard::MTGCard(int set_id)
|
|||||||
init();
|
init();
|
||||||
setId = set_id;
|
setId = set_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
MTGCard::MTGCard(MTGCard * source)
|
MTGCard::MTGCard(MTGCard * source)
|
||||||
{
|
{
|
||||||
|
|
||||||
strcpy(image_name, source->image_name);
|
strcpy(image_name, source->image_name);
|
||||||
rarity = source->rarity;
|
rarity = source->rarity;
|
||||||
mtgid = source->mtgid;
|
mtgid = source->mtgid;
|
||||||
@@ -33,6 +33,10 @@ MTGCard::MTGCard(MTGCard * source)
|
|||||||
data = source->data;
|
data = source->data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MTGCard::~MTGCard()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
int MTGCard::init()
|
int MTGCard::init()
|
||||||
{
|
{
|
||||||
setId = 0;
|
setId = 0;
|
||||||
@@ -82,3 +86,23 @@ void MTGCard::setPrimitive(CardPrimitive * cp)
|
|||||||
{
|
{
|
||||||
data = cp;
|
data = cp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const vector<string>& MTGCard::GetFormattedText()
|
||||||
|
{
|
||||||
|
if (mFormattedText.empty())
|
||||||
|
{
|
||||||
|
if (data != NULL)
|
||||||
|
{
|
||||||
|
std::string s = data->text;
|
||||||
|
std::string::size_type found = s.find_first_of("{}");
|
||||||
|
while (found != string::npos)
|
||||||
|
{
|
||||||
|
s[found] = '/';
|
||||||
|
found = s.find_first_of("{}", found + 1);
|
||||||
|
}
|
||||||
|
WFont * mFont = WResourceManager::Instance()->GetWFont(Fonts::MAGIC_FONT);
|
||||||
|
mFont->FormatText(s, mFormattedText);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return mFormattedText;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user