프로젝트를 진행하면서 코루틴을 정말 많이 사용했고, 인보크는 많이 사용하지 않았었다.
그래서, 구조를 보다가 두개 다 비슷해보이는데 무슨 차이가 있는지 궁금해졌다.
- 여러 개의 루틴이 동시에 실행되며, 서로가 제어를 넘겨주는 방식이다.
코루틴은 서브루틴을 두 축으로 확장한 강력한 서브루틴이라고 한다...
진입점과 탈출점이 여러개이기 때문에 언제든 나가고 돌아오는게 가능하다.
사용 중 강제로 CPU를 빼앗기는 일이 없어서 크리티컬 섹션을 보호하기 위한 락과 같은 동기화 수단이 필요가 없다.
즉, 유니티에서 코루틴은 협력형 멀티태스킹을 구현하는 용도로 사용하며, 여러 Task가 하나의 CPU를 나누어 쓰는 방식이다.
계속해서 사용하던 코루틴은 이렇게 어려운 놈이었다. 조금 더 쉽게 정리하면!
유니티는 멀티 쓰레드를 지원하지 않는다. 그러나 코루틴은 매우 빠른 속도로 동시에 왔다 갔다 하면서 마치 여러개의 쓰레드를 사용하는 것 처럼 보이도록 한다. 그렇기 때문에 멀티쓰레드가 가지는 단점을 보완할 수 있다. 또 매우 가볍다고 한다.
그런데, 정작 C#에는 코루틴을 제공하지 않는다. 그래서 유니티에선 IEnumerable과 IEnumerator를 사용해 쉽게 구현할 수 있도록 이터레이터를 제공해 사용할 수 있도록 해준다. 그래서 내가 IEnumerator와 yield를 사용해 코루틴을 사용해왔던 것이다.
private void Start()
{
StartCoroutine(TestCoroutine());
}
IEnumerator TestCoroutine
{
yield return new WaitForSeconds(1f);
Debug.Log("코루틴 테스트");
}
이렇게 사용하는게 기본형태이며, 코루틴이 시작되면, 1초후 Debug를 실행시킨다.
근데 코루틴은 GameObject가 비활성화되면 실행중이던 코루틴은 정지되며, 다시 활성화가 되어도 재실행되지 않는다.
그래서 내가 직전 프로젝트를 진행하며, 몬스터 리스폰을 위한 오브젝트 풀링을 구현했을 때, 몬스터가 비활성화되어 오브젝트 풀로 들어갔기 때문에 제대로 작동되지 않았던 것이다.
- 매개변수로 넘겨주는 시간만큼 함수를 지연호출한다.