0

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

4

1 回答 1

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我们这里的情况是没有地方性部分的退化情况,因此您不必将对象拆分为常见/地方性包裹。

于 2013-06-18T12:58:20.550 回答