Я рассмотрел другие вопросы, касающиеся этого и не могу, похоже, получить ответ, который я ищу. Моя текущая игра работает со скоростью 60 кадров в секунду, принимая 9,5 мс/фрейм в режиме отладки (3,8 мс/кадр в режиме деблокирования). И это с игроком, врагами и картой, все на экране, которая, похоже, не вызывает капли в fps, но когда я blit мое изображение 1024x768 BG, оно падает до 27-30 FPS и теперь отображает каждый кадр при 33 мс/кадр. Heres игровой цикл ---SDL фон blitting slows game
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));
}
}
Так что один Blit этого IMG удается удешевлять кадров в секунду в два раза, я должен быть что-то не хватает? Кстати, я не думаю, что это SDL_DisplayFormat, у меня есть этот код уже, Херес Snippit кода, который имеет дело с 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 на отдельной поверхности для фона или чего-то еще? Может кто-нибудь мне помочь?
Неужели колокей сделал трюк? Я просто доброжелателен. –
да сделал. Извините, я оставил комментарий в ответе ответа, в котором поблагодарил его, но не упомянул об этом здесь. В принципе, добавьте прозрачность в фон, который охватывает весь экран, а просто MASSIVE тратить процессор на выполнение. – DeathB4Allegiance