Предположим, у меня есть 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
Есть две модели проектирования, которые могут быть полезны: 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
здесь мы имеем дело с вырожденным случаем, когда нет эндемичной части, и, таким образом, вам не нужно разбивать объект на общие / эндемичные участки.
Других решений пока нет …