2016. 2. 25. 14:20

코루틴의 특성


1. 특정 작업을 단계적으로 발생하게 한다.

2. 시간이 흐름에 따라 발생하는 루틴을 작성할 수 있다.

3. 다른 연산이 완료될때까지 기다리는 루틴을 작성할 수 있다.

예를 들어, 컷 씬 시퀀스를 조직하거나 또는 단순히 적이 죽는 애니메이션을 기다린 다음, 재생성을 할 수도 있다.


만약 단지 몇 초 동안 특정 연산을 지연시키기를 원한다면, Invoke를 사용하는 것을 고려해보자..


우선, 확실하게 알고 넘어가자, 코루틴은 쓰레드가 아니다. 코루틴은 비동기가 아니다


헷갈릴수 있는데, 쓰레드는 프로그램에서 다른 쓰레드와 함께 비동기로 실행된다.

멀티프로세서 기계에서, 쓰레드는 실제 다른 쓰레드와 함께 동시에 코드가 실행될 수 있다.


그래서 코루틴이 무엇인가?


코루틴은 쓰레드가 아니다. ,  코루틴은 한번에 하나의 코루틴이 싱행되고, 게임의 메인쓰레드에 맞춰서 실행된다. 사실 함수를 호출하는것처럼 게임의 핵심 기능을 호출하는것과 같다,


따라서 코루틴은 쓰레드가 아니며 비동기도 아니기 때문에 사용할때 절대 동기화나 특정 값을 잠금하는것에 대한 걱정이 필요없다.

당신이 yield를 실행하여 완전히 통제 할 수 있기 때문이다.


따라서 코루틴이란, 부분적으로, 그리고 특정한 상황이 맞아 떨어졌을 때 실행되는 함수로써, 그 작업이 완료가 되기전까지, 미래의 어느시점에 재개 될 수 있는 함수이다.




위에 표를 보면 yield로 끈어준 코루틴들이 각각의 알맞는 상황에 호출된다.


밑에 간단한 코루틴을 보자


1
2
3
4
5
6
7
8
IEnumerator TestCoroutine()
{
      while(true)
      {
           Debug.Log(Time.time);
           yield return null;
      }
}
cs



이 코루틴은 영원히 작동하는 루프를 가지고 있다. 이 코루틴은 현재 시간으로 로그를 남기고, 그 다음 yield한다. 다시 재개될 때, 다시 루프를 돌아서 로그를 남기고, 한번 더 yield될 것이다.


루프안에 있는 코드는 정확하게 Update 함수와 같다. 단지 순서에따라 업데이트 다음에 실행될 뿐이다.


StartCoroutine(TestCoroutine())를 호출할 때, 코드는 첫번째 yield를 만날때까지 즉시 실행되며,

유니티 프로세스가 이 객체에 대해서 코루틴을 처리할 때, 다시 재개된다.


위에 있는 도표에 맞춰 코루틴안에서 호울하는 yield에 따라 다음 호출되는 지점이 달라진단느 것을 알 수 있다.


null - Update구문의 수행이 완료될 때까지 대기한다.


WaitForEndOfFrame - 현재 프레임의 렌더링 작업이 끝날 때까지 대기한다.


WaitForFixedUpdate - FixedUpdate구문의 수행이 완료될 때까지 대기한다.


WaitForSeconds - 지정한 초만큼 대기한다.


WWW - 웹에서 데이터의 전송이 완료될 때까지 대기한다.

(WaitForSeconds or null처럼 재시작한다.)


Another coroutine - 새로운 코루틴은 yielder가 재시작되기 전에 완료 될 것이다.



또한 yield break; 명령어를 실행할 수 있다. 이는 즉시 코루틴을 멈춘다.



요약


코루틴은 시간에 따라 혹은 외부의 처리가 완료되었을 때, 연산이 일어나는 순서를 정하는 정말 멋진 방법이다.


코루틴은 쓰레드가 아니다. 그리고 비동기가 아니다(동시에 일어나지 않는다.)


코루틴이 실행되고 있을 때, 다른 어떤 것들도 실행되지 않는다.


코루틴은 yield 문의 조건을 만족시켰을 때, 재개될 것이다.



Posted by 시리시안