본문 바로가기
프로그래밍/Unity

코루틴

by 뽀도 2015. 5. 20.


일단 일반적으로 사용하는 함수는 하나의 진입 지점에서 시작해 return 구문으로 데이터를 전달하고 함수는 완전히 종료됩니다.

이러한 함수를 서브루틴 이라 부릅니다.


코루틴은 이를 더 일반화한 개념으로 진입하는 지점을 여러개 설정할 수 있어 return 구문으로 데이터를 전달한 후에 다시 진입할 수 있는 함수를 의미합니다. 

IEnumerator 함수명 (인자) 

IEnumerator 는 우리말로 열거자라고 하는데, 데이터 목록을 하나씩 넘겨줄 때 사용되는 인터페이스 입니다.

이 열거자 인터페이스를 사용해 코루틴은 자신을 호출한 함수와 서로 협동하듯이 데이터를 주고 받으면서 진행합니다.

받은측에서는 데이터를 받고 나서 처리한 후 코루틴에게 다음 데이터를 달라고 요청합니다.

대기하고 있던 코루틴은 요청을 받으면 깨어나 다시 데이터를 넘겨준 후에 대기하는 작업을 계속 반복합니다.


코루틴은 자신을 호출한 함수에 데이터를 전달하고 대기하고 있어야 하는데, 이를 위해 yield return 이라는 특수한 키워드를 제공합니다.

유니티에서 코루틴과 협동하는 주체는 유니티 엔진입니다.

코루틴이 시작되면 유니티 엔진에 특정 객체를 전달함으로써 엔진으로 하여금 원하는 작업을 수행하게 명령 할 수 있습니다.

가장 대표적인 객체로 waitForSeconds를 예로 들 수 있습니다. 이를 사용하면 그림 과 같이 유니티 엔진에게 지정한 시간이 지나면 잠자고 있는 자신을 깨워 달라고 명령할 수 있습니다.

코루틴이 사용하면 특정한 경우 스크립트에서 성능을 개선시킬 수 있습니다.

예를 들어 코루틴에서 yeild return new WaitForSeconds(10) 이라는 명령을 수행하면 코루틴은 유니티 엔진에게 10이 설정된 WaitForSeconds 객체를 보내고 쉽니다. 유니티 엔진은 이를 받아 10초 대기한 후 쉬고있는 코루틴을 깨워 다음 구문을 실행시킵니다.

코루틴을 사용하지 않고 update함수를 사용하여 구현한다면 로컬 멤버 변수를 하나 선언하고 Time.deltaTime을 더해 10초가 지났는지 감지해야 하는데, 프레임의 평균 소요 시간이 0.01초라 가정한다면 10초가 지났는지 감지하기 위해 비교적 호출에 부하가 큰 Update함수를 1,000번 호출해야 합니다.

자원이 부족한 모바일 기기에 이러한 코루틴의 장점을 적극적으로 활용하면 성능 향상에 큰 도움이 됩니다. 


[ 출처 : 유니티 4 게임 개발의 정석 , 저자 - 이득우]



반응형

'프로그래밍 > Unity' 카테고리의 다른 글

What is the difference between a thread and fiber?  (0) 2015.06.04
Interlocked 클래스  (0) 2015.06.04
[c#] 속성 : property  (0) 2015.05.28
IDisposable 인터페이스  (0) 2015.05.28
Unity Build 하기!  (0) 2015.05.20

댓글