개발툴/Unity

<시간 및 프레임 속도 관리>

가든_ 2023. 7. 16. 23:18
시간 기반 액션을 다룰때 주의할 점 : 게임의 프레임 속도는 일정하지 않고,
Update()의 콜 사이의 시간 간격은 일정하지 않다.
이를 해결하기 위해서는 Time.deltaTime에서 읽어오는 프레임 시간에 맞춰서 스케일링 한다.

고정 타임스텝(Fixed Timestep)

  • Unity의 물리 시스템은 고정 타임스텝으로 작동함
  • 물리 업데이트를 시작할때 마지막 물리 업데이트가 끝난 시점에 고정 타임스텝 값을 추가하여 알람을 설정하고, 해당 알람이 꺼질 때까지 물리 시스템에서 계산을 수행함
  • 고정 타임 스텝은 타임 관리자에서 변경 가능

• 낮으면 물리 업데이트가 자주 일어나지만, CPU로드 비용이 커진다.

  • Time.fixedDeltaTime을 사용해서 읽을 수 있다.
  • 단점 : 고정 타임 스텝은 물리 시뮬레이션을 정확히 유지하게 하지만, 물리계산이 많이 사용되고, 프레임 속도가 낮아질 수록 문제를 일으킬 수 있다.
  • 단점 : 프로세싱할 것이 많다면 하나의 프레임 동한 여러번의 물리 이벤트가 일어날 수 있고, 그렇게 되면 프레임 시간, 오브젝트 포지션, 기타 프로퍼티는 프레임 시작 시점에 고정되기 때문에 물리가 더 자주 업데이트 되면서 그래픽과의 싱크가 어긋날 수 있다 -> 이럴때 사용하는게 최대 허용 타임 스텝

최대 허용 타임스텝(Maximum Allowed Timestep)

  • 물리 시간을 늦추어 프레임과의 싱크를 맞추는 옵션
  • 주어진 프레임 업데이트 동안 물리 프로세싱에 사용되는 시간과 FixedUpdate() 호출 수에 제한을 둔다.
  • 프레임 업데이트 처리가 설정한 최대 물리 처리 시간보다 오래 걸린다면 물리 엔진은 시간을 멈춰서 프레임 프로세싱이 따라잡을때까지 기다린다.
  • 물리 계산이 느리게 실행되지만, 게임 상에서는 눈에 잘 띄지 않으며 성능을 위해 감수할 만하다.

시간 스케일(Time Scale)

  • 시간 스케일을 사용하면 게임시간이 현실 시간에 대비해서 흘러가는 속도 조절 가능
  • 값이 0이면 시간이 멈추고, 2이면 유니티에서 시간이 2배의 속도로 흘러간다.
  • 실제로 느리게 실행되는 것이 아니라, Time.deltaTime과 Time.fixedDeltaTime을 통해 전해지는 타임 스텝만을 변경한다.
    • Update() 함수는 더 자주 호출되지만, deltaTime 스텝은 줄어든다.
  • 다른 스크립트 함수는 시간 스케일의 영향을 바지 않는다.
    • ex) GUI 함수는 정상적으로 동작한다.

캡처 프레임 속도(Capture Framerate)

  • 게임 플레이를 녹화하는 것은 게임 프레임 속도를 저하시킨다.
  • 캡처 프레임 속도 프로퍼티를 사용하면 해결 가능