반 고정 또는 완전 고정 타임 스텝?


15

나는 아이폰 shmup을 만들고 있으며 사용할 게임 루프 유형을 결정하려고합니다. 반 고정 타임 스텝 또는 완전 고정 타임 스텝을 사용하고 싶습니다.

반 고정 타임 스텝을 사용하면 게임 루프 당 dt <= FIXED_INTERVAL (여기서 dt <= FIXED_INTERVAL)을 따라 0 번 이상의 update (FIXED_INTERVAL) 호출을 수행합니다. 내가 이해하는 것처럼이 방법의 단점은 기본적으로 모든 업데이트마다 변수 dt를 가정해야하기 때문에 물리 업데이트 (dt) 논리를 프로그래밍하기가 더 어려워진다는 것입니다. 그리고 부동 소수점 값이 매번 동일하지 않기 때문에 게임의 각 실행이 약간 다를 것이라고 들었습니다.

그런 다음 완전히 고정 된 시간 단계를 사용하여 게임 루프 당 dt <FIXED_INTERVAL 인 한 번의 보간 (dt / FIXED_INTERVAL) 호출을 수행하는 0 번 이상의 업데이트 (FIXED_INTERVAL) 호출을하고 있습니다.

따라서 실제로 결정해야 할 큰 결정은 다음과 같습니다. 변수 dt를 사용하여 업데이트 (dt)를 구현하는 문제를 해결하고 싶거나 보간을 구현하는 문제를 해결하고 싶습니까?

이제 내가 읽은 것에서 대부분의 사람들은 완전히 고정되어 보간을 수행한다고 말합니다. 그러나 보간 구현에 대해 생각할 때 변수 dt가있는 업데이트 (dt)보다 훨씬 복잡한 것처럼 보입니다. 보간법을 사용하면 이전 상태와 현재 상태를 모두 기억해야하기 때문입니다. 보간을 사용하려면 전체 개별 게임 상태를 추상화하는 추가 간접 레이어가 필요합니다. 보간을 사용할 필요가없는 반 고정 타임 스텝과는 달리 항상 게임 상태가 하나뿐이므로 적과 적을 나타내는 "전역 배열"이기 때문에 게임 상태 추상화가 필요 없습니다. 총알 등

더 실용적인 선택은 무엇입니까? 물리적 업데이트가 변수 dt로 복잡해질 수 있다는 것을 알고 반 고정으로 구현합니까? 또는 완전히 수정하여 게임 상태 추상화를 생각해 보아 보간을 수행하기 위해 이전 상태와 현재 상태를 추적 할 수 있습니까?



1
그 토론과 그 링크를 여러 번 읽었습니다. 실제로이 포스트에 온 방법입니다. 내 질문은 주로 보간을 달성하기 위해 게임 상태를 구현하는 방법과 관련이 있습니다.이 논의에서는 전혀 다루지 않습니다.
Ryan

답변:


12

완전 고정

각 프레임마다 한 번씩 가변 단계를 던질 때 고정 된 시간 간격의 이점을 대부분 잃게됩니다.

Noel Lopis는 자신의 게임 Casey 's Contraptions 에서 어떻게 고정 된 시간 단계를 구현했는지에 대해 글을 올렸습니다 . 당신에게 보너스로 그는 아이폰 개발자이지만, 그의 기술은 아이폰 전용이 아닙니다.

기사의 일부 하이라이트

  • 시간 누산기를 사용하십시오.
  • 60Hz 프레임 속도에는 120Hz 물리 속도를 사용하십시오.
  • 하나의 고정 된 단계를 미래로 시뮬레이션하고 시간 경과에 따른 잔여 누적을 사용하여 현재 물리 상태와 미래 물리 상태 사이의 도면 코드를 뛰어 넘습니다.
  • 다양한 문제

2

당신이 "반 고정"내 마음에있는 시간 단계 "완전 고정"으로 참조 모두 고정 된 타임 스텝 - DT 당신이 당신에 전달되는 update프레임 사이에 변경되지 않는 전화.

따라서 귀하의 질문은 실제로 "렌더링 목적으로 보간을 구현하고 싶습니까?"입니다. 대답은 아마 아닐 것입니다 .

보간은 고정 update타임 스텝이 목표 render타임 스텝과 현저히 다른 경우에만 수행하려는 작업 입니다. 10Hz update로만 호출 update하고 전체 프레임 속도로 렌더링 해야하는 힘든 단계를 가진 게임은 드문 일 이 아닙니다 .

iPhone shmup을 작성하고 있으므로 특히 CPU를 많이 사용 update하지 render않아도됩니다. 구현에 신경 쓰지 않고 30Hz 또는 60Hz로 프레임 속도를 쉽게 잠글 수 있으며 매끄러운 게임을 할 수 있습니다.


나는 그것을 얻지 못한다. 내 게임 루프에서 계산할 큰 dt를 잠글 수 있다고 말하고 있습니다-내 물리가 소비합니까? 어떻게해야합니까? CADisplayLink로 할 수 있습니까? 내가 사용한다고 가정하는 CPU의 %는 무엇입니까? 잠긴 게임 루프 dt를 실제로 가정해야합니까?
Ryan

내가 말하는 것은 실제로 이것으로 귀결됩니다. 작동하는 가장 복잡한 것을하십시오.
블레어 홀로 웨이

1
정교화 : 변수를 사용 dt하기위한 updaterender 일하는 것이 간단한 일이지만 그것이 원인이 불안정성에 대한 물리 엔진을 사용하는 경우 일반적으로 피했다. 따라서 updatefixed로 호출 dt하고 같은 속도로 렌더링하면 ( update길이가 길면 프레임을 떨어 뜨리는 동안) 일반적으로 가장 간단한 방법입니다. update호출 간에 객체를 보간하기위한 코드를 작성하면 코드 가 복잡해집니다. 특히 문제를 해결하기 위해 추가하는 복잡성.
블레어 홀로 웨이
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.