我有一个字体类,它将使用sdl将.ttf的字形加载到openGL纹理。该类由每个字形的单独纹理组成,并且显然会连续渲染它们以创建显示的文本。我认为将.ttf继续加载到sdl表面,然后依次使用表面像素数据生成openGL纹理是很昂贵的。因此,对于我的程序,我有一个具有成员的KText
类:static std::vector<Font*> OpenedFonts;
当继承了KText的新项目尝试打开字体时,我会扫描 vector 以查找打开的字形,然后仅返回指向打开的字形的指针,并对该文本的所有实例使用已制成的纹理(大小/名称/颜色)。
该代码是
bool KText::LoadFont() {
_Font = CheckOpenedFonts(); //_Font is KFont* pointer
if(_Font == NULL) {
_Font = new KFont;
_Font->LoadFont();
}
if(_Font == NULL) return false;
return true;
}
显然,并不是每次我都会打开一个新字体,所以在我的析构函数中,我不想简单地使用
delete _Font
。出于以下两个原因:有另一个KText对象指针指向同一组字形,最好将它们保留在内存中,直到程序终止(如果创建了另一个对象并尝试使用该字体)。有没有办法等到
KFont
的所有实例都离开作用域?谢谢!
解决方案是:
class KText {
private:
static int TextCnt;
public:
KText();
~KText();
};
//Implementation
static int KText::TextCnt = 0;
KText::KText() {
TextCnt++;
}
KText::~KText() {
TextCnt--;
if(TextCnt < 1) {
OpenedFonts* t = FntPnter; //FntPnter is a head pointer to the linked list of fonts
while(t != NULL ) {
FntPnter = t->Next;
delete t;
t = FntPnter;
}
}
}
最佳答案
您可以在KFont
中创建一个静态整数成员,假设static int KFontCnt;
,它是KFont
对象的数量。然后在KFontCnt
构造函数中增加KFont
,在KFont
析构函数中减小。当它在析构函数中达到0时,您可以释放所有KFont
实例。