gpt4 book ai didi

c++ - 什么是更好/内存效率更高的实现方式

转载 作者:行者123 更新时间:2023-11-28 07:33:38 25 4
gpt4 key购买 nike

假设我有一个如下所示的 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

最佳答案

有两种设计模式可以提供帮助: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类(class)拥有std::shared_ptr<BMFont> (相对轻量级的句柄)而不是完整的字体类。

这个主题有很多变体:

  • 延迟加载未知字体(来自 Factory )
  • 保持std::weak_ptrFactory 中引用, 尽可能减少内存占用
  • 根本不保留引用(尽管可能会造成浪费),因为您最终可能会在内存中保留多个拷贝

要优化具有较大公共(public)共享部分但较小地方性部分的对象的内存消耗,您可能需要阅读 FlyWeight ,我们这里的情况是退化的情况,其中没有地方性部分,因此您不必将对象拆分为公共(public)/地方性包裹。

关于c++ - 什么是更好/内存效率更高的实现方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17169083/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com