我正在尝试实现一个限制游戏执行速度的游戏循环,使其以最大 fps 速度运行。由于某种原因,我的代码冻结并且没有通过第一次迭代。
代码很短,如下所示:
int main(int argc, char *argv[])
{
short int end = 0;
struct Escenario level;
struct Personaje player;
SDL_Surface* screen = NULL;
Uint32 next_frame_tick = 0;
Uint32 sleep_time = 0;
readLevelFile( &level, &player );
screen = initSDL();
showBackground(level, screen );
while(!end){
erasePlayer(&player, screen);
end = manageKeyboardKeys( &player );
detectCollisionsAndMove( level, &player );
showPlayer(player, screen );
next_frame_tick += SKIP_TICKS;
sleep_time = next_frame_tick - SDL_GetTicks();
if( sleep_time > 0 ) SDL_Delay( sleep_time );
}
freeMemory(nivel);
SDL_Quit();
return 0;
}
如果我删除对 0 的 if 条件引用sleep_time>它不会卡住,但它没有做我想要的。我试图用以下内容替换该行:
while( ( next_frame_tick - SDL_GetTicks() ) > 0 )
{
}
它也没有用,所以我没有想法了...任何人都可以帮我一点吗?
提前致谢
您在这里遇到了未签名的溢出:
sleep_time = next_frame_tick - SDL_GetTicks();
如果next_frame_tick
<SDL_GetTicks()
,这条线上会发生什么?>
你只得到两个无符号值的差值,它不会是负数,而是正数,因为所涉及的所有类型都是无符号的。
在这种情况下,差值将为 232 + next_frame_tick
- SDL_GetTicks()
而不仅仅是 next_frame_tick
- SDL_GetTicks()
。
相反,您应该做的是:
ticks = SDL_GetTicks(); // ticks time is another Uint32
sleep_time = (next_frame_tick >= ticks) ? next_frame_tick - ticks : 0;