修正了更新速度
Fixed Update Speed
我一直在互联网上寻找一个简单的问题的简单解决方案。
我把这个函数作为一个线程运行,我想要的非常简单。有很多伪代码可以解释它是如何实现的,但我在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,但我就是不知道了。
有什么帮助吗?
-
上班前,检查一下时间。
-
计算应该运行下一个循环的时间。
-
做任何你需要做的事。
-
计算到您在步骤2中计算的时间为止还有多少时间。
-
睡那么久。
-
转至步骤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和"死亡螺旋",但这足以让你开始。
答案取决于所需的准确性。您提到您正在将函数作为一个单独的线程运行
- 您的线程除了检查时间之外什么都不能做,并通知其他子系统一个tick(这意味着没有睡眠)
while(1) if (elapsed_time >= target_time) flag=1
- 另一个函数(可能是
main()
)必须检查标志并响应while(1) if (thread.flag) {std::cout << "beatn"; thread.flag=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;
//评论//我没有将时间TakensoFar重置为0,因为肯定会有一点多余的时间,系统不能给你精确的20/1000,因此这将比等待解决方案更准确。在运行10000000000个循环后,这仍然会给您准确的正确时间,但不使用等待方法。
- 从C++本机插件更新Vector3数组
- QGraphicsPolygonItem在拖动时未更新QPolygonF坐标
- 为什么在读取文件大小时文件IO速度会发生变化
- cmake更新缓存的变量
- 更新到莫哈韦后出现cmath错误
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- 文件系统:复制功能的速度秘诀是什么
- OpenMP:并行更新数组总是需要减少数组吗
- 为什么我的变量没有更新,我的 LED 没有亮起?
- 指针没有更新它在void函数内部指向的值
- 如何在c++中获取要更新的值
- 已修改的LinkedList未在文本文件本身中更新
- 通过libpqxx提高PostgreSQL数据库的更新速度
- OpenGL 更新缓冲区如何影响速度
- cmd 中的信息闪烁和更新速度非常快
- std::tan()在更新glibc后速度非常慢
- 修正了更新速度
- Qt OpenGL更新速度太慢
- 读取CAN输入时更新GUI元素的效率/速度
- Gtk::标签更新标签速度