[C#, 유니티] 11. Coroutine

2022. 7. 19. 16:41코딩 2막 <C#개념편>

728x90

오늘은 코루틴에 관하여 소개하겠습니다

코루틴은 합성어로 co + routine을 직역하면

서로 협력하는 루틴을 뜻하는 일종의 루틴이다

 

1. 멀티스레드 장점과 단점
장점 : 일 처리속도가 빠르다
단점 : 중복되는 교차상태가 있을 경우 연산이 복잡해진다
-> 유니티는 싱글스레드를 권장함

2. 싱글스레드 형태의 코루틴
멀티스레드의 병렬적 처리를 흉내내는 기법으로, 엄밀히 말하면 멀티스레드는 아님

IEnumerator 
열거자, 순서
순서대로 제공해주는 함수

*Update를 쓰는것 : 내용이 있든 없든 매프레임마다 무조건 호출됨
*Update보다 코루틴을 쓰는게 유리한 이유 :진입점과 호출점을 설정해줄수 있음

 

Unity에서는 싱글스레드를 권장하기때문에

개발자는 멀티스레드를 사용해야 하는 상황에서

코루틴을 통해 제 기능을 할 수 있다


IEnumerator과 IEnumerable의 차이

쉽게 말해서 IEnumerator는 순서이고, IEnumerable은 순서를 가져올 수 있는 놈이다

1
2
3
4
5
6
7
8
9
10
namespace System.Collections
{
    public interface IEnumerator
    {
        object Current { get; }
 
        bool MoveNext();
        void Reset();
    }
}
cs
1
2
3
4
5
6
7
namespace System.Collections
{
    public interface IEnumerable
    {
        IEnumerator GetEnumerator();
    }
}
cs

  코루틴을 쓰기 위해서는 IEnumerator를 리턴타입으로 가지는 함수를 만들어야 한다

그럼 코루틴을 적용한 스크립트를 확인해보자

TestFunc();이 호출되면 결과는 무한루프에 빠져 터지게 된다 (에러발생)

 

그렇기 때문에 TestCo()라는 코루틴을 만들어 이를 해결할 수 있다

쉽게 말해 코루틴은 노예를 만들어서 일을 처리 한다

동시에 일을 처리해 보이는 것처럼 보이지만 멀티스레드와는 다르게

동시에 일을 하지 않고 update 다음으로 동시에 일을 처리하는 것처럼 보인다

 

그럼 왜 코루틴은 무한루프에 안 빠지는건가요? 

바로 yield return을 썼기 때문이다

 

코루틴은 yield return라고 하는 특별한 return을 사용하는 데
        뒤 조건이 만족할때까지 함수의 흐름을 다른곳으로 돌려주는 역할을 한다

 

또 yield return 다음 WaitForSeconds(기다릴 시간 초) 를 붙이면 원하는 시간 차이로 코루틴이 호출된다

출력 결과

 


공감해주셔서 감사합니다

728x90