使用SDL_TTF时,C ++程序内存使用量不断增加

时间:2015-11-04 06:29:14

标签: c++ xcode memory-leaks sdl-2 sdl-ttf

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

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

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

    Thread 0 Crashed :: Dispatch queue:com.apple.main-thread

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

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

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

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

    4 Spike 10 0x0000000100ea439e main + 36(main.cpp:15)

    5 libdyld.dylib 0x00007fff8c60f5ad start + 1

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

    对于数字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 );
            }
        }
    }
    

1 个答案:

答案 0 :(得分:0)

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

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