c++ - While 循环导致 SDL_Rect 和 SDL_Textures 滞后?

标签 c++ rendering sdl lag rect

我正在使用 C++ 和 SDL 制作游戏,该游戏是太空入侵者类型的游戏。一切都很顺利,直到我在 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为背景

最佳答案

问题是您每次调用 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 调用,它应该会更好。

关于c++ - While 循环导致 SDL_Rect 和 SDL_Textures 滞后?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53727069/

相关文章:

reflection - 路径追踪 : why is there no cosine term when calculating perfect mirror reflection?

unity-game-engine - 视频播放器组件在 hdrp 项目中不起作用

linux - 为什么 SDL 在 Linux (PocketCHIP) 上检测不到我的 iBuffalo 游戏 Controller ?

c++ - 使用 VS 2015 编译的可执行文件比使用 2013 慢得多

c++ - 编译时分派(dispatch) : conditional on valid call

c++ - 从基类方法返回对派生类的引用

algorithm - 射线-三角形相交

c++ - 获取当前正在使用 SDL_Mixer 播放 Mix_Music

c++ - 通过 void 函数检索所有数据

c++ - 在客户的计算机上搜索特定文件