使用TTF释放表面并破坏纹理后,SDL2内存使用并未完全减少

如何解决使用TTF释放表面并破坏纹理后,SDL2内存使用并未完全减少

自从我开始使用SDL_TTF以来,这种情况一直在发生,但我无法找到原因。当我创建一个文本对象时,该程序永远处于ram使用量的x位置,直到我做某事为止(那里没有错)。然后,当我添加文本时,程序的ram使用率会增加。那里也没有错。但是,当我决定删除文本时,首先,由于某种原因,程序会从其at处增加使用率,然后按原样减少使用率,但是从没有减少过使用相同文本之前的使用率。如果我一直重复添加和减去文本,则内存只会保持缓慢上升。

这是我的意思:

之前

enter image description here

添加了文本

enter image description here

文字删除

enter image description here

如果照片中不清楚,该程序将以102.8mb的内存使用开始。添加文本后,它会跳到104mb,然后在删除文本后,程序将恢复到103.6mb的使用率。到底是什么在使用额外的兆字节内存?

这是我的Text对象代码,以及在函数调用的位置。

text.h


#ifndef TEXT_H
#define TEXT_H

#include <SDL2/SDL_ttf.h>
#include <SDL2/SDL.h>

#include "events.h"


#include <iostream>
#include <string>
#include <vector>
using std::vector;
using std::string;
using std::cout;
using std::endl;
using std::exception;



class Text
{
    public:
        Events EVENTS;
        Text(void);


        ///Public variables
        static vector <TTF_Font*> fonts;
        const int lowestFontSize = 1;
        const int highestFontSize = 100;
        int fontIndex;

        int textSize;
        SDL_Rect textRect;
        int x;
        int y;
        int initialX,initialY;
        bool setup;

        static int numOfInstances;



        ///Functions
        void Setup(SDL_Renderer *renderer,string txt,int x,int y,int txtSize,SDL_Color Colour = {0,0},bool isBold = false,string fontType = "arial.ttf",bool isWrapped=false,int theWrapWidth=0);

        string Get_Text();
        void Change_Text(SDL_Renderer *renderer,string newText);
        void Draw_Text(SDL_Renderer *renderer);
        void Change_Position(SDL_Renderer *renderer,int xPos,int yPos);
        void Change_Position_And_Text(SDL_Renderer *renderer,int yPos,string newText);

        int Text_Width(int FirstCharIndex,int numOfCharsPastFirstIndex);
        int Text_Height(int FirstCharIndex,int numOfCharsPastFirstIndex);


        void Free_All();


    private:

        ///SDL stuff
        SDL_Texture *textTexture;
        SDL_Surface *textSurface;



        SDL_Color colour;
        SDL_Point point;

        ///text varibales
        string text;
        int textW;
        int textH;
        bool bold;
        bool wrapped;
        int wrappedWidth;




};


#endif

text.cpp

#include "text.h"


int Text::numOfInstances = 0;

vector <TTF_Font*> Text::fonts;


Text::Text()
{
    setup = false;


    textTexture = NULL;
    textSurface = NULL;


}


void Text::Setup(SDL_Renderer *renderer,SDL_Color Colour,bool isBold,string fontType,bool isWrapped,int theWrapWidth )
{
    if (setup == false){


        numOfInstances += 1;


        wrapped = isWrapped;
        wrappedWidth = theWrapWidth;
        text = txt;
        textSize = txtSize;
        bold = isBold;
        colour = Colour;


        textW = 0;
        textH = 0;
        x = xPos;
        y = yPos;
        initialX = x;
        initialY = y;


        fontIndex = textSize-lowestFontSize -1;


        ///One time setups
        if (numOfInstances == 1){
            try{
                TTF_Init();
                //cout << "Initialised ttf" << endl;
            }
            catch (exception &err){
                cout << "Could not initialise ttf for text \"" << text << "\". Error from SDL is: " << TTF_GetError() << ". Error from C++ is: " << err.what() << endl;
            }

            for (int i=lowestFontSize; i <= highestFontSize; i++){
                TTF_Font *currentFont = TTF_OpenFont(fontType.c_str(),i);
                if (!currentFont){
                    cout << "Error with font in text \"" << txt << "\" Error is: " << SDL_GetError() << endl;
                }

                //TTF_SetFontKerning(currentFont,0);


                fonts.push_back(currentFont);
            }

        }



        if (bold == true){
            TTF_SetFontStyle(fonts[fontIndex],TTF_STYLE_BOLD);
        }


        if (!SDL_SetHint( SDL_HINT_RENDER_SCALE_QUALITY,"2" ) ){  ///2 is highest

            cout << "Text rendering quality not enabled " << text << endl;
        }

        if (text != ""){    ///Only create textures if there is text

            if (wrapped == true){
                textSurface = TTF_RenderText_Blended_Wrapped(fonts[fontIndex],text.c_str(),colour,wrappedWidth);     ///Recreate the textures/surfaces
            }
            else{
                textSurface = TTF_RenderText_Blended(fonts[fontIndex],colour);     ///Recreate the textures/surfaces
            }
            if (!textSurface){
                cout << "Unable to create surface of text " << text << " error is: " << SDL_GetError() << endl;
            }
            textTexture = SDL_CreateTextureFromSurface(renderer,textSurface);
            if (!textTexture){
                cout << "Unable to create texture from surface of text " << text << " error is: " << SDL_GetError() << endl;
            }

            SDL_FreeSurface(textSurface);
            textSurface = NULL;

            SDL_QueryTexture(textTexture,NULL,&textW,&textH);
            textRect = {x,y,textW,textH};
        }






        point = {0,0};

        setup = true;





    }



    else{
        //cout << "Trying to setup a text already setup! " << text << endl;
    }


}





void Text::Change_Position_And_Text(SDL_Renderer *renderer,string newText )
{
    if (setup == true){
        text = newText;
        x = xPos;
        y = yPos;
        textRect.x = x;
        textRect.y = y;



        if (textTexture != NULL){
            SDL_DestroyTexture(textTexture);    ///Free memory not going to be used again.
            textTexture = NULL;
        }

        if (wrapped == true){
             textSurface = TTF_RenderText_Blended_Wrapped(fonts[fontIndex],wrappedWidth);     ///Recreate the textures/surfaces
        }
        else{
            textSurface = TTF_RenderText_Blended(fonts[fontIndex],colour);     ///Recreate the textures/surfaces
        }
        if (!textSurface){
            cout << "Unable to create surface of text " << text << " error is: " << SDL_GetError() << endl;
        }
        textTexture = SDL_CreateTextureFromSurface(renderer,textSurface);
        if (!textTexture){
            cout << "Unable to create texture from surface of text " << text << " error is: " << SDL_GetError() << endl;
        }

        SDL_FreeSurface(textSurface);
        textSurface = NULL;

        SDL_QueryTexture(textTexture,&textH);   ///neeed this
        textRect = {x,textH};
    }
}



void Text::Change_Position(SDL_Renderer *renderer,int yPos)
{
    if (setup == true){
        x = xPos;
        y = yPos ;
        textRect.x = xPos;
        textRect.y = yPos;
    }
}





void Text::Change_Text(SDL_Renderer *renderer,string newText)
{
    if (setup == true){
        text = newText;

        if (textTexture != NULL){
            SDL_DestroyTexture(textTexture);    ///Free memory not going to be used again.
            textTexture = NULL;
        }


        if (text != ""){

            if (wrapped == true){
                textSurface = TTF_RenderText_Blended_Wrapped(fonts[fontIndex],&textH);      ///neeed this
            textRect = {x,textH};

        }

    }


}



int Text::Text_Width(int FirstCharIndex,int numOfCharsPastFirstIndex)
{
    int w,h;

    string textSelection = text.substr(FirstCharIndex,numOfCharsPastFirstIndex);

    TTF_SizeText(fonts[fontIndex],textSelection.c_str(),&w,&h);

    return w;
}


int Text::Text_Height(int FirstCharIndex,&h);

    return h;
}



string Text::Get_Text()
{
    if (setup == true){
        return text;
    }
    else{
        return "";
        //cout << "Text not setup when trying to obtain text through Get_Text() function" << endl;
    }
}


void Text::Draw_Text(SDL_Renderer *renderer)
{
    if (setup == true){
        //cout << numOfInstances << endl;

        if (SDL_PointInRect(&EVENTS.mousePos,&textRect)   &&    EVENTS.currentCursor !=  SDL_SYstem_CURSOR_IBEAM){
            EVENTS.Change_Cursor(SDL_SYstem_CURSOR_IBEAM);
        }

        SDL_Rendercopy(renderer,textTexture,&textRect);
    }
    else{
        //cout << "Text not setup when trying to draw it in Draw_Text() function" << endl;
    }

}




void Text::Free_All()
{
    if (setup == true){


        if (textSurface == NULL){
            //cout << "Text surface already free'd" << endl;
        }
        else{
            SDL_FreeSurface(textSurface);
            textSurface = NULL;
            //cout << "Free'd surface \n";
        }

        if (textTexture == NULL){
            //cout << "Could not free memory for text \"" << text << "\". Error from SDL is: " << TTF_GetError() << endl;
        }
        else{
            SDL_DestroyTexture(textTexture);
            textTexture = NULL;
        }





        if (numOfInstances == 1){

            for (int i=0; i <= (highestFontSize-lowestFontSize); i++){
                TTF_CloseFont(fonts[i]);
                //cout << "Closed " << lowestFontSize+i << endl;
            }

            try{
                TTF_Quit();
                //cout << "Quit ttf" << endl;
            }
            catch (exception &err){
                cout << "Could not quit ttf for text \"" << text << "\". Error from SDL is: " << TTF_GetError() << ". Error from C++ is: " << err.what() << endl;
            }
        }


        ///For TTF_Init();
        numOfInstances -= 1;



        //cout << "Free'd " << text << endl;

    }




    else{
        //cout << "Text not setup yet when trying to free!" << endl;
    }



    setup = false;


}


还有我用来显示文本的功能


void Test::Setup(SDL_Renderer *renderer)
{
    if (setup == false){
        setup = true;


        testText.Setup(renderer,"",300,200,30);

    }

}



void Test::Tester(SDL_Renderer *renderer)
{

    Setup(renderer);



    if (EVENTS.currentKey != ""){
        testText.Change_Text(renderer,testText.Get_Text() + EVENTS.currentKey);
    }

    if (EVENTS.pasteText == true){
        testText.Change_Text(renderer,testText.Get_Text() + SDL_GetClipboardText());
    }

    if (EVENTS.backspacepressed == true){
        if (testText.Get_Text() != "") {
            string tempText = (testText.Get_Text());
            tempText.pop_back();
            testText.Change_Text(renderer,tempText);
        }
    }



    testText.Draw_Text(renderer);


}


版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?