코루틴은 비선점형 멀티태스킹을 위해 서브루틴을 일반화한 프로그램 요소입니다. 보통의 함수가 return 되는것에 비해 코루틴은 suspend로 잠시 자신의 작업을 홀드하고 다시 작업이 재개할 수 있으며 이를 위해 다수의 진입 포인트를 허용합니다.
멀티스레드 vs 코루틴:
코루틴은 쓰레드가 아니므로 비동기가 아닙니다(동시에 실행되지 않는다). 코루틴은 공유 메모리영역, 공유 자원을 읽거나 변경시키지 않습니다.
유니티에서의 코루틴:
닷넷은 멀티쓰레드를 지원하지만 유니티는 단일 쓰레드로 동작한다. 멀티 스레드를 사용할 경우 교착 상태 경합 등 신경써야할 부분이 많아진다. 코루틴은 스레드를 사용하지 않고 멀티 태스킹을 가능하게 한다. 유니티에서의 Update함수는 1프레임에 한번 호출되는데 매 프레임마다 yield return 할 코루틴이 있는지 체크.
유니티에서 함수에서 수행되는 작업은 하나의 프레임에서 수행된다는 것을 의미하고, 함수 호출은 절차적 애니메이션을 포함하거나 시간의 경과와 함께하는 이벤트에는 사용할 수 없습니다. 코루틴은 실행을 중지하여 Unity에 제어권을 돌려주고, 계속할 때는 다음 프레임에서 중지한 곳부터 실행을 계속할 수 있는 기능입니다. C#에서 코루틴은 다음과 같이 선언합니다:
IEnumerator Fade() { for (float f = 1f; f >= 0; f -= 0.1f) { Color c = renderer.material.color; c.a = f; renderer.material.color = c; yield return null; } }
해당하는 함수는 IEnumerator를 반환하며 yield return을 통해 다음 프레임에서 실행을 재개할 수 있습니다.
void Update() { if (Input.GetKeyDown("f")) { StartCoroutine("Fade"); } }StartCoroutine으로 코루틴을 실행합니다. 유니티 스크립트에서는 yield statement를 포함하는 함수는 IEnumerator로 해석되어 따로 명시하지 않아도 됩니다. 코루틴 시작또한 일반 함수처럼 호출가능합니다.
//예를 들자면, 적이 근처에 있는 것을 플레이어에게 알리는 알람입니다: function ProximityCheck() { for (int i = 0; i < enemies.Length; i++) { if (Vector3.Distance(transform.position, enemies[i].transform.position) < dangerDistance) { return true; } } return false; } //적이 많을 경우 매프레임 함수를 호출하는 오버헤드가 많아질 것이다 :1/10초 마다 체크할 수 있도록 IEnumerator DoCheck() { for(;;) { ProximityCheck; yield return new WaitForSeconds(.1f); } }
참고:
introduction to c++ 코루틴: https://www.youtube.com/watch?v=YYtzQ355_Co
Lua 코루틴 : https://www.youtube.com/watch?v=rjY2UbEqWII
유니티에서 코루틴: https://docs.unity3d.com/kr/530/Manual/Coroutines.html
유니티에서 코루틴2: http://theeye.pe.kr/archives/2725
유니티에서 코루틴3: http://teddy.tistory.com/22
코루틴2: http://blog.naver.com/kimsk99/50002970193
코루틴:3 https://medium.com/@jooyunghan/%EC%BD%94%EB%A3%A8%ED%8B%B4-%EC%86%8C%EA%B0%9C-504cecc89407
'2020 이전 > 이것저것' 카테고리의 다른 글
드로우 콜과 텍스처 아틀라스와 배치와 인스턴싱 (0) | 2018.11.08 |
---|---|
xml & json (0) | 2018.11.05 |
Singleton (0) | 2018.11.04 |
RTTI(Run-Time Type Information) (0) | 2018.11.03 |
Google C++ Style Guide (0) | 2018.11.03 |