我明白为什么会这样做,但我真的不知道如何防止这种情况。所以场景是,每一帧我都按照一定的预定像素移动汽车。当我使用慢速或更快的计算机时会发生什么......好吧,我每秒钟获得的帧越来越少,因此汽车移动得更慢或更快。我想知道如何防止这种情况。
我怀疑使用任何库都会遇到同样的问题......这是我第一次做这样的实时工作。
答案 0 :(得分:12)
我怀疑你当前的代码看起来像这样
// to be called every frame
void OnEveryFrame()
{
MoveCar();
DrawCarToScreen();
}
但它应该是这样的:
// to be called - for example - 50 times per second:
void OnEveryTimerEvent()
{
MoveCar();
}
// to be called every frame
void OnEveryFrame()
{
LockTimerEvents();
DrawCarToScreen();
UnlockAndProcessOutstandingTimerEvents();
}
当然,你必须设置一个相应的计时器事件。
答案 1 :(得分:10)
根据计时器移动汽车而不是帧速率。即汽车模型应独立于显示表示。
答案 2 :(得分:3)
您可以使用精确的计时器和矢量数学来解决这个问题。
因此,为了论证,我们建议您可以在任何时间点调用您的绘图代码,例如间隔1秒或间隔3秒或间隔0.02秒。
将汽车移动速度设为每秒40像素。
因此,它应该移动的像素数是(TIME_NOW - LAST_FRAME_TIME)* 40px。
答案 3 :(得分:2)
运动应该受到“实际”时间延迟的约束,即你的汽车将以每个时间片x像素的速度移动。
答案 4 :(得分:2)
读取实时时钟,并将车辆移动适当的时间间隔。如果计算机速度太慢,这可能看起来有些“生涩”,但会使车速与CPU速度无关。
答案 5 :(得分:2)
您需要将帧速率限制为每秒X帧(最常见的是60 FPS)。这是大多数多媒体框架中的常见功能,包括SFML。对于SFML,我会查看Window / RenderWindow方法SetFramerateLimit(unsigned int Limit)。
答案 6 :(得分:1)
您需要fix your timestep。基本上,您移动汽车的每一帧都会根据自上次更新呼叫后实际经过的时间而变化。这样,无论帧速率如何,都可以获得正确的速度。
答案 7 :(得分:0)
在移动汽车和图纸之前,您必须节省时间 所有计算结束后节省时间 按Npixels /秒移动您的车