sdl を使用して .ttf から openGL テクスチャにグリフをロードするフォント クラスがあります。このクラスはグリフごとに個別のテクスチャで構成されており、それらを連続してレンダリングして、表示されるテキストを作成します。.ttf を sdl サーフェスにロードし続け、次にサーフェス ピクセル データを使用して openGL テクスチャを生成するのはコストがかかると思います。だから、私のプログラムにKText
は、メンバーを持つクラスがあります:static std::vector<Font*> OpenedFonts;
KText を継承した新しいアイテムがフォントを開こうとすると、開いているグリフのベクターをスキャンしてから、開いているグリフへのポインターを返し、そのテキストのすべてのインスタンス (サイズ/名前/色)。
コードは
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
. つまり、次の 2 つの理由からです。同じグリフのセットへの別の 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;
}
}
}