gpt4 book ai didi

c++ - SDL 背景 blitting 减慢游戏速度

转载 作者:太空宇宙 更新时间:2023-11-04 11:52:58 27 4
gpt4 key购买 nike

我已经解决了与此相关的其他问题,但似乎无法得到我正在寻找的答案。我当前的游戏以 60 fps 的速度运行, Debug模式下为 9.5 毫秒/帧( Release模式下为 3.8 毫秒/帧)。这是玩家、敌人和 map 都被 blit 到屏幕上,这似乎根本不会导致 fps 下降,但是当我 blit 我的 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 的一个 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 但每一帧都有角色移动,所以等待移动然后重新 blit 是没有用的。我是否必须在单独的表面上使用 setVideoMode 作为背景或其他东西?谁能帮帮我?

最佳答案

问题可能在 SDL_SetColorKey 中。当您设置 colorkey 时,您将优化图像的标志提供给 SDL_MapRGB。而是给 SDL_MapRGB 显示表面的标志(显然是 Sys->screen )。 (尽管有标志,设置颜色键可能会减慢 blitting 过程。)

    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 )) 如果背景表面覆盖整个区域也是多余的屏幕。

关于c++ - SDL 背景 blitting 减慢游戏速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17330532/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com