프로그래밍 농장

Update()와 Game Loop 에 대한 이해 [Unity] 본문

Unity

Update()와 Game Loop 에 대한 이해 [Unity]

Tennessee201 2022. 11. 7.
728x90

Update()와 Game Loop


유니티 엔진의 Update()는 매 프레임 호출되며 이동, 회전, 입력, 실시간 계산 등 수많은 기능을 여기에 작성한다. 그렇다면 Update()의 정체는 무엇일까?

Game Loop

그래픽스 라이브러리를 통해 구현되는 게임은 기본적으로 Game Loop(게임 루프)를 통해 프레임 기반 동작이 수행된다. 

DirectX, OpenGL, Vulkan . . . 등 어떤 그래픽스 라이브러리를 사용하더라도, 

/* Main Function */

// Game Loop
while(...)
{
    // User Inputs..
    // Game Logics..
    // Draw Calls..
    // ...
}

위와 같이 메인 스레드에 무한 반복문을 통해 게임 루프를 작성하며 이 게임 루프의 반복이 프레임의 진행을 의미한다.

즉, 게임 루프 내부를 한 번 실행하면 한 프레임이 지난 것이다. 

Update() 동작 루틴

그리고 Update()의 호출은 게임 루프의 1회 반복에 대응된다. 

정확히는 게임 루프 내에서 매 반복마다 모든 Update()가 한 번씩 호출되는 것이다. 

// Game Loop
while(...)
{
    // ...
    
    game->Update();
    
    // ...
}

그런데 유니티 엔진에서는, MonoBehaviour.Update()는 스크립트에 작성하기만 하면 알아서 동작하는데 상관없지 않나? 

-> 라고 생각할수 있지만, 유니티 같은 상용 엔진도 저 게임 루프가 엔진 코어 내에 숨겨져 있을 뿐, 근본적인 구조는 다르지 않다.

Update() 메소드가 존재하는 모든 MonoBehaviour를 찾아서 스크립팅 런타임이 내부적으로 저장해놓았다가 게임 루프에서 일괄적으로 순회하며 호출해주는 방식이다. 

유니티 엔진은 프로그래머의 편의를 위해서 이러한 방식을 채택했다고 한다.

// Unity Game Loop
while(...)
{
    // ...
    
    foreach(var m in monoBehavioursWhoHaveUpdateMethod)
    {
        m.Update();
    }
    
    // ...
}

또한 Update() 내에서 단골로 호출되는 Time.deltaTime은 게임 루프의 이전 수행과 현재 수행 간의 시간 간격을 저장한 값이다. 이를 통하여 비주기적으로 실행되는 게임 루프 반복 간의 시간 보정을 해줄수 있게 된다. 


 

References :

https://maxidea1024.tistory.com/144

 

Game Loop

게임 루프(Game Loop)에 대한 이해 Tistory markdown 지원이 매끄럽지 못한듯 싶습니다. github에도 올려두었으니 참고하세요. https://github.com/maxidea1024/public-articles/blob/master/tick.md?fbclid=IwAR3AfnI38qB57vOVd-bN5mVbJ

maxidea1024.tistory.com

https://rito15.github.io/posts/unity-fixed-update-and-physics-loop/

 

유니티 - FixedUpdate()와 Physics Loop에 대한 이해

Update()와 Game Loop

rito15.github.io

 

728x90