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

役立つ可能性のある 2 つの設計パターンがあります: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 に答える