C++ C++;使用SDL_TTF时,程序内存使用量不断增加
我正在使用SDL库编写一个简单游戏的代码。关于这一点,我有两个问题:C++ C++;使用SDL_TTF时,程序内存使用量不断增加,c++,xcode,memory-leaks,sdl-2,sdl-ttf,C++,Xcode,Memory Leaks,Sdl 2,Sdl Ttf,我正在使用SDL库编写一个简单游戏的代码。关于这一点,我有两个问题: 如果我不设置断点,让程序自己运行,内存使用率就会很高(与开始时相比大约是20-30倍)。但是,如果我停止循环(游戏的主循环)并自己单击,那么在单击大约100次之后,内存使用量保持不变(?)。为什么? 所以我决定用仪器来分析原因,因为我认为在循环中我可以添加新元素而不破坏它。每次我在Instrument中点击record时,应用程序都会持续5秒钟,然后会在出现崩溃报告时关闭(应用程序在xcode中运行良好,内存充足) 线程0崩溃
SDL_RenderClear( gRenderer );
for (int i = 0; i < imageVector.size(); i++) {
imageVector[i]->render();
}
在长时间尝试禁用/启用代码以查找发生了什么之后,我仍然不知道出了什么问题
这是我当前的循环:
while (true) {
textVector[0]->setInput(system->output());
renderImage();
renderText();
SDL_RenderPresent( gRenderer );
}
它的一些代码:
void textTexture::setInput(std::string newText) {
gText = newText;
}
void GUI::renderImage() {
SDL_RenderClear( gRenderer );
for (int i = 0; i < imageVector.size(); i++) {
imageVector[i]->render();
}
}
void GUI::renderText() {
for (int i = 0; i < textVector.size(); i++) {
textVector[i]->render();
}
}
void textTexture::render() {
//set rendering space and render to screen
SDL_Rect temp = {x, y, width, height};
//recreate the texture
createTextureFromRenderedText(gText);
//render to the screen
SDL_RenderCopy(gRenderer, texture, NULL, &temp);
}
void textTexture::createTextureFromRenderedText(std::string text) {
if (text != "") {
SDL_Surface* textSurface = TTF_RenderText_Blended_Wrapped(gFont, text.c_str(), textColor, 600);
if( textSurface == NULL )
{
printf( "Unable to render text surface! SDL_ttf Error: %s\n", TTF_GetError() );
}
else
{
//Create texture from surface pixels
texture = SDL_CreateTextureFromSurface( gRenderer, textSurface );
if( texture == NULL )
{
printf( "Unable to create texture from rendered text! SDL Error: %s\n", SDL_GetError() );
}
else
{
//Get image dimensions
width = textSurface->w;
height = textSurface->h;
}
//Get rid of old surface
SDL_FreeSurface( textSurface );
}
}
}
void textTextTexture::setInput(std::string newText){
gText=新文本;
}
void GUI::renderImage(){
SDL_RenderClear(gRenderer);
对于(int i=0;irender();
}
}
void GUI::renderText(){
对于(int i=0;irender();
}
}
void textTexture::render(){
//设置渲染空间并渲染到屏幕
SDL_Rect temp={x,y,宽度,高度};
//重新创建纹理
createTextureFromRenderedText(gText);
//渲染到屏幕上
SDL_渲染副本(渲染器、纹理、空值和临时值);
}
void textTextTexture::createTextureFromRenderedText(标准::字符串文本){
如果(文本!=“”){
SDL_Surface*textSurface=TTF_RenderText_Blended_Wrapped(gFont,text.c_str(),textColor,600);
if(textSurface==NULL)
{
printf(“无法呈现文本表面!SDL_ttf错误:%s\n”,ttf_GetError());
}
其他的
{
//从表面像素创建纹理
纹理=SDL_CreateTextureFromSurface(gRenderer,textSurface);
如果(纹理==NULL)
{
printf(“无法从渲染文本创建纹理!SDL错误:%s\n”,SDL_GetError());
}
其他的
{
//获取图像尺寸
宽度=文本表面->w;
高度=文本表面->h;
}
//去除旧表面
SDL_自由曲面(textSurface);
}
}
}
找到问题所在。我复制lazyfoo的风格并尝试在我的中实现,因此当我渲染新的TextTextTexture时,它实际上会创建新的纹理而不会破坏它。通过使用SDL_DestroyTexture,一切正常
在这里找到了答案:
看来不是XCode泄露了资源,而是你的程序?您应该编辑标题以反映这一点。@JoachimPileborg ok I will:)。谢谢:你需要提供更多的代码。。否则我们帮不了你。@BasvanStein我可以,但因为这是一个非常大的程序,所以我不知道从哪里开始:-?@TreeNguyen你能在GUI::renderImage()第140行和imageTexture::render()第37行发布代码吗。至少这两种方法都是如此。还有,纹理是从哪里来的?
void textTexture::setInput(std::string newText) {
gText = newText;
}
void GUI::renderImage() {
SDL_RenderClear( gRenderer );
for (int i = 0; i < imageVector.size(); i++) {
imageVector[i]->render();
}
}
void GUI::renderText() {
for (int i = 0; i < textVector.size(); i++) {
textVector[i]->render();
}
}
void textTexture::render() {
//set rendering space and render to screen
SDL_Rect temp = {x, y, width, height};
//recreate the texture
createTextureFromRenderedText(gText);
//render to the screen
SDL_RenderCopy(gRenderer, texture, NULL, &temp);
}
void textTexture::createTextureFromRenderedText(std::string text) {
if (text != "") {
SDL_Surface* textSurface = TTF_RenderText_Blended_Wrapped(gFont, text.c_str(), textColor, 600);
if( textSurface == NULL )
{
printf( "Unable to render text surface! SDL_ttf Error: %s\n", TTF_GetError() );
}
else
{
//Create texture from surface pixels
texture = SDL_CreateTextureFromSurface( gRenderer, textSurface );
if( texture == NULL )
{
printf( "Unable to create texture from rendered text! SDL Error: %s\n", SDL_GetError() );
}
else
{
//Get image dimensions
width = textSurface->w;
height = textSurface->h;
}
//Get rid of old surface
SDL_FreeSurface( textSurface );
}
}
}