SDL фон блиттинг замедляет игру

Я прошел через другие вопросы, касающиеся этого, и, похоже, не могу получить ответ, который я ищу. Моя текущая игра работает со скоростью 60 кадров в секунду и занимает 9,5 мс / кадр в режиме отладки (3,8 мс / кадр в режиме выпуска). И все это с игроком, врагами и картой, все на экране, что, кажется, совсем не вызывает падения fps, но когда я перетаскиваю свое изображение размером 1024×768 BG, оно падает до 27-30 FPS и теперь рендерит каждый кадр. на 33 мс / кадр. вот игровой цикл —

while(!quit)
{
if(SDL_PollEvent(&event))
{
quit = Sys->isQuitGame(event);
}

fps->timerReset();
blit_surface(bg,Sys->screen,0,0);//HERE'S THE PROBLEM!
mapItem.RedrawingItems(Sys->screen, Sys->map);
movement = input->Keyboard(key, Sys->screen, player);
enemies.moveAllEnemies(Sys->map, player );
player->move(movement, Sys->map);
player->DrawPlayer(Sys->screen);
enemies.draw(Sys->screen);

SDL_Flip(Sys->screen);
SDL_FillRect(Sys->screen, NULL, SDL_MapRGB( Sys->screen->format, 0xFF, 0xFF, 0xFF ));

renderTime = calculatingFps->get_ticks();
frame++;
if(calculatingFps->get_ticks() > 1000)
{
renderTime -= totalDelay;
totalDelay = 0;
stringstream Afps;
Afps <<"fps: " <<frame/ (calculatingFps->get_ticks() / 1000.f)<<
" ---- RenderTimePerFrame: "<<(float)renderTime / (float)frame<<"/ms";
SDL_WM_SetCaption( Afps.str().c_str(), NULL);
Game::FPS = frame/ (calculatingFps->get_ticks() / 1000.f);
calculatingFps->timerReset();
frame = 0;
renderTime = 0;
}
if(frameRenderedTooFast(fps))
{
totalDelay += (remainingTime(fps));
SDL_Delay(remainingTime(fps));
}
}

Так, что один удар этого img удастся снизить частоту кадров вдвое, я что-то упустил? Кстати, я не думаю, что это SDL_DisplayFormat, у меня уже есть этот код, вот фрагмент кода, который имеет дело с загрузкой IMG —

SDL_Surface* altSDL::load_image(std::string filename)
{
SDL_Surface* loadedImage = NULL;

SDL_Surface* optimizedImage = NULL;

loadedImage = IMG_Load( filename.c_str() );

if( loadedImage != NULL )
{
optimizedImage = SDL_DisplayFormat( loadedImage );
SDL_FreeSurface( loadedImage );
}
else
{
Failure* fail;
fail = Failure::getInstance();
fail->failLog(filename);
}

if( optimizedImage != NULL )
{
Uint32 colorkey = SDL_MapRGB( optimizedImage->format, 0xFF, 0, 0xFF );
SDL_SetColorKey( optimizedImage, SDL_SRCCOLORKEY, colorkey );
}

return optimizedImage;
}

Я хочу сделать это один или несколько раз, но в каждом кадре есть движение персонажа, так что ждать движения, а затем повторять блиты, бесполезно. Должен ли я использовать setVideoMode на отдельной поверхности для фона или что-то? Может кто-нибудь мне помочь?

1

Решение

Проблема может быть в SDL_SetColorKey. Когда вы устанавливаете цветовой ключ, вы назначаете флаги оптимизированного изображения SDL_MapRGB, Вместо этого дайте SDL_MapRGB флаги поверхности дисплея (видимо Sys-> screen). (Установка цветовой клавиши может замедлить процесс блицания, несмотря на флаги.)

    Uint32 colorkey = SDL_MapRGB( video_surface->format, 0xFF, 0, 0xFF );
SDL_SetColorKey( optimizedImage, SDL_SRCCOLORKEY, colorkey );

Похоже, что первый рисунок на экране — это поверхность фона, поэтому я не понимаю, зачем вам вообще нужно устанавливать SDL_SetColorKey, Просто удали это. На той же ноте, звонок SDL_FillRect(Sys->screen,NULL,SDL_MapRGB(Sys->screen->format, 0xFF, 0xFF, 0xFF )) также излишне, если фоновая поверхность покрывает весь экран.

1

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

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