我一直在寻找互联网很长一段时间,以便轻松解决一个相当容易的问题。
我把这个函数作为一个线程运行,我想要的很简单。有很多伪代码可以解释它是如何完成的,但我在使用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 :(得分:1)
在工作之前,请检查时间。
计算应该运行下一个循环的时间。
做任何你需要做的事。
计算在步骤2中计算的时间之前剩余的时间。
长时间睡眠。
转到第1步。
答案 1 :(得分:0)
答案取决于所需的准确性。您提到您将函数作为单独的线程运行
while(1) if (elapsed_time >= target_time) flag=1
main()
)必须检查标志并回复while(1) if (thread.flag) {std::cout << "beat\n"; thread.flag=0;}
答案 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和“死亡螺旋”,但这足以让你开始。