FPS(초당 프레임 수)의 주어진 프레임 속도의 경우 개별 프레임의 지속 시간이 달라집니다. 이러한 배리에이션은 사소한 수준일 수 있습니다. 예를 들어 60FPS로 실행되는 게임에서 초당 실제 프레임 수는 약간 다를 수 있으므로 각 프레임은 0.016초에서 0.018초 사이로 지속됩니다. 애플리케이션이 많은 계산이나 가비지 컬렉션을 수행하거나 다른 애플리케이션이 리소스 경쟁을 할 때 더 큰 배리에이션이 발생할 수 있습니다.
Time.time은 애플리케이션이 시작된 이후 경과한 시간을 나타내며 일반적으로 지속적이고 일정하게 증가합니다. Time.deltaTime은 마지막 프레임 이후 경과한 시간을 나타내므로 이상적인 경우 상당히 일정하게 유지됩니다. 두 값 모두 실시간이 아닌 게임 내 값을 기반으로 하므로 사용자가 적용하는 시간 스케일링을 고려합니다. 예를 들어 느린 모션 효과를 위해 Time.timeScale을 0.1로 설정하면 Time.time 값이 실시간 속도보다 10% 증가합니다. 실시간으로 10초 후, Time.time 값은 1만큼 증가합니다.
게임 속도를 줄이거나 가속화하는 것 외에도 Time.timeScale을 0으로 설정하여 게임을 일시 중지할 수 있습니다. 이 경우 Unity는 여전히 Update 메서드를 호출하지만, Time.time은 전혀 증가하지 않으며, Time.deltaTime은 0입니다.
이러한 값은 Time.maximumDeltaTime 값으로도 제한됩니다. 이 프로퍼티에서 보고되는 프레임 속도의 일시 정지 또는 배리에이션의 길이는 Time.maximumDeltaTime을 초과하지 않습니다. 예를 들어, 1초의 지연이 발생하지만, maximumDeltaTime이 기본값인 0.333으로 설정된 경우, 실제로 1초가 경과하더라도 Time.time은 0.333씩 증가하고 Time.deltaTime은 0.333만큼 증가합니다.
각 프로퍼티의 스케일되지 않은 버전(Time.unscaledTime 및 Time.unscaledDeltaTime)은 이러한 제한 사항을 무시하며 두 경우 모두 실제 경과 시간을 보고합니다. 게임이 느린 모션으로 플레이되는 경우에도 고정된 속도로 응답해야 하는 모든 경우에 유용합니다. UI 상호 작용 애니메이션을 예로 들 수 있습니다.
아래 표는 한 프레임에서 16프레임이 차례로 경과하며 한 프레임 중간에 큰 지연이 발생하는 예를 보여 줍니다. 이 수치는 다양한 Time 클래스 프로퍼티가 프레임 속도의 이러한 큰 배리에이션을 보고하고 반응하는 방식을 보여 줍니다.
| 프레임 | unscaledTime | 시간 | unscaledDeltaTime | deltaTime | smoothDeltaTime |
|---|---|---|---|---|---|
| 1 | 0.000 | 0.000 | 0.018 | 0.018 | 0.018 |
| 2 | 0.018 | 0.018 | 0.018 | 0.018 | 0.018 |
| 3 | 0.036 | 0.036 | 0.018 | 0.018 | 0.018 |
| 4 | 0.054 | 0.054 | 0.018 | 0.018 | 0.018 |
| 5 | 0.071 | 0.071 | 0.017 | 0.017 | 0.018 |
| 6 | 0.089 | 0.089 | 0.018 | 0.018 | 0.018 |
| 7 | 0.107 | 0.107 | 0.018 | 0.018 | 0.018 |
| 8(a) | 1.123(b) | 0.440(c) | 1.016(d) | 0.333(e) | 0.081(f) |
| 9 | 1.140 | 0.457 | 0.017 | 0.017 | 0.066 |
| 10 | 1.157 | 0.474 | 0.017 | 0.017 | 0.056 |
| 11 | 1.175 | 0.492 | 0.018 | 0.018 | 0.049 |
| 12 | 1.193 | 0.510 | 0.018 | 0.018 | 0.042 |
| 13 | 1.211 | 0.528 | 0.018 | 0.018 | 0.038 |
| 14 | 1.229 | 0.546 | 0.018 | 0.018 | 0.034 |
| 15 | 1.247 | 0.564 | 0.018 | 0.018 | 0.031 |
| 16 | 1.265 | 0.582 | 0.018 | 0.018 | 0.028 |
프레임 1–7은 초당 약 60프레임의 일정한 속도로 실행됩니다. Time.time과 Time.unscaledTime이 함께 꾸준히 증가하는 것을 볼 수 있으며, 이는 Time.timeScale이 1로 설정되어 있음을 나타냅니다.
8프레임(a)에서 약 1초를 초과하는 큰 지연이 발생합니다. 이는 리소스 경쟁이 있을 때 발생할 수 있습니다. 예를 들어 작업은 디스크에서 대량의 데이터를 로드하는 동안 메인 프로세스를 차단합니다.
프레임 지연이 Time.maximumDeltaTime을 초과하면 Unity는 Time.deltaTime이 보고한 값과 Time.time에 추가한 양을 제한합니다. 이렇게 하면 시간 단계가 해당 양을 초과할 경우 발생할 수 있는 원치 않는 부작용이 방지됩니다. 제한이 없으면 이동이 Time.deltaTime으로 스케일링되는 오브젝트는 이론적으로 한 프레임에서 다음 프레임으로 거리를 무제한으로 이동할 수 있습니다. 예를 들어 캐릭터가 장애물(예: 벽)을 통과하지 않고 지나가는 경우 글리치 효과가 발생할 수 있습니다.
Time 창에서 Maximum allowed timestep 설정을 변경하거나 코드에서 Time.maximumDeltaTime 프로퍼티의 값을 설정하여 에디터에서 Time.maximumDeltaTime을 조정할 수 있습니다.
Time.maximumDeltaTime 기본값은 1/3(0.3333333)초입니다. 즉 이동을 Time.deltaTime이 제어하는 게임에서는 이전 프레임 이후로 실제 경과한 시간의 양에 관계없이 한 프레임에서 다음 프레임으로의 오브젝트 움직임 1/3초 안에 이동할 수 있는 거리로 제한됩니다.
위의 표에 나온 데이터를 그래프 형식으로 보면 이러한 시간 프로퍼티가 서로에 관해 동작하는 방식을 시각화하는 데 도움이 될 수 있습니다.
프레임 8에서 Time.unscaledDeltaTime(d) 및 Time.deltaTime(e)은 보고된 시간이 얼마나 경과했는지에 차이가 있습니다. 프레임 7과 프레임 8 사이에 실시간으로 1초가 걸렸지만, Time.deltaTime은 0.333초로만 보고합니다. 이는 Time.deltaTime이 Time.maximumDeltaTime 값으로 제한되기 때문입니다.
유사하게 Time.unscaledTime(b)은 참 값(고정되지 않은 값)이 추가되었으므로 거의 1초가 증가했지만 반면에, Time.time(c)은 더 작은 고정 값만큼만 증가했습니다. Time.time은 경과한 시간의 실제 양을 따라잡지 않고 그 대신 마치 지연이 Time.maximumDeltaTime만큼의 길이였던 것처럼 동작합니다.
Time.smoothDeltaTime 프로퍼티는 알고리즘에 따라 모든 배리에이션을 평탄화한 최근 Time.deltaTime 값의 근사치를 보고합니다. 이는 이동 또는 기타 시간 기반 계산에서 원치 않는 변동을 방지하는 또 다른 기법입니다. 특히, Time.maximumDeltaTime에 의해 설정된 임곗값보다 낮은 경우에 그렇습니다. 평탄화 알고리즘은 향후 배리에이션을 예측할 수 없지만, 최근 경과한 Time.deltaTime 값의 배리에이션을 평탄화하기 위해 보고된 값을 점진적으로 조정하여 보고된 평균 시간이 실제 경과된 시간과 대략 동일하게 유지됩니다.
maximumDeltaTime 값은 고정 업데이트 루프에도 영향을 줍니다. 물리 시스템은 Time.fixedDeltaTime에 정의된 고정 시간 간격을 사용하여 각 단계에서 시뮬레이션할 시간을 결정합니다. Unity는 경과한 시간에 따라 물리 시뮬레이션을 최신 상태로 유지하고 때로는 프레임당 여러 개의 물리 업데이트를 수행합니다.
그러나 물리 시뮬레이션이 너무 뒤처지면 물리 시스템이 현재 시간에 맞추기 위해 많은 단계를 거쳐야 할 수 있습니다. 이렇게 따라잡기 위한 단계로 인해 감속이 더 많이 발생할 수 있습니다. Time.maximumDeltaTime 값은 감속의 피드백 루프를 방지하기 위해 물리 시스템이 주어진 두 프레임 사이에 시뮬레이션하는 시간의 양을 제한하는 역할을 합니다.
프레임 업데이트가 처리되는 데 Time.maximumDeltaTime보다 오래 걸리면 물리 엔진은 추가 시간을 시뮬레이션하지 않고 대신 프레임 프로세싱이 따라잡을 수 있도록 합니다. 프레임 업데이트가 완료되면 물리가 중지된 이후 시간이 지나지 않은 것처럼 다시 시작됩니다.
그 결과 물리 오브젝트는 평소처럼 완벽하게 실시간으로 움직이지 않지만 약간 느려집니다. 하지만 물리 시스템은 물리 오브젝트가 정상적으로 움직이는 것처럼 계속 추적합니다. 물리 시간의 감속은 보통 눈에 띄지 않으며 게임플레이 성능에 대한 허용되는 트레이드 오프입니다.
다음 플로차트는 Unity가 단일 프레임에서 시간을 계산하는 데 사용하는 로직과 time, deltaTime, fixedDeltaTime, maximumDeltaTime 프로퍼티가 서로 어떻게 관련이 있는지 보여 줍니다.