我理解它为什么会这样做,但我真的不知道如何防止这种情况。所以场景是,每一帧我都会将汽车移动一定的预定义像素。当我使用慢速或更快的计算机时会发生什么......好吧,我每秒获得的帧数更少或更多,因此汽车移动得更慢或更快。我想知道如何防止这种情况发生。
我怀疑使用任何库我都会遇到同样的问题......这是我第一次做这样的实时事情。
我理解它为什么会这样做,但我真的不知道如何防止这种情况。所以场景是,每一帧我都会将汽车移动一定的预定义像素。当我使用慢速或更快的计算机时会发生什么......好吧,我每秒获得的帧数更少或更多,因此汽车移动得更慢或更快。我想知道如何防止这种情况发生。
我怀疑使用任何库我都会遇到同样的问题......这是我第一次做这样的实时事情。
我怀疑您当前的代码看起来像这样
// 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 秒或相隔 3 秒或相隔 0.02 秒。
取汽车移动速度为每秒 40 像素。
因此,它应该移动的像素数是 (TIME_NOW - LAST_FRAME_TIME) * 40px。
移动应该受到“实时”时间延迟的限制,即您的汽车将以每个时间片 x 像素的速度移动。
读取实时时钟,并将汽车移动到经过时间的适当距离。如果计算机太慢,这可能看起来有点“生涩”,但会使汽车速度独立于 CPU 速度。
您需要将帧速率限制为每秒 X 帧(最常见的是 60 FPS)。这是包括 SFML 在内的大多数多媒体框架中的常见特性。对于 SFML,我会研究 Window/RenderWindow 方法SetFramerateLimit(unsigned int Limit)。
你需要修复你的 timestep。基本上,您将汽车移动的每一帧距离都会根据自上次更新调用以来实际经过的时间而变化。这样,无论帧率如何,您都可以获得正确的速度。
您必须在移动汽车和图纸之前节省时间。
在所有计算之后节省时间。
以 Npixels/秒的速度移动你的车