게임 루프는 고정 또는 가변 시간 단계를 기반으로해야합니까? 항상 우월한가, 아니면 올바른 선택은 게임마다 다릅니 까?
가변 시간 단계
물리 업데이트는 "마지막 업데이트 이후의 경과 시간"인수로 전달되므로 프레임 속도에 따라 다릅니다. 이는로 계산을 의미 할 수 있습니다 position += distancePerSecond * timeElapsed
.
장점 : 부드럽고 코딩하기 쉽다
단점 : 결정적이지 않고 매우 작은 단계에서 큰 단계로 예측할 수 없음
deWiTTERS 예 :
while( game_is_running ) {
prev_frame_tick = curr_frame_tick;
curr_frame_tick = GetTickCount();
update( curr_frame_tick - prev_frame_tick );
render();
}
고정 시간 단계
업데이트는 각 업데이트가 고정 된 기간 동안이라고 가정하므로 "시간 경과"를 허용하지 않을 수도 있습니다. 계산은 다음과 같이 수행 할 수 있습니다 position += distancePerUpdate
. 이 예제에는 렌더링 중 보간이 포함됩니다.
장점 : 예측 가능하고 결정적 (네트워크 동기화가 더 쉬워 집니까?), 더 명확한 계산 코드
단점 : v- 동기화를 모니터링하기 위해 동기화되지 않음 (보간하지 않으면 불안감 그래픽 발생), 제한된 최대 프레임 속도 (보간하지 않는 한), 가변 시간 단계 가정 (예 : Pyglet 또는 Flixel )
deWiTTERS 예 :
while( game_is_running ) {
while( GetTickCount() > next_game_tick ) {
update();
next_game_tick += SKIP_TICKS;
}
interpolation = float( GetTickCount() + SKIP_TICKS - next_game_tick )
/ float( SKIP_TICKS );
render( interpolation );
}
일부 자료
- 게임의 개퍼 : 타임 스텝을 고치세요!
- 듀터의 게임 루프 기사
- Quake 3의 FPS는 점프 물리에 영향을줍니다. Doom 3 이 60fps로 프레임 고정 된 이유 는 무엇입니까?
- Flixel은 가변 시간 단계가 필요하지만 (Flash에 의해 결정 된다고 생각합니다) Flashpunk 은 두 가지 유형을 모두 허용합니다.
- Box2D 매뉴얼 § Box2D 세계 시뮬레이션 은 일정한 시간 간격을 사용하도록 제안합니다.