2013-06-26 1 views
1

Я рассмотрел другие вопросы, касающиеся этого и не могу, похоже, получить ответ, который я ищу. Моя текущая игра работает со скоростью 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 на отдельной поверхности для фона или чего-то еще? Может кто-нибудь мне помочь?

+0

Неужели колокей сделал трюк? Я просто доброжелателен. –

+0

да сделал. Извините, я оставил комментарий в ответе ответа, в котором поблагодарил его, но не упомянул об этом здесь. В принципе, добавьте прозрачность в фон, который охватывает весь экран, а просто MASSIVE тратить процессор на выполнение. – DeathB4Allegiance

ответ

1

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

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)) также лишний, если поверхность фона покрывает весь экран.

+0

О, мой бос, спасибо !!! Я занимаюсь этим в течение 3 дней! Вы пишете обертку, чтобы сэкономить время, так что вам не нужно делать это долго и иногда забывать, что не все должно пройти через это. Я знал, что чего-то не хватает! еще раз спасибо! – DeathB4Allegiance

 Смежные вопросы

  • Нет связанных вопросов^_^