0

我正在使用 SDL 库为一个简单的游戏编写代码。我对此有两个问题:

  1. 如果我不设置断点并让程序自行运行,那么内存使用率会很高(与开始相比增加了 20-30 倍)。但是,如果我停止循环(游戏的主循环)并自己点击,大约 100 次点击后内存使用量保持不变(?)。为什么?

  2. 所以我决定使用仪器来分析原因,因为我认为在循环中我可能会添加新元素而不破坏它。每次我在 Instrument 中记录时,应用程序都会运行 5 秒并关闭并报告崩溃报告(应用程序运行完美,内存内容,在 xcode 中)

    线程 0 崩溃::调度队列:com.apple.main-thread

    0 org.libsdl.SDL2 0x0000000100f5bea9 0x100ee9000 + 470697

    1 尖峰 10 0x0000000100ea40cc imageTexture::render() + 50 (imageTexture.cpp:37)

    2 尖峰 10 0x0000000100ea2b70 GUI::renderImage() + 40 (GUI.cpp:140)

    3 尖峰 10 0x0000000100ea30b2 GUI::run() + 1258 (GUI.cpp:172)

    4 尖峰 10 0x0000000100ea439e 主 + 36 (main.cpp:15)

    5 libdyld.dylib 0x00007fff8c60f5ad 开始 + 1

这些是我认为可能相关的一些代码:

对于数字 3://imageVector 只是一个包含所有 imageVector 指针的向量

SDL_RenderClear( gRenderer );
for (int i = 0; i < imageVector.size(); i++) {
    imageVector[i]->render();
}

对于 2 号:

//set rendering space and render to screen
SDL_Rect temp = {x, y, width, height};
//render to the screen
SDL_RenderCopy(gRenderer, texture, NULL, &temp);

经过长时间尝试禁用/启用代码以找出发生了什么,我仍然不知道出了什么问题。

这是我当前的循环:

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

1 回答 1

0

找出问题所在。我复制了lazyfoo的风格并尝试在我的中实现,所以当我渲染新的textTexture时,它实际上会创建新的纹理而不破坏它。通过使用 SDL_DestroyTexture,一切正常

在这里找到答案: https ://stackoverflow.com/questions/24938695/memory-leak-sdl-while-using-sdl-createtexturefromsurface

于 2015-11-04T23:15:41.563 回答