实现这一点的更好/内存效率更高的方法是什么

时间:2013-06-18 12:39:18

标签: c++ resource-management

假设我有一个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

1 个答案:

答案 0 :(得分:1)

有两种设计模式可以提供帮助:FactoryFlyWeight

通常,您的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上阅读一个小的特有部分,我们这里的情况是一个堕落的情况,其中没有地方性部分,因此你不必将对象拆分为普通/地方性地块。