[유니티 C#] 코루틴과 인보크의 차이점

한승호·2022년 8월 4일

C# 공부

목록 보기
5/13

코루틴과 인보크의 차이점

프로젝트를 진행하면서 코루틴을 정말 많이 사용했고, 인보크는 많이 사용하지 않았었다.
그래서, 구조를 보다가 두개 다 비슷해보이는데 무슨 차이가 있는지 궁금해졌다.

코루틴

  • 여러 개의 루틴이 동시에 실행되며, 서로가 제어를 넘겨주는 방식이다.
  • 코루틴은 서브루틴을 두 축으로 확장한 강력한 서브루틴이라고 한다...

  • 진입점과 탈출점이 여러개이기 때문에 언제든 나가고 돌아오는게 가능하다.

  • 사용 중 강제로 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가 비활성화되면 실행중이던 코루틴은 정지되며, 다시 활성화가 되어도 재실행되지 않는다.
그래서 내가 직전 프로젝트를 진행하며, 몬스터 리스폰을 위한 오브젝트 풀링을 구현했을 때, 몬스터가 비활성화되어 오브젝트 풀로 들어갔기 때문에 제대로 작동되지 않았던 것이다.

인보크

  • 매개변수로 넘겨주는 시간만큼 함수를 지연호출한다.
  • 인보크는 코루틴과 다르게 GameObject가 비활성화되어도 호출이된다. 즉, 실행이 된다는 뜻이다.
    그래서 내가 오브젝트 풀링에서 코루틴으로 사용하던 걸 인보크로 바꾸어서 해결했다.
profile
모든 실수를 경험해 더 발전하고 싶은 개발자입니다.

0개의 댓글