在计时器类中设置速度系数

Setting speed factor in a timer class?

本文关键字:速度 设置 计时器      更新时间:2023-10-16

我有以下计时器类:

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帧的速度运行的程序来说,我的游戏运行得太慢了,而在不使用无帧移动的情况下,相同的测试代码运行得很流畅,所以我的代码肯定有问题。

有什么帮助吗?

如果delta应该是帧数,它不应该被计算为吗

delta = (curr - prev) * (factor / 1000.f);

我真的不明白你想用代码做什么。尤其是在我看来,delta = (curr - prev) * (1000.f / factor);这条线没有意义。

如果我理解正确,您将尝试计算自上次更新以来经过了多少时间,并将其转换为每帧毫秒。你用的是什么单位?

我不知道SDL_GetTicks();返回了什么。这是返回的处理器或实际时钟信号的数量吗?如果它返回真实的时钟信号,(curr-prev)部分通常为零,因为您必须在每帧进行多次更新才能正常工作。

如果它没有返回真实的时钟信号,为什么要乘以1000f。这个因素是从哪里来的?

对于这样的代码,处理舍入错误通常是非常重要的,所以我猜你的问题就在这个领域。虽然没有额外的信息,我无法告诉你实际的问题可能是什么。