게임개발/스터디

[스터디] Invoke vs Coroutine

감물 2024. 6. 17. 14:11

Invoke 함수란 무엇인가?

(, 규칙 등을) 들먹이다. (누구의 이름을) 부르다, (프로그램 등을) 불러오다.

 

하나의 Form을 다른 thread에서 접근하게 될 경우에 기존의 Form과 충돌이 날 수 있다. 이때 invoke를 사용하여 실행하려고 하는 메소드의 대리자(delegate)를 실행시키면 된다. 멀티스레드 환경에서 데이터 보호를 위해 Invoke를 써야 한다.

 

응용 프로그램이 실행될 때 기본적으로 하나의 스레드가 발생한다. 이것을 Main 스레드라고 부르는 이유는 Main() 함수가 이 스레드의 시작점이기 때문이다. Main() 함수를 보시면 폼을 띄운다. 결국 메인 스레드가 메인폼의 이벤트 처리를 담당하면서 메인폼의 각종 컨트롤들의 값을 읽고 쓰는 작업을 수행한다.

 

메인폼에서 다른 폼을 띄울 경우에도 기본적으로 메인 스레드가 자식 폼의 컨트롤들까지 모두 소유한다. 그런데, 별도의 스레드에서 폼의 컨트롤을 액세스하면 데이터(컨트롤?)가 깨질 수 있다. 따라서, 별도의 스레드는 메인 스레드에게 컨트롤을 읽고 쓰는 작업을 위임하여 수행하게 하면 안전하다. 그래서 외부 스레드가 메인폼의 Invoke를 호출하는 것이다.

 

[별도의 스레드]에서 [main_form.Invoke(xxx)를 호출] 한다는 것은,

[별도의 스레드] [main_form을 소유한 스레드]에게 [xxx 함수의 호출을 위임]한다는 뜻이다.

 

Invoke를 적은 뒤에 실행할 함수의 이름을 적고 바로 뒤에는 몇 초 뒤에 실행할 것인지를 적어준다. 여기서 주의할 점은 실행할 함수의 이름을 string으로 입력해야 하기 때문에 " " 안에 이름을 입력해야 한다.

 

코루틴은 여러개의 엔트리 포인트를 두어 여러 패턴으로 시간 간격을 컨트롤 할 수 있다. 일정 간격으로 단순 반복하는 경우는 InvokeRepeating이 편하다.

 

StartCoroutine의 경우 직접 entry point를 지정하여 리턴할 수 있고, invoke의 경우 함수 이름과 delay 시간을 주어 함수 내부에서 delay 하여 실행시켜 준다. 만약 좀 더 세심한 조작을 하고 싶다면 Coroutine 함수를 작성하여 StartCoroutine을 이용해 작동시키면 된다.

 

 

https://velog.io/@livelyjuseok/%EC%9C%A0%EB%8B%88%ED%8B%B0-%EC%BD%94%EB%A3%A8%ED%8B%B4%EA%B3%BC-Invoke%EC%9D%98-%EC%B0%A8%EC%9D%B4

 

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

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

velog.io