修正了更新速度

时间:2012-07-17 10:17:05

标签: c++ loops time.h

我一直在寻找互联网很长一段时间,以便轻松解决一个相当容易的问题。

我把这个函数作为一个线程运行,我想要的很简单。有很多伪代码可以解释它是如何完成的,但我在使用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,但我不知道了。

任何帮助?

4 个答案:

答案 0 :(得分:1)

  1. 在工作之前,请检查时间。

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

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

  4. 计算在步骤2中计算的时间之前剩余的时间。

  5. 长时间睡眠。

  6. 转到第1步。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

我不确定你是否不知道如何在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;

//注释 //我没有将timeTakenSoFar重置为0,因为肯定会有一点时间,系统无法准确地给你20/1000,因此这将比等待解决方案更准确。在运行10000000000次循环后,这仍然会给你准确的正确时间,但不是等待方法。

答案 3 :(得分:0)

我这样做

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和“死亡螺旋”,但这足以让你开始。