尝试实现游戏循环以限制最大fps时的无限循环

时间:2012-09-28 22:53:27

标签: c

我正在尝试实现一个限制游戏执行速度的游戏循环,以便以最高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;

}

如果我删除if条件引用sleep_time> 0它没有卡住,但它没有做我想要的。我尝试用以下内容替换该行:

while( ( next_frame_tick - SDL_GetTicks() ) > 0 ) 
{
}

它既不起作用,所以我没有想法...... 有人可以帮我一点吗?

提前致谢

1 个答案:

答案 0 :(得分:3)

你在这里遇到无符号溢出:

sleep_time = next_frame_tick - SDL_GetTicks();

next_frame_tick< SDL_GetTicks()

你只得到两个无符号值的差异,这不会是负数,而是正数,因为所涉及的所有类型都是无符号的。

在这种情况下,差异的值将是2 32 + next_frame_tick - SDL_GetTicks(),而不仅仅是next_frame_tick - SDL_GetTicks()。< / p>

你应该做的是:

ticks = SDL_GetTicks(); // ticks time is another Uint32
sleep_time = (next_frame_tick >= ticks) ? next_frame_tick - ticks : 0;