C++ SDL_自由曲面未释放RAM/RAM溢出

C++ SDL_自由曲面未释放RAM/RAM溢出,c++,overflow,sdl,ram,truetype,C++,Overflow,Sdl,Ram,Truetype,我认为这是一个简单的问题,但我在释放曲面方面有问题,因为即使我在代码中添加SDL_FreeSurface(),内存也会溢出。没有这个功能,RAM就可以了。在这段代码中还有更多的东西需要“免费”吗? 此代码试图在屏幕顶部生成文本(乒乓球游戏的分数) TTF_Init(); TTF_Font* arial = TTF_OpenFont("arial.ttf", 32); SDL_Color msg_color = { 255,255,255 }; char msg[

我认为这是一个简单的问题,但我在释放曲面方面有问题,因为即使我在代码中添加SDL_FreeSurface(),内存也会溢出。没有这个功能,RAM就可以了。在这段代码中还有更多的东西需要“免费”吗? 此代码试图在屏幕顶部生成文本(乒乓球游戏的分数)

    TTF_Init();
    TTF_Font* arial = TTF_OpenFont("arial.ttf", 32);
    SDL_Color msg_color = { 255,255,255 };

    char msg[128];
    sprintf_s(msg, "%d      %d", g_SCORE_P_LEFT, g_SCORE_P_RIGHT);

    SDL_Surface* messageSurface = TTF_RenderText_Solid(arial, msg, msg_color);
    SDL_Texture* Message = SDL_CreateTextureFromSurface(m_game_window_renderer, messageSurface);

    SDL_Rect msg_rect;
    msg_rect.x = 50;
    msg_rect.y = 50;
    msg_rect.w = 30;
    msg_rect.h = 30;

    SDL_RenderCopy(m_game_window_renderer, Message, NULL, &msg_rect);
    SDL_FreeSurface(messageSurface);
    TTF_Quit();

您将释放曲面,但不会释放基于曲面创建的纹理。将此行添加到末尾:

SDL_DestroyTexture(Message);
您还需要关闭字体:

TTF_CloseFont(arial);
关闭SDL_TTF也是一种很好的做法。在SDL_退出()之前添加此行


谢谢,它可以工作,但纹理不使用vRAM?还有一个问题——为什么只有当我应用这段代码时,程序才会严重减速?@FilipK。目前,每次程序循环时,您实际上都在破坏和重新创建您的纹理、字体、曲面和窗口。这是非常低效的。如果在程序循环之前移动该内容的创建(例如,
while(true){
),然后在循环之后销毁这些东西,你可以重新使用你制作的东西。@FilipK。我不知道为什么纹理不存储在VRAM中。它们几乎应该总是在VRAM中创建,而曲面存储在RAM中。也许上面的修复会鼓励SDL这样做?@FilipK。你为什么认为纹理数据不在v中拉姆?此外,没人答应只在弗拉姆。
TTF_Quit();