1

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;
        }
    }
}
4

1 に答える 1

1

オブジェクトの数である としKFontましょうで静的な整数メンバーを作成できます。次に、コンストラクタで増やし、デストラクタで減らします。デストラクタで 0 になると、すべてのインスタンスを解放できます。static int KFontCnt;KFontKFontCntKFontKFontKFont

于 2013-08-29T09:54:46.450 に答える