유니티 - 코루틴과 Invoke의 차이

Justin·2022년 7월 16일
0

유니티

목록 보기
1/9
post-custom-banner

검색을 하던 도중 코루틴과 Invoke의 차이점에 대해 묻는 질문을 발견했고, 나는 명확하게 대답하지 못해 해당 지식에 대한 정리를 해두고자 글을 작성한다.

🌐 코루틴

Cooperate(협력하다) 할때 Co와 routine이 합쳐진 Co-routine은 여러개의 루틴이 동시에 실행되게 해주며 멀티쓰레드가 아닌 유니티에서 마치 멀티쓰레드 처럼 보여 병렬적인 구조를 만드는 기능이다.

코루틴을 사용할 때는 Yield return을 해주어야 하는데, 이를 통해서 현재 위치를 기억하고 다른 루틴에게 수행권한을 넘겨주고 다시와서 처리하는 방식이다.

멀티 쓰레드 같지만 단일 쓰레드이기에 Race Condition과 같은 멀티 쓰레드에 문제점을 고민하지 않아도 된다.

💽 코루틴 특징

  • 코루틴은 해당 GameObject가 inactive일때 동작하지 않는다.
  • 정지 된 코루틴은 다시 GameObject가 Active 되더라도 다시 동작하지 않는다.(다시 실행을 시켜주어야한다.)
  • yield return new WaitForSeconds(시간) 이게 너무 편하다.. 함수 중간 중간 쉬었다가 동작 시킬 수 있는데 매우 간편하고, Update를 통해 Timer를 만들어 시간을 재는것 보다 효율적이다.

    왜 효율적인가?
    5초 뒤 동작을 위해 코드를 구현할 떄 Update에서는 초당 50프레임 정도를 동작하면서 250번을 호출하면서 동작을 하는데, 코루틴은 엔진에게 5초 뒤에 깨우라고 맡기고 쉬다가 동작하니 더 효율적일 수 밖에 없다.

🎇 Invoke

인보크는 코루틴에 비해 비교적 간단하다. 함수를 대신 실행시켜준다. 또한 간단한 방법으로 지연시간 뒤에 함수를 동작하게도 할 수 있다.

Invoke( "함수명"(string) , 지연시간(float));

다만 Invoke는 Reflection을 통해 값을 가져오는데 이 방식이 코루틴 보다는 느리다. 코루틴이 메서드 자체를 인자로 받아가는 것과는 다르게 메서드의 이름을 받아간다.

Reflection
프로그램 실행 도중에 객체의 정보 조사, 다른 모듈에 선언된 인스턴스를 생성, 기존 개체에서 형식을 가져오고 해당하는 메서드를 호출, 접근할 수 있는 강력한 기능
-> 코루틴도 string으로 부를 수 있는데 이때도 리플렉션이 동작되는건가 궁금한데 찾아도 잘 나오지 않는다. 더 공부해보고 추가 글을 남겨야겠다.

👓 인보크 특징

  • Invoke는 GameObject가 비활성화 되더라도 동작을 한다.
  • InvokeRepeating을 통해 지속 반복 동작을 시킬 수 있다.
    -> CancelInvoke, 오브젝트를 파괴하여 종료해주어야 한다.

✅ 차이점

결국은 글에서 언급하면서 나오긴 했지만 다시 정리하자면

  • 코루틴은 GameObject가 활성화 일때만 동작, 인보크는 파괴 전 까지 동작
  • 코루틴은 매개변수 전달 가능, Invoke는 불가능
  • 코루틴은 TimeScale이 0인 경우에도 동작 시킬 수 있다.
    -> yield return new WaitForSecondsRealtime()를 사용
  • 리플렉션의 차이로 코루틴의 속도가 조금 더 빠르다.

공부중인 내용이라 틀릴 수도 있습니다. 추가로 부족한 부분이 있으면 조언 부탁드립니다.

profile
인디 게임을 만들며 공부하고 있습니다.
post-custom-banner

0개의 댓글