【问题标题】:SDL_FreeSurface is not freeing RAM / RAM OverflowingSDL_FreeSurface 没有释放 RAM / RAM 溢出
【发布时间】:2020-10-07 14:42:25
【问题描述】:

我认为是一个简单的问题,但我在释放表面时遇到问题,因为即使我将 SDL_FreeSurface() 添加到我的代码中,RAM 也会溢出。没有这个功能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();

【问题讨论】:

    标签: c++ overflow sdl ram truetype


    【解决方案1】:

    您正在释放表面,但并未释放基于它创建的纹理。将此行添加到末尾:

    SDL_DestroyTexture(Message);
    

    您还需要关闭字体:

    TTF_CloseFont(arial);
    

    关闭 SDL_TTF 也是一种很好的做法。在 SDL_Quit(); 之前添加这一行

    TTF_Quit();
    

    【讨论】:

    • 谢谢,它可以工作,但纹理不使用 vRAM?还有一个问题 - 为什么只有在我应用此代码时程序才会严重变慢?
    • @FilipK。目前,每次程序循环时,您实际上都是在破坏和重新创建纹理、字体、表面和窗口。这是非常低效的。如果你将这些东西的创建移到你的程序循环之前(例如while(true){),并将这些东西的销毁放在那个循环之后,你可以重新使用你已经制作的东西。
    • @FilipK。我不知道为什么纹理不会存储在 VRAM 中。它们几乎应该总是在 VRAM 中创建,而表面则存储在 RAM 中。也许上述修复会鼓励 SDL 这样做?
    • @FilipK。是什么让您认为纹理数据不在 vram 中?此外,没有人承诺它会在 vram 中。
    猜你喜欢
    • 2017-07-16
    • 2021-11-26
    • 2016-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-20
    • 2021-10-04
    相关资源
    最近更新 更多