Unity Coroutine(코루틴)과 Update

2020. 2. 9. 17:40유니티/자료

Life Cycle

유니티는 한번에 하나의 작업만 처리하는 단일 스레드 방식으로, 기본적으로 이벤트 함수들을 기준으로 순환하는 함수 호출 주기(Life cycle)가 존재한다. 아래는 이벤트 함수들의 실행 순서를 대략적으로 나타낸 순서도이다.

 

 

여기서 Update 형태를 가진 이벤트 함수들은 일정 주기마다 반복되며 순환하는 모습을 가지기 때문에 프로그램이 실행되는 동안 계속 수행되어야할 스크립트를 보통 이곳에 작성한다.

Coroutine (코루틴)

그렇다면 코루틴은 무엇이며 왜 굳이 Update 함수를 두고 이것을 써야할까?

일단 코루틴의 장점을 알기 위해서는 기본 이벤트 함수 싸이클에서 코루틴이 어떤 순서로 위치하는지 알아야 한다.

아래 그림을 통해 결론부터 설명하자면,

어떤 코루틴이 시작되면서 한번의 실행이 끝나고 나면 그 코루틴은 Update이후의 순서로 위치하게 된다.

 

그렇다면 기존의 Update 이후에 실행되는 LateUpdate와는 어떤 점이 다를까?

아까도 말했다시피 유니티는 동시에 여러 함수를 처리할 수 없기 때문에 순서대로 하나씩 수행하며 순환한다.

Update와 같은 함수들(FixedUpdate, LateUpdate)은 고정된 일정 주기(프레임 등)를 가지고 수행되지만, Coroutine은 일반 함수들과 다르게 자체적으로 yield라는 함수 제어권을 가지고 있기 때문에 자신이 원하는 타이밍에 yield를 던져 잠시 수행을 멈춘 뒤 다음 순서로 넘어가게 할 수 있다. 그리고 다시 Update 이후 자신의 순서가 돌아오면 이전에 멈췄던 지점에서 다시 코드를 실행한다.

함수의 제어권을 넘기는 yield의 종류는

yield return null; - 다음 프레임까지 대기

yield return WaitForSeconds(float f); - 일정 시간동안 대기

yield return break; - 코루틴 종료

이외의 yield의 종류들

 

 

코루틴의 장점

1. 앞선 예제와 같이 원하는 타이밍에 맞춰 코드들을 실행 시킬 수 있음 (시간이 유동적인 복잡한 타이머 짜기 좋음)

2. StartCoroutine / StopCoroutine으로 시작, 종료를 할 수 있어 필요한 것만 작동시키고 끌 수 있음

3. 반복되는 여러 기능들이 Update에서 섞일 필요 없이 따로 코루틴 별로 관리 할 수 있어서 관리가 편함

코루틴의 단점

1. 스크립트가 Disable 될때 코루틴도 같이 종료 시켜주어야 하는 번거로움이 있음

2. 선형적인 코드 작성 방식에서 벗어나기 때문에 빠른 코드 해석이 어려워 질 수 있음

3. 쓰레기 메모리 (가비지)를 자주 생성함

앞서 언급한 단점 중, 코루틴이 가비지를 자주 생성한다는 내용에 대해 대표적인 원인으로는 아래 두가지가 있다.

1. StartCoroutine

코루틴을 실행하기 위해 호출하는 함수인데, 코루틴의 인스턴스를 생성하는것이 가비지를 많이 생성한다고 한다. 결론적으로 말하면 이건 해결 방법이 없다. 유니티 엔진 내부 코드라서 따로 최적화 할 수 없다는 것.. 그냥 최소한으로 호출하는게 좋다고 한다. (코루틴을 자주 껐다 키면 안좋다는 얘기)

2. YieldInstruction

일정 조건을 이용해 yield문을 던질 때, new WaitForSeconds와 같이 그 뒤에 새로 인스턴스를 생성하는 부분이 문제가 된다는 것이다. 매번 반복 될때 마다 새로운 인스턴스가 생성되기 때문인데, 만약 사용하는 yield문이 동일한 초나, 동일한 조건으로 계속 반복되는 상황이라면 간단히 캐싱을 통해 해결할 수는 있다. 최적화에 대한 자세한 내용은 여기를 참고하면 좋을 것 같다!


결론

1. 복잡한 조건이 필요 없이 계속 사용하는 반복 함수는 굳이 코루틴 쓰지말고 Update에 넣자

2. 똑같은 조건으로 반복되는 코루틴에서 Wait문을 꼭 캐싱해서 사용하자

3. 코루틴을 수시로 시작하고 종료하는 짓은 절대 하지말자

 

 

 

 

- 출처 -

https://m.blog.naver.com/PostView.nhn?blogId=hana100494&logNo=221626194462&proxyReferer=https%3A%2F%2Fwww.google.com%2F