首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >而循环导致SDL_Rect和SDL_Textures滞后?

而循环导致SDL_Rect和SDL_Textures滞后?
EN

Stack Overflow用户
提问于 2018-12-11 15:15:01
回答 1查看 182关注 0票数 1

我正在使用C++和SDL制作一个游戏,这个游戏是一个空间入侵者类型的游戏。直到我在while循环中添加了一个背景图像,这是背景的呈现和init代码,一切都进行得很顺利:

SZ_Background.cpp:

代码语言:javascript
复制
void SZ_Background::Init(SDL_Renderer* pRenderer)
{
    int w, h;

    SDL_GetRendererOutputSize(pRenderer, &w, &h);

    bg_img.x = 0;
    bg_img.y = 0;
    bg_img.h = h;
    bg_img.w = w;

    SDL_Surface* background_img = IMG_Load("content/bg_img.bmp");
    SDL_Texture* background_img_tex = SDL_CreateTextureFromSurface(pRenderer, background_img);

    SDL_RenderCopy(pRenderer, background_img_tex, NULL, &bg_img);
}

void SZ_Background::Render(SDL_Renderer* pRenderer)
{
    int w, h;

    SDL_GetRendererOutputSize(pRenderer, &w, &h);

    bg_img.x = 0;
    bg_img.y = 0;
    bg_img.h = h;
    bg_img.w = w;

    SDL_Surface* background_img = IMG_Load("content/bg_img.bmp");
    SDL_Texture* background_img_tex = SDL_CreateTextureFromSurface(pRenderer, background_img);

    SDL_RenderCopy(pRenderer, background_img_tex, NULL, &bg_img);
}

main.cpp -循环:

代码语言:javascript
复制
if (GameState == 3)
    {
        printf("INFO: Game State: %d - Game Screen Loaded\n", GameState);
        mainEnemies.gameover = false;
        mainBG.Init(game_renderer);
        gOver.Init(game_renderer);
        while (!done)
        {
            aTimer.resetTicksTimer();

            SDL_SetRenderDrawColor(game_renderer, 0, 0, 20, SDL_ALPHA_OPAQUE);
            SDL_RenderClear(game_renderer);

            mainBG.Render(game_renderer);

            gOver.Update(game_renderer);
            gOver.Input();
            gOver.Render(game_renderer);

            SDL_RenderPresent(game_renderer);

            if (gOver.rMenu == true)
            {
                SDL_RenderClear(game_renderer);
                SDL_RenderPresent(game_renderer);
                GameState = 0;
                break;
            }

            if (aTimer.getTicks() < DELTA_TIME)
            {
                SDL_Delay(DELTA_TIME - aTimer.getTicks());
            }
        }
    }

mainBG是背景。

EN

回答 1

Stack Overflow用户

发布于 2018-12-12 07:20:09

问题是每次调用background_imgbackground_img_tex时都要初始化SZ_Background::Render

代码语言:javascript
复制
SDL_Surface* background_img = IMG_Load("content/bg_img.bmp");
SDL_Texture* background_img_tex = SDL_CreateTextureFromSurface(pRenderer,background_img);

这不是必要的,您已经在SZ_Background::Init中初始化了它们,这就是您需要做的全部工作。现在的情况是,它不仅可以通过从磁盘上加载每个帧来减缓程序的速度,而且每次都会泄漏内存(主要是用于SDL_Surface的内存,以及用于SDL_Texture的GPU内存)。删除IMG_LoadSDL_CreateTextureFromSurfaceRender中的调用,这样会更好。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53727069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档