2012-07-17 51 views
0

我一直在通过互联网很长一段时间寻找一个简单的解决方案,一个相当容易的问题。固定更新速度

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

任何帮助?

+0

这是特定的游戏,但适用于:http://gafferongames.com/game-physics/fix-your-timestep/ – orlp 2012-07-17 10:19:47

+0

我的问题如何以任何方式与档案相关? – 2012-07-17 10:20:50

+0

Copypasta失败,我在之后修复它。按F5。 – orlp 2012-07-17 10:21:53

回答

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

+0

啊,这看起来更有用,也更符合我想要的方向。我会给这一个镜头,如果它适合我​​,我会接受答案。干杯! – 2012-07-17 10:51:46

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

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

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

  4. 计算出有多少时间留给直到你在步骤长计算2.

  5. 睡眠对于时间。

  6. 转到步骤1

+0

我知道所需的步骤,我只是无法弄清楚如何在C中完成。整个time.h库似乎令人难以置信地过于复杂和烦人的使用。 – 2012-07-17 10:24:59

+0

我的示例代码中没有看到跟踪这些步骤的任何组织。您认为与第2,4或5步相对应的代码在哪里?我确实看到了1,3和6. – 2012-07-17 10:28:21

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. ,那么你就应该实现signal/slot机制
0

我不知道,如果你不知道如何让时间在C++中,或您不知道这些步骤。

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

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

这是一个简短的伪代码。

CurrentTickCount = GetTickCount();

//该CURRENTTIME minusing上一次在这个循环结束时为我们提供了所需的时间 迄今

timeTakenSoFar += CurrentTickCount - PreviousTickCount;

//计时单位计数是毫秒值的整数,因此,这些毫秒中的20个相当于20/1000秒,如果我记得或在这里做错了,它将是一个容易修复在你身边:) while(timeTakenSoFar < 20)

{

PreviousTickCount = CurrentTickCount;

CurrentTickCount = GetTickCount();

timeTakenSoFar += CurrentTickCount - PreviousTickCount;

}

timeTakenSoFar -= 20;

//基本PreviousTickCount跟踪什么是最后一次;

PreviousTickCount = CurrentTickCount;

//注释 //我没有重置timeTakenSoFar为0,因为肯定会有略微过量时,系统无法给你确切20/1000,因此这将是更准确比等待解决方案。在运行10000000000个周期后,这仍然会给你准确的时间,但不会用等待方法。