私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ミリ秒に1回関数が呼び出されます。
オペレーティングシステムのマルチタスクの性質により、10ミリ秒ごとに呼び出される関数に依存することはできません。しかし、上記のループは十分に速く発生するので、うまくいけば十分に近くなり、の各呼び出しはfixedTimestep
シミュレーションを10ミリ秒の値だけ増やすと仮定できます。
この回答、特に回答に記載されているリンクもお読みください。