В то время как цикл вызывает отставание для SDL_Rect и SDL_Textures?

Я делаю игру с использованием 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

Решение

Проблема в том, что вы инициализируете 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 и так должно быть лучше.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]