Thứ Năm, 2 tháng 5, 2019

유니티의 코루틴에 대해 1 - yield : 네이버 블로그

코루틴 반복,코루틴 장점,코루틴 종료 확인,코루틴 스레드 차이,코루틴 사용법,코루틴 파이썬,코루틴 유니티,코루틴 단점,코루틴 종료,코루틴 코틀린,

유니티의 코루틴에 대해 1 - yield

코루틴 반복,코루틴 장점,코루틴 종료 확인,코루틴 스레드 차이,코루틴 사용법,코루틴 파이썬,코루틴 유니티,코루틴 단점,코루틴 종료,코루틴 코틀린,

2017. 5. 28. 18:22

이웃추가

이 글은 유니티의 코루틴이 정확히 무엇인지, 내부적으로 어떻게 작동하는지, 그리고 코루틴을 좀 더 최적화 할 수 있는지 알아보려고 작성한다.


Coroutine은 진입점이 여러개인 함수를 의미한다. 일반적인 메서드는 한 번 실행이 시작되면 실행이 종료될 때까지 메서드 호출자에게 실행 제어를 넘기질 않는다. 쉽게 말하면 A메서드에서 B메서드를 호출하면 B메서드의 실행이 종료될 때까지 A메서드는 가만히 기다리고 있어야 한다는 것이다. 그러나 코루틴은 메서드를 실행하는 중간에 메서드 호출자로 진입하는 것이 가능하다.

유니티는 수 많은 사람들의 의문에도 불구하고 Thread-Safety를 전혀 지원하지 않는다. 그래서 비동기에 가까운 작업을 하기 위해서 코루틴을 애용하는 사람들이 많다.

코루틴은 생각보다 이해하기 쉬우며, 정말 강력한 기능을 제공해준다.

void Start() { StartCoroutine(SomeCoroutine()); } IEnumerator SomeCoroutine() { Debug.Log("Start Coroutine"); yield return new WaitForSeconds(1f); Debug.Log("Waited!"); yield return null; Debug.Log("End Coroutine!"); }

우선 위와 같은 코루틴이 있다고 쳐보자.
이 코루틴은 다음과 같은 순서로 동작하게 될 것이다.

1. Start에서 SomeCoroutine이라는 코루틴을 시작하고, 즉시 "Start Coroutine" 이라는 디버그 메세지를 출력한다.
2. 1초를 대기한 다음, "Waited!"라는 디버그 메세지를 출력한다.
3. 1프레임을 대기한 다음 "End Coroutine"라는 디버그 메세지를 출력한다.
4. 코루틴 종료.

와우! 뭔가 비동기 작업을 손쉽게 할 수 있네요! 근데 이런 킹왕짱 코루틴은 어떻게 작동하는 걸까?

코루틴이 어떻게 작동하는지 이해하기 위해선 우선 yield 구문부터 이해해야 한다.

yield라는 것은 반복자의 IEnumerator 객체에 값을 전달(yield)하거나, 반복의 종료를 알리기 위해 사용한다.
유니티 코루틴에서는 다음과 같이 사용한다.

yield statement: yield return object; yield break;

여기서 yield 구문에는 몇 가지의 제약 사항이 존재한다.

1. 메서드 밖에서 yield를 쓰면 에러.
2. 익명 메서드 혹은 람다에서 yield를 쓰면 에러.
3. try-catch-finally에서 yield를 쓰면 대부분 에러.

그렇다... Exception 체크를 하면서 yield 구문을 사용하는 것은 불가능하다...

그렇다면 코루틴에서 yield 구문은 어떻게 작동하는 걸까?

1. yield return
yield return에는 object 타입의 값을 전달하는 역할을 한다.
메서드의 실행 도중에 yield return object에 도달하면 작동하는 순서는 아래와 같다.

1. IEnumerator 객체의 Current 값에 해당 object를 대입한다.
2. 코루틴 메서드의 실행이 일시 정지된다.
3. 엔진에서 Current에 있는 object 값을 가져온다.
4. object의 타입을 체크한 다음, 상황을 판단한다. 만약 object가 WaitForSeconds라면 엔진에서 해당 seconds까지 기다린다.
5. 호출자(유니티 엔진)가 다음 루틴을 실행해도 좋다고 판단했을 경우 MoveNext를 통해 다음 yield 구문을 향해 넘어간다. 만약 다음 yield 구문이 존재하지 않으면 코루틴을 종료한다.

엔진에서 MoveNext 메서드를 호출하면 흐름은 다시 코루틴 내부로 넘어가게 되고, 일시 정지됐던 루틴을 다시 실행하는 것이다.

2. yield break
yield break는 코루틴의 종료를 의미한다. 실행 제어를 코루틴에서 엔진(호출자)에게 바로 넘겨준다. 때문에 yield break 이후에 존재하는 루틴에는 접근할 수 없다.

(아직 작성중, 글 쓰고 보니까 ppt로 만드는게 이해시키기엔 더 쉽겠다...)
다음 글에선 StartCoroutine에 대해 살펴보도록 하겠다.

Link Source : http://m.blog.naver.com/dlwhdgur20/221016139917

Không có nhận xét nào:

Đăng nhận xét