我有以下计时器类:
class Timer
{
private:
unsigned int curr,prev;
float factor;
float delta;
public:
Timer(float FrameLockFactor)
{
factor = FrameLockFactor;
}
~Timer()
{
}
void Update()
{
curr = SDL_GetTicks();
delta = (curr - prev) * (1000.f / factor);
prev = curr;
}
float GetDelta()
{
return delta;
}
};
我这样用它:
//Create a timer and lock at 60fps
Timer timer(60.0f);
while()
{
float delta;
float velocity = 4.0f;
timer.Update();
delta = timer.GetDelta();
sprite.SetPosition( sprite.GetVector() + Vector2(0.0,velocity * delta) );
sprite.Draw();
}
但是有一个很大的问题:对于一个应该以每秒60帧的速度运行的程序,我的游戏运行速度太慢,并且当不使用帧独立运动时,相同的测试代码运行平稳,所以我的问题一定有问题代码。
任何帮助?
答案 0 :(得分:1)
如果delta
应该是帧数,则不应将其计算为
delta = (curr - prev) * (factor / 1000.f);
答案 1 :(得分:0)
我真的不知道你要用你的代码做什么。特别是delta = (curr - prev) * (1000.f / factor);
这条线在我看来没有意义。
如果我理解正确的话,你试图计算自上次更新以来已经过了多少时间并将其转换为每帧毫秒数。你在用什么单位?
我不知道SDL_GetTicks();
返回了什么。这是返回的处理器或实时时钟滴答数吗?如果返回真正的时钟滴答,(curr-prev)
部分通常为零,因为每帧必须进行多次更新才能生效。
如果它没有返回真正的时钟滴答,为什么你乘以1000f
。这个因素来自哪里?
使用这样的代码,处理舍入错误通常非常重要,所以我猜你的问题出在这个区域的某个地方。虽然没有额外的信息,但我无法确定你的实际问题是什么。