修正了更新速度

Fixed Update Speed

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

我一直在互联网上寻找一个简单的问题的简单解决方案。

我把这个函数作为一个线程运行,我想要的非常简单。有很多伪代码可以解释它是如何实现的,但我在C/C++中实现这一点时遇到了困难。

我想要的:我有一个循环,我想每秒跑20次。我以前也这样做过,但我一辈子都记不起来了

这是我的密码。

void* Tick::startBeating() {
    mNext = clock();
    mRunning = 1;
    // Loop dat
    while (mRunning) {
        mT = clock();
        while ((mT) >= mNext) {
            // do updates here
            std::cout << "Tick." << std::endl;
            mNext = mT + SKIP_TICKS;
        }

        sleep(1);
    }
    return NULL;
}

这不起作用,似乎什么都不起作用。一个简单的C解决方案在互联网上找不到,这让我很惊讶

是的,我知道CLOCKS_PER_SEC,但我就是不知道了。

有什么帮助吗?

  1. 上班前,检查一下时间。

  2. 计算应该运行下一个循环的时间。

  3. 做任何你需要做的事。

  4. 计算到您在步骤2中计算的时间为止还有多少时间。

  5. 睡那么久。

  6. 转至步骤1。

我喜欢这个

float mAccumulatedTime;
int mLastTime;
void Init()
{
  mAccumulatedTime = 0.f;
  mLastTime=clock();
}
void Tick(float DeltaTime)
{
  mAccumulatedTime += DeltaTime;
  while (mAccumulatedTime > FixedTimeStep)
  {
    DoFixedTimeStepStuff();
    mAccumulatedTime -= FixedTimeStep;
  }
}
void Update()
{
  int CurrentTime=clock();
  float DeltaTime=(CurrentTime-mLastTime)/(float)CLOCKS_PER_SEC;
  Tick(DeltaTime);
  mLastTime=CurrentTime;
}

你需要注意适当地处理NaN和"死亡螺旋",但这足以让你开始。

答案取决于所需的准确性。您提到您正在将函数作为一个单独的线程运行

  1. 您的线程除了检查时间之外什么都不能做,并通知其他子系统一个tick(这意味着没有睡眠)while(1) if (elapsed_time >= target_time) flag=1
  2. 另一个函数(可能是main())必须检查标志并响应while(1) if (thread.flag) {std::cout << "beatn"; thread.flag=0;}
  3. 如果您的应用程序相当复杂,那么您应该实现信号/插槽机制

我不确定你是不知道如何在C++中获得时间,还是不知道步骤。

若您在窗口中,请在MS中获取时间。您可以使用GetTickCount()。以下信息。http://msdn.microsoft.com/en-us/library/ms724408%28v=vs.85%29.aspx

如果你已经可以得到时间,但需要算法来做。对于如何做到每秒20帧的算法,我有一个准确但稍微难以理解的方法。

这是一个简短的伪代码。

CurrentTickCount = GetTickCount();

//CurrentTime减去这个循环结束时的上一个时间,得出时间迄今为止

timeTakenSoFar += CurrentTickCount - PreviousTickCount;

//TickCount是整数,具有毫秒值,因此这些毫秒中的20相当于一秒的20/1000。如果我在这里记错了或做错了,对你来说这将是一个简单的解决方案:)while(timeTakenSoFar < 20)

{

PreviousTickCount = CurrentTickCount;

CurrentTickCount = GetTickCount();

timeTakenSoFar += CurrentTickCount - PreviousTickCount;

}

timeTakenSoFar -= 20;

//基本上,PreviousTickCount记录最后一次的时间;

PreviousTickCount = CurrentTickCount;

//评论//我没有将时间TakensoFar重置为0,因为肯定会有一点多余的时间,系统不能给你精确的20/1000,因此这将比等待解决方案更准确。在运行10000000000个循环后,这仍然会给您准确的正确时间,但不使用等待方法。