Каков лучший / эффективный способ памяти реализовать это

Предположим, у меня есть Font класс, который выглядит так:

const unsigned int MAX_CHAR = 256; //better than dynamic I think?

struct BMchar
{
int x_ofs, y_ofs;
_uint32 x, y;
_uint32 width, height;
_uint32 x_advance;
};

struct BMkerninfo
{
_ushort first, second;
_ushort kerning;
};

class BM_FONT_CALL BMfont
{
public:

BMfont();
~BMfont(); //what will I free?

BMfont_Status Load(const char* fontName);

public:

float scale;
_uint32 tabSize;
_uint32 backTexture;
_uint32 frontTexture;
_uint32 textureSheet;
bool enableMasking;
bool hasBackground;

_uint32 base;
_uint32 lineHeight;
_uint32 pages;
_uint32 scaleW, scaleH;
_uint32 kerninfo_count;

BMkerninfo  *kerninfo; //unused
BMchar chars[MAX_CHAR];
float texCoordBuff[MAX_CHAR * 8];
};

И у меня есть класс Label:

class SWC_DLL SWC_Label
{
public:

SWC_Label ();

public:

void ShowText (const Point& basePoint, int baseW, int baseH);

public:

std::string text;
Point   textCoord;
BMfont  font;
T_Alignment textAlignment;

};

Тогда за все это я беспокоюсь, как вы видите, о BMfont учебный класс использует много ресурсов. Я унаследую класс SWC_Label в класс SWC_Button (Да, кнопка с надписью / текстом на ней).

Теперь я хочу это SWC_Button иметь особенность наличия другого шрифта. Каков лучший и эффективный способ памяти для таких вещей, если я должен установить такие ограничения, как: сделать только определенное количество доступных шрифтов (сделать статические шрифты в метке класса)?

Примечание: я делаю пользовательский интерфейс с использованием OpenGL

0

Решение

Есть две модели проектирования, которые могут быть полезны: Factory а также FlyWeight,

Как правило, ваш SWC_Label класс не должен владеть BMFontнужно только манипулировать им; мой совет будет использовать Factory из шрифтов, которые будут внутренне держать ручку на шрифты, о которых он знает.

Простой пример:

class FontFactory {
public:
typedef std::shared_ptr<BMFont> SharedFontPtr;

SharedFontPtr getFont(std::string const& name) const;

private:
std::map<std::string, SharedFontPtr> _fonts;
}; // class FontFactory

И тогда SWC_Label класс содержит std::shared_ptr<BMFont> (относительно легкая ручка), а не полный класс шрифта.

Есть много вариантов по теме:

  • ленивая загрузка еще неизвестных шрифтов (из Factory)
  • сохраняя std::weak_ptr ссылка в Factory, чтобы максимально уменьшить объем памяти
  • не хранить ссылки вообще (хотя и потенциально расточительно), так как вы можете получить несколько копий в памяти

Чтобы оптимизировать потребление памяти объектами с большой общей разделяемой частью, но небольшой эндемичной частью, о которой вы, возможно, захотите прочитать FlyWeightздесь мы имеем дело с вырожденным случаем, когда нет эндемичной части, и, таким образом, вам не нужно разбивать объект на общие / эндемичные участки.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]