所以这个功能:
Texture::Texture(std::string text,TTF_Font * font,int w,int h,int ox,int oy,Uint8 r,Uint8 g,Uint8 b,bool middle)
{
SDL_Color textColor = {r,g,b};
SDL_Surface * textSurface = TTF_RenderText_Solid(font,text.c_str(),textColor);
textSurface = SDL_ConvertSurface(textSurface,sample->format,0);
float surfAspectRatio = textSurface->w / textSurface->h;
float texAspectRatio = w / h;
if(texAspectRatio > surfAspectRatio)//space is to wide so orient to hieight
{
if(middle)
{
texCoords = new HitBox(-h * surfAspectRatio / 2,-h / 2,h * surfAspectRatio,h,ox,oy,0);
}
else
{
texCoords = new HitBox(-.1,-.1,h * surfAspectRatio,h,ox,oy,0);
}
}
else//to tall
{
if(middle)
{
texCoords = new HitBox(-w / 2,-w * (1 / surfAspectRatio) / 2,w,w * (1 / surfAspectRatio),ox,oy,0);
}
else
{
texCoords = new HitBox(-.1,-.1,w,w * (1 / surfAspectRatio),ox,oy,0);
}
}
glEnable(GL_TEXTURE_2D);
texData = NULL;
texData = new Picture();
glGenTextures(1,&texData->texID);
glBindTexture(GL_TEXTURE_2D,texData->texID);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, textSurface->w,
textSurface->h, 0, GL_RGBA, GL_UNSIGNED_BYTE,
textSurface->pixels);
glBindTexture(GL_TEXTURE_2D,NULL);
SDL_FreeSurface(textSurface);
texData->fileName = "text";
}
使用字符串并使用SDL_ttf
呈现文本。然后中间的if else
东西会做一些数学运算来找到新纹理的位置和大小。我不知道问题在这里。然后最后一部分将SDL_Surface转换为开放的GL纹理。
这是纹理类的样子。
class Texture
{
public:
Picture * texData;
HitBox * texCoords;
Texture(int,int,int,int,int,std::string,int,int);
Texture(std::string,TTF_Font *,int,int,int,int,Uint8,Uint8,Uint8,bool);
Texture(const Texture *);
~Texture();
void render_tex();
};
我知道内存泄漏在这个函数中并且与析构函数中的问题没有任何关系,因为当我使用其他构造函数时没有内存泄漏。
内存泄漏大约是3kb我认为虽然这是一个非常粗略的估计。
答案 0 :(得分:2)
SDL_Surface * textSurface = TTF_RenderText_Solid(font,text.c_str(),textColor);
textSurface = SDL_ConvertSurface(textSurface,sample->format,0);
我猜在上面复制的第二行上泄漏是正确的。
从文档SDL_ConvertSurface创建一个传递过的表面。因此,您正在泄漏使用TTF_RenderTextSolid函数创建的SDL_Surface,因为您使用相同的指针来存储第一个和第二个曲面。