В то время как цикл вызывает задержку для SDL_Rect и SDL_Textures? - PullRequest
0 голосов
/ 11 декабря 2018

Я делаю игру, используя 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);
}

main.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 - это фон.

1 Ответ

0 голосов
/ 12 декабря 2018

Проблема в том, что вы инициализируете background_img и background_img_tex каждый раз, когда звоните SZ_Background::Render:

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 и память вашего GPU для SDL_Texture).Удалите эти IMG_Load и SDL_CreateTextureFromSurface вызовы в Render, и это должно быть лучше.

...