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

标签 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;

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

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;

关于c - 尝试实现游戏循环以限制最大 fps 时的无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12648368/

相关文章:

c++ - time.h clock() 在我的硬件上坏了吗?

c - C程序无输出

c - 获取 C 循环中代码特定部分的时序

c - 如何在c中显示结构变量的名称?

C 表示一个 UTF-8 多字符

c - 如何将非原子操作转换为原子操作

c - 下面的c程序是如何工作的?

c - 从c中的 token 中获取一些字符串

C - 使用指向指针的指针作为函数中的参数

c - 在 C 中的 IP header 中分配 IP 地址