我认为glutIdleFunc
还好;本质上,如果您不使用它,最终还是要手工完成。不管您要有一个不以固定模式调用的紧密循环,您都需要选择是将其转换为固定时间循环还是将其保留为可变时间循环并确保您所有的数学都考虑了插值时间。甚至以某种方式将它们混合在一起。
您当然可以拥有myIdle
传递给的函数glutIdleFunc
,然后在其中测量经过的时间,将其除以固定的时间步长,然后多次调用另一个函数。
这是不可以做的事情:
void myFunc() {
// (calculate timeDifference here)
int numOfTimes = timeDifference / 10;
for(int i=0; i<numOfTimes; i++) {
fixedTimestep();
}
}
fixedTimestep不会每10毫秒调用一次。实际上,它的运行速度会比实时运行的速度慢,并且当问题的根源在于除以timeDifference
10 时剩余的损失时,您可能最终会伪造数字以进行补偿。
相反,请执行以下操作:
long queuedMilliseconds; // static or whatever, this must persist outside of your loop
void myFunc() {
// (calculate timeDifference here)
queuedMilliseconds += timeDifference;
while(queuedMilliseconds >= 10) {
fixedTimestep();
queuedMilliseconds -= 10;
}
}
现在,此循环结构确保您的fixedTimestep
函数每10毫秒调用一次,而不会损失任何毫秒作为余数或类似的东西。
由于操作系统具有多任务处理的性质,因此您不能依赖每10毫秒精确调用一次函数;但是上面的循环会发生得足够快,以至于希望足够接近,并且您可以假设每次调用fixedTimestep
都会使您的模拟值增加10毫秒。
还请阅读此答案,尤其是答案中提供的链接。