본문 바로가기
유니티/기초

유니티 Update 함수

by 노튜 2020. 11. 5.
728x90

1. 프레임(Frame)

 

프레임이란 화면 하나의 데이터이다. 다시 말해 정지한 이미지이다. 

영화 필름으로 생각해보자. 필름은 사진(이미지)들을 빠르게 보여주어, 영상처럼 보여준다. 여기서 사용된 이미지 하나하나가 프레임이다.

이 프레임을 재생하는 속도에 따라, Frame Rate이 결정된다. 영화 필름은 동일한 속도로 이미지들을 재생한다. 하지만 현대화된 디스플레이 장치는 데이터로 저장되어, 이미지를 표시한다. 디스플레이 장치, 컴퓨터 성능 등에 영향을 받아, 이미지를 표시하는 속도는 각 프레임마다 다를 수 있다. 

   

영화 필름

2. FPS란 

Frames Per Second의 약자이다.  1초 동안 표시되는 프레임 수이다. FPS가 높다면, 영상의 이미지가 더 많이 표시되어, 좀 더 세밀한 부분까지 표시한다. 하지만 반대로 FPS 낮다면, 1초 동안 표시하는 이미지 수가 적으므로, 조잡해 보일 수 있을 것이다. 

모든 분야에서 동일한 FPS를 사용하지 않는다. 각 분야에 맞는 FPS가 있다. 예를 들어, 영화 필름은 24 프레임을 사용한다.

 

  • 30 frame : 뮤직 비디오 산업에서 사용된다.
  • 24 frame : 비디오 신호를 필름에 전송하기 위해 사용된다. 
  • 60 frame : HDTV 시스템에 사용된다. 

비디오 게임은 분야에서 FPS는 고정되어 있지않다. 30 FPS에서~ 60 FPS 사이에서 사용된다. 게임은 다른 영화나 영상보다 물리 연산과같은 처리해야 하는 데이터들이 더 많다. 게다가 게임을 플레이하는 컴퓨터 환경은 제각각이다. 이처럼 다양한 환경적 요인으로 인해, FPS는 제각각인 경우가 많다. 뛰어난 그래픽을 가지고 있어도, 화면의 끊김이 심하면, 이는 사용자에게 불쾌감을 주며, 게임을 삭제하는 일로 발전할 수 있다.   

 

 3. FixedUpdate() vs Update(), LateUpdate()

아래의 코드를 유니티에서 실행해보자. FixedUpdate()의 FixedDeltaTime은 고정적으로 출력되는 된다.LateUpdate()는 Update() 이후에 호출되며, DeltaTime이 가변적이며, 양쪽 다 동일한 값을 출력하는 것을 확인할 수 있다.

 

public class TestUpdate : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    private void FixedUpdate()
    {
        Debug.Log("FixedUpdate");
        Debug.Log("FixedUpdate Time.FixedDeltaTime:" + Time.fixedDeltaTime);
    }

    // Update is called once per frame
    void Update()
    {
        Debug.Log("Update");
        Debug.Log("Update Time.deltaTime:" + Time.deltaTime);
    }
    // LateUpdate is called after Update()
    void LateUpdate()
    {
        Debug.Log("LateUpdate");
        Debug.Log("LateUpdate Time.deltaTime:" + Time.deltaTime);
    }
}

 

 

3.1 Update()

Update()는 Transform을 사용하여, 상태 변화를 처리할 때 사용한다. 

 

Update() 함수는 유니티 시스템에 의해 매 프레임마다 동작한다. 

앞서 언급했듯이, 프레임은 데이터로 저장되어, 디스플레이 장치를 통해 이미지를 표시한다. 데이터를 변환하고, 연산을 처리하는 등에  시간이 소요되며, Update() 함수가 호출되는 주기는 다를 수 있다.

 유니티와 같은 게임 엔진에서 이는 매우 중요한 요소이다. Update() 함수를 어떻게 활용하느냐가 게임의 최적화에 상당한 영향을 미친다. 매 프레임마다 연산을 처리할 필요가 없는 요소들, 불필요한 요소들은 Update() 함수 밖에서 동작하도록 구현하는 것이 좋다. 

 

3.2 FixedUpdate()

FixedUpdate()는 물리적 연산을 처리할 때 사용한다.  

 

Update()와 FixedUpdate()는 다르다. FixedUpdate()는 매 프레임마다 호출이 이루어지지 않는다. FixedUpdate()는 매 고정된 프레임율의 프레임마다 호출된다. 즉, 고정된 프레임율에서 일정하게 호출된다. (아래 4.2의 이미지 참조)

 

3.3 LateUpdate()

LateUpdate()은 Update()와 동일하게 매 프레임마다 호출된다. 하지만 Update()가 호출된 이후에 LateUpdate()가 호출된다.  일련의 로직을 통해 Update()가 호출된 이후에 매 프레임마다, 일련의 작업을 필요로 하는 경우가 있을 것이다. 이러한 로직을 작성할 때 유용하다. 실예로, 캐릭터가 움직인 후에, 카메라가 따라 이동하는 로직이 있다. 

 

4. Time.deltaTime vs Time.fixedDeltaTime

4.1 Time.deltaTime

Update() 함수 주로 쓰인다.

앞서 이미지를 표시하는 속도는 매 프레임 다를 수 있다고 언급했다. Time.deltaTime은 전 프레임 종료 이후 현 프레임까지 걸린 시간이다. (The completion time in seconds since the last frame, Unity documents:Time.deltaTime)

 

4.2 Time.fixedDeltaTime

FixedUpdate()에서 사용한다.

Time.deltaTime과 같다. 하지만 fixedUpdate() → FixedUpdate()의 걸린 시간이다. Update() → Update()가 아니다.

 

아래 이미지는 FixedUpdate(), Update(), LateUpdate()가 호출될 때, 로그를 사용해 Time.fixedDeltaTime, Time.deltaTime를 보여준다. 

Log Time.deltaTime, Time.fixedDetaTime




참조 

 

ko.wikipedia.org/wiki/%ED%94%84%EB%A0%88%EC%9E%84_%EB%A0%88%EC%9D%B4%ED%8A%B8

 

프레임 레이트 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 초당 12프레임의 애니메이션 카툰. 프레임 레이트(Frame rate)란 디스플레이 장치가 화면 하나의 데이터를 표시하는 속도를 말하며, 프레임 속도(frame速度) 또는 프

ko.wikipedia.org



728x90