【问题标题】:While loop causing lag for SDL_Rect and SDL_Textures?虽然循环导致 SDL_Rect 和 SDL_Textures 滞后?
【发布时间】:2018-12-11 15:15:01
【问题描述】:

我正在使用 C++ 和 SDL 制作游戏,该游戏是 Space Invaders 类型的游戏。一切都很顺利,直到我在 while 循环中添加了背景图像,这是背景的渲染和初始化代码:

SZ_Background.cpp:

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

ma​​in.cpp - 循环:

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 是背景。

【问题讨论】:

  • 太棒了,将它们从渲染中移除就像一个魅力,非常感谢!太烦人了,我没试过。
  • @Blaze 您应该将您的评论移至答案,以便它可以被接受。
  • @BradAllred 好主意,现在是答案。我最初将其作为评论发布,因为我不确定这是否解决了 OP 遇到的问题。
  • 你真的没有质疑为什么InitRender 是相同的吗?此外,您可能应该使用智能指针,但那是另一回事了。

标签: c++ rendering sdl lag rect


【解决方案1】:

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

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的RAM,以及SDL_Texture的GPU内存)。删除Render中的那些IMG_LoadSDL_CreateTextureFromSurface调用应该会更好。

【讨论】:

    猜你喜欢
    • 2014-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多