2013-06-18 1 views
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에는 다른 글꼴을 사용하는 기능이 필요합니다. 이와 같은 일을하는 데 더 효율적이고 메모리 효율적인 방법은 무엇입니까? 제한된 수의 글꼴을 사용할 수 있나요? (클래스 레이블에 정적 글꼴 만들기)?

참고 : FactoryFlyWeight : 나는 OpenGL을

답변

1

도움이 될 수있는 두 가지 디자인 패턴이 있습니다를 사용하여 UI를 제작하고있다.

일반적으로 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에서) 아직 알 수없는 글꼴

  • 게으른 부하
  • 한 많은 메모리 풋 프린트를 줄이기 위해 Factorystd::weak_ptr 참조를 유지 :

    주제에 많은 변화가있다

  • 메모리에 여러 복사본으로 끝날 수 있으므로 전혀 참조하지 않습니다 (잠재적으로 낭비입니다).

ptimize 큰 공통 공유 부분을 가진 객체의 소비하지만 FlyWeight에서 읽고 싶을 수도있는 작은 고유 부분, 여기에 우리는 고유 한 부분이 없으므로 퇴화시킬 필요가없는 퇴보 사례가 있습니다. 공통/고유 한 소포.

+0

'std :: map _fonts'이 처리하는 것은 무엇입니까? 내가 그들을 사용하지 않기 때문에 죄송합니다 귀하의 예제 코드에 혼란스러워. 그 두 개의 매개 변수를 설명해 주시겠습니까? – mr5

+0

@ mr5 : "글꼴 이름"-> "글꼴 내용"맵입니다. 서신을 어딘가에 보관해야합니다. 이렇게하면 글꼴 이름을 물어 보면 교환 된 'SharedFontPtr'을 얻을 수 있습니다. –

+0

'_fonts '즉, 검색하고 넣는 것을 어떻게 조작합니까? 더 많은 샘플 코드를 제공 할 수 있습니까? 'std :: map'에있는 멤버에 접근하는 방법을 아직도 모르므로 – mr5