SDL FPS 输入延迟

3
我在我的游乐场项目中使用SDL,但我有点担心我的PC表现——它太高了或者我只是胡思乱想。问题是,当我改变某个精灵的坐标时,比如说按下键盘上的某个键时,将其移动2px,精灵会移动得太快了。对于速度为1px也是同样的情况。
通常(在SFML中),我会通过以下方式更改速度:1.f / App->GetTimeSinceLastFrame(),这运作得非常完美!但现在我想要使用SDL。我不能选择延迟,因为在不同的机器上它们不会相同(这肯定是一种非常丑陋的方法),或者浮点值转换会因为以下原因而无法实现。
lastTicks = SDL_GetTicks()然后使用1.f / (float) SDL_GetTicks() - lastTicks()就做得很糟糕——差异总是。所以要么我错了,要么两帧之间的时间太短,以至于被舍入为0
有人能给我一些建议应该怎么办吗? 注意:将SDL更改为xxx不是一个好建议:)

SDL_GetTicks 只有毫秒级的分辨率,因此对于高帧率来说,差异将大多数情况下为零(因此在某种意义上是四舍五入的,但应该会积累并偶尔变成一)。确保只使用一个调用,因此 cur=get();diff=cur-last;last=cur;。更高分辨率的计时方法也可能会有所帮助。 - jozxyqk
1个回答

1

超过60帧每秒(显示器刷新率)没有意义。你只是浪费CPU时间。如果你的游戏运行得太快,调用SDL_Delay

    int delay=1000/maxFPS-SDL_GetTicks()+lastTicks;

    if(delay>0)
        SDL_Delay(delay);

3
补充答案:请注意在主循环延迟后检查输入/事件。垂直同步的行为不同,但我对某些3D应用程序,特别是游戏中的10-30毫秒鼠标移动延迟同样感到沮丧。 - jozxyqk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接