난 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 밀리 초만큼 증가 시킨다고 가정 할 수 있습니다 .
이 답변 과 특히 답변에 제공된 링크를 읽으십시오 .