1

これに関する他の質問を調べましたが、探している答えが得られないようです。現在のゲームは 60 fps で実行され、デバッグ モードでは 9.5 ミリ秒/フレーム (リリース モードでは 3.8 ミリ秒/フレーム) かかります。これは、プレイヤー、敵、およびマップがすべて画面にブリットされているため、fps がまったく低下していないように見えますが、1024x768 の 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 の 1 つの blit で fps を半分に下げることができるようにするには、何かが足りないのでしょうか? ところで、私はそれが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;
}

1 回またはたまにだけブリットしたいのですが、すべてのフレームでキャラクターの動きがあるので、動きを待ってから再ブリットしても無駄です。背景などに別のサーフェスで setVideoMode を使用する必要がありますか? 誰でも私を助けることができますか?

4

1 に答える 1