시간 관리자


시간 관리자

속성

Fixed Timestep 물리적 계산이나 FixedUpdate() events를 수행할 때 지시하는 프레임속도와 무관한(framerate-independent) 구간.
Maximum Allowed Timestep 프레임 속도가 느릴 때 최악의 경우에 제한하는 프레임속도와 무관한(framerate-independent) 구간. 물리적 계산이나 FixedUpdate() events는 이 값을 넘기지 않는 시간 내에서만 수행합니다.
Time Scale 시간이 흐르는 속도. 이 값을 수정하여 총알 시간 효과(bullet-time effects)를 재현 할 수 있습니다. 1은 실시간을 의미하고, 0.5는 그 반의 빠르기, 2는 두 배의 빠르기를 의미합니다.

상세사항

고정된 시간단계

고정된 시간단계는 안정된 물리력 시뮬레이션이 매우 중요합니다. 모든 컴퓨터가 상이하게 설계되었으므로, 각각 다른 하드웨어 구성 하에 유니티 게임의 실행 성능도 매우 다양해 집니다. 그러므로 물리력은 게임의 프레임 속도와 독립적으로 계산되어야 합니다. 충돌 감지나 리지드바디 동작 같은 물리력 계산은 이산 고정 시간단계(discrete fixed time steps)로 수행되며 프레임 속도와는 무관합니다. 이렇게 함으로써 다양한 하드웨어 상에서 혹은 프레임 속도가 변경될 때 일관적인 시뮬레이션이 가능하게 됩니다. 예를 들어, 많은 게임을 스크린에 띄우거나 사용자가 배경에 다른 프로그램을 실행하면 프레임 속도가 저하 될 수 있습니다.

고정 시간단계는 다음과 같은 계산됩니다. 모든 프레임이 스크린에 그려지기 전에, 유니티가 고정시간을 고정델타시간으로 당기고 그것이 현재시간에 다다를 때까지 연산을 수행합니다. 이렇게 하면 Fixed Timestep이 정확하게 계산됩니다. 이 값이 적어질수록, 물리 연산은 더 자주 실행 됩니다. 초당 고정프레임의 숫자는 1을 Fixed Timestep로 나누면 계산 할 수 있습니다. 그러므로, 1 / 0.02 = 50 초당 고정 프레임이고, 1 / 0.05 = 20 초당 고정 프레임 입니다.

단순하게 이야기하면, 고정 업데이트 값이 작을수록 물리 시뮬레이션은 더 정확해지지만 CPU에는 부담이 가중됩니다.

최고 허용 시간스텝

고정 시간 스텝은 안정된 물리 시뮬레이션을 보장합니다. 하지만 이는 말이 게임이 대량의 물리연산을 요구하며 이미 느리게 동작하고 이따금 낮은 프레임 속도에 빠지고 있는 경우에는 성능저하를 가져올 수 있습니다. 프레임 처리시간이 길수록 다음 프레임에 더 많은 고정업데이트 스텝을 수행해야 할 것 입니다. 이것이 성능 저하를 초래합니다. 이러한 시나리오를 방지하기 위하여, 유니티 iOS는 최고허용시간스텝 (Maximum Allowed Timestep)을 도입하여 여기에 명시된 임계 값 이상으로 물리연산이 일어나지 않도록 제한하고 있습니다.

만일 프레임이 최고허용시간스텝 (Maximum Allowed Timestep)에 명시된 시간보다 더 긴 시간이 소요된다면, 물리력은 해당 프레임이 최고허용시간스텝 (Maximum Allowed Timestep)에서 명시된 시간만 소요된 것으로 " 가정 " 할 것 입니다. 다른 말로, 만일 프레임 속도가 하위 임계값보다 아래로 떨어진다면, 리지드바디는 살짝 느려지며 CPU가 따라오길 기다릴 것 입니다.

최고허용시간스텝 (Maximum Allowed Timestep)은 물리연산과 FixedUpdate()이벤트 모두에 영향을 미칩니다.

최고허용시간스텝 (Maximum Allowed Timestep)Fixed Timestep과 마찬가지로 초 단위로 표시됩니다. 그러므로 0.1로 설정하면 만일 프레임 속도가 1 / 0.1 = 10 초당 프레임 아래로 떨어지면 물리와 FixedUpdate() 모두를 느리게 할 것입니다.

Typical scenario

  1. Fixed Timestep이 0.01이라고 가정한다면, 이것은 physx, fixedUpdate와 애니메이션이 매 10ms 마다 실행되어야 한다는 것을 의미합니다.
  2. 사용자의 프레임 시간이 ~33 ms 이하라면 고정 룹은 시각 프레임 당 평균 3번 정도 실행됩니다.
  3. 하지만 프레임시간은 고정 상수가 아니며 사용자 장면 상태, OS배경 작업 등 를 포함한 많은 요소에 의해 결정됩니다.
  4. 위의 3번에 명시한 이유에 의해 프레임이 어떠한 경우 40-50 ms에 달하기도 하므로, 고정 스텝 룹은 이 경우 3~4번씩 수행할 것 입니다.
  5. 사용자의 Fixed Timestep 작업이 매우 무거울 경우, physx, fixedUpdates 그리고 애니메션에 소요되는 시간은 사용자의 프레임시간을 또 10 ms 더 연장합니다. 이는 이 모든 Fixed Timestep작업이 한번 더 추가 반복되는 것을 의미합니다.
  6. 아주 운이 나쁜 경우에는 5번에 묘사한 프로세스가 10배 혹은 그 이상의 고정스텝 룹의 처리로 연장될 수도 있습니다.
  7. 이러한 이유로 최고허용시간스텝 (Maximum Allowed Timestep)이 도입되었으면, 이것은 physx, fixedUpdates과 애니메이션이 한 시각프레임을 처리하는데 소요되는 시간을 제한하는 방법입니다. 사용자가 최고허용시간스텝 (Maximum Allowed Timestep)을 100ms로 설정하고 고정타임스텝을 10ms로 설정하였다면, 고정타임스텝작업은 시각 프레임 당 최대 10배까지 수행될 것입니다. 그러므로 늘어난 Fixed Timestep 반복횟수 때문에 가끔은 작은 성능 문제가 큰 성능문제를 촉발할 수도 있습니다. 최고허용시간스텝 (Maximum Allowed Timestep)을 30ms로 줄이면, 사용자는 최고고정스텝반복횟수를 3로 제한하고, 이는 사용자의 physx, fixedUpdates과 애니메이션이 사용자의 프레임시간을 아주 많이 날아가게 하지는 않는다는 것을 의미하지만, 이러한 제한에 대한 부정적 효과도 있습니다. 사용자의 애니메이션과 물리는 성능 문제가 발생할 경우 약간 느려질 수 있습니다.

Hints

  • 스크립트를 통해서 Time Scale을 변경함으로써 플레이어에게 시간에 대한 제어력을 제공하십시오.
  • 만일 사용자의 게임이 물리연산을 무겁게 수행하거나 FixedUpdate() events에 많은 시간을 소요하고 있다면, Maximum Allowed Timestep을 0.1로 설정하십시오. 이렇게 하면 물리가 사용자 게임을 초당 10 프레임 이하로 느려지게 하는 것을 방지할 수 있습니다.

역링크