【问题标题】:SDL background blitting slows gameSDL 背景 blitting 减慢游戏速度
【发布时间】:2013-06-26 21:12:37
【问题描述】:

我已经解决了有关此问题的其他问题,但似乎无法得到我正在寻找的答案。我当前的游戏以 60 fps 的速度运行,在调试模式下需要 9.5 毫秒/帧(在发布模式下为 3.8 毫秒/帧)。这是玩家、敌人和地图都在屏幕上闪烁,这似乎根本不会导致 fps 下降,但是当我对 1024x768 BG 图像进行 blit 时,它会下降到 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 的一个 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;
}

我想偶尔blit一次,但每帧都有角色移动,所以等待移动然后重新blit是没有用的。我是否必须在单独的表面上使用 setVideoMode 作为背景或其他东西?谁能帮帮我?

【问题讨论】:

  • colorkey 成功了吗?我有点好奇。
  • 是的。抱歉,我在回答回复中留下了一条评论,表示感谢他,但在这里没有提及。基本上为什么要为覆盖整个屏幕的背景添加透明度,这只是对 CPU 的巨大浪费。

标签: c++ background sdl frame-rate blit


【解决方案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-&gt;screen,NULL,SDL_MapRGB(Sys-&gt;screen-&gt;format, 0xFF, 0xFF, 0xFF )) 也是多余的。

【讨论】:

  • 天哪,谢谢!!!我已经处理了3天了!你写了一个包装来节省你的时间,这样你就不必做很长的路,有时会忘记不是所有的事情都应该经过它。我知道我错过了什么!再次感谢您!
猜你喜欢
  • 2012-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多