假设我有一个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制作UI
答案 0 :(得分:1)
有两种设计模式可以提供帮助: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
上阅读一个小的特有部分,我们这里的情况是一个堕落的情况,其中没有地方性部分,因此你不必将对象拆分为普通/地方性地块。