2020 이전/이것저것

Coroutine

이상해C++ 2018. 11. 3. 23:51

코루틴은 비선점형 멀티태스킹을 위해 서브루틴을 일반화한 프로그램 요소입니다. 보통의 함수가 return 되는것에 비해 코루틴은 suspend로 잠시 자신의 작업을 홀드하고 다시 작업이 재개할 수 있으며 이를 위해 다수의 진입 포인트를 허용합니다. 

  

멀티스레드 vs 코루틴:

코루틴은 쓰레드가 아니므로 비동기가 아닙니다(동시에 실행되지 않는다). 코루틴은 공유 메모리영역, 공유 자원을 읽거나 변경시키지 않습니다. 


유니티에서의 코루틴:


닷넷은 멀티쓰레드를 지원하지만 유니티는 단일 쓰레드로 동작한다. 멀티 스레드를 사용할 경우 교착 상태 경합 등 신경써야할 부분이 많아진다. 코루틴은 스레드를 사용하지 않고 멀티 태스킹을 가능하게 한다. 유니티에서의 Update함수는 1프레임에 한번 호출되는데 매 프레임마다 yield return 할 코루틴이 있는지 체크.


유니티에서 함수에서 수행되는 작업은 하나의 프레임에서 수행된다는 것을 의미하고, 함수 호출은 절차적 애니메이션을 포함하거나 시간의 경과와 함께하는 이벤트에는 사용할 수 없습니다. 코루틴은 실행을 중지하여 Unity에 제어권을 돌려주고, 계속할 때는 다음 프레임에서 중지한 곳부터 실행을 계속할 수 있는 기능입니다. C#에서 코루틴은 다음과 같이 선언합니다:


IEnumerator Fade() {
    for (float f = 1f; f >= 0; f -= 0.1f) {
        Color c = renderer.material.color;
        c.a = f;
        renderer.material.color = c;
        yield return null;
    }
}

해당하는 함수는 IEnumerator를 반환하며 yield return을 통해 다음 프레임에서 실행을 재개할 수 있습니다.


void Update() {
    if (Input.GetKeyDown("f")) {
        StartCoroutine("Fade");
    }
}
StartCoroutine으로 코루틴을 실행합니다. 유니티 스크립트에서는 yield statement를 포함하는 함수는 IEnumerator로 해석되어 따로 명시하지 않아도 됩니다. 코루틴 시작또한 일반 함수처럼 호출가능합니다.


이 방법으로 효과를 일정한 시간 범위에서 펼칠 수 있지만, 최적화 방법으로 해도 편리합니다. 게임 중의 태스크는 정기적으로 수행해야 하며, 간단한 방법은 Update 함수에서 할 수 있습니다. 그러나 이 함수는 초당 몇 번이나 호출됩니다. 작업이 너무 자주 반복할 필요가 없는 경우, 코루틴에 넣어 매 프레임 실행하지 않고 정기적으로 업데이트 할 수 있습니다.


//예를 들자면, 적이 근처에 있는 것을 플레이어에게 알리는 알람입니다: function ProximityCheck() { for (int i = 0; i < enemies.Length; i++) { if (Vector3.Distance(transform.position, enemies[i].transform.position) < dangerDistance) { return true; } } return false; } //적이 많을 경우 매프레임 함수를 호출하는 오버헤드가 많아질 것이다 :1/10초 마다 체크할 수 있도록 IEnumerator DoCheck() { for(;;) { ProximityCheck; yield return new WaitForSeconds(.1f); } }


참고:

introduction to c++ 코루틴: https://www.youtube.com/watch?v=YYtzQ355_Co

Lua 코루틴 : https://www.youtube.com/watch?v=rjY2UbEqWII

유니티에서 코루틴: https://docs.unity3d.com/kr/530/Manual/Coroutines.html

유니티에서 코루틴2: http://theeye.pe.kr/archives/2725

유니티에서 코루틴3: http://teddy.tistory.com/22

코루틴: https://kwangyulseo.com/2015/05/15/%EC%BD%94%EB%A3%A8%ED%8B%B4coroutine-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0/

코루틴2: http://blog.naver.com/kimsk99/50002970193

코루틴:3 https://medium.com/@jooyunghan/%EC%BD%94%EB%A3%A8%ED%8B%B4-%EC%86%8C%EA%B0%9C-504cecc89407

'2020 이전 > 이것저것' 카테고리의 다른 글

드로우 콜과 텍스처 아틀라스와 배치와 인스턴싱  (0) 2018.11.08
xml & json  (0) 2018.11.05
Singleton  (0) 2018.11.04
RTTI(Run-Time Type Information)  (0) 2018.11.03
Google C++ Style Guide  (0) 2018.11.03