고현우
개발 일지
고현우
전체 방문자
오늘
어제
  • 분류 전체보기 (14)
    • Unity (7)
      • 작업 (1)
      • 지식 (6)
    • DirectX (0)
      • 작업 (0)
      • 지식 (0)
    • C# (3)
      • 디자인 패턴 (0)
      • 알고리즘 (1)
      • 자료구조 (0)
      • 지식 (2)
    • C++ (0)
      • 디자인 패턴 (0)
      • 알고리즘 (0)
      • 자료구조 (0)
      • 지식 (0)
    • 필수 지식 (4)
      • 물리 (0)
      • 선형대수학 (0)
      • 셰이더 (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 뷰포트좌표
  • 프래그먼트셰이더
  • VertexShader
  • Z-Up
  • .NET
  • 메모리 계층
  • 셰이더
  • Y-Up
  • Unity
  • 렌더링파이프라인
  • 스크린좌표
  • 버텍스 셰이더
  • 로컬좌표
  • Shader
  • RenderingPipeline
  • 월드좌표
  • 그래픽스API
  • 선형 탐색 알고리즘
  • 비동기
  • 래스터라이저

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
고현우
Unity/지식

[Unity] 메인 루틴과 서브루틴, 코루틴(Co-routine) 에 대해 알아보자

[Unity] 메인 루틴과 서브루틴, 코루틴(Co-routine) 에 대해 알아보자
Unity/지식

[Unity] 메인 루틴과 서브루틴, 코루틴(Co-routine) 에 대해 알아보자

2022. 1. 11. 23:33

메인 루틴과 서브루틴

 

먼저 코루틴을 알아보기 전에 메인 루틴과 서브루틴이

무엇인지 간략하게 소개하고 넘어 가도록 하겠다.

 

우선 메인루틴(Main-routine)은

우리가 익히 잘 알고 있는 유니티 내부의

Start, Update 함수 등을 지칭한다

 

다음으로 서브루틴(Sub-routine)은

어떠한 작업을 처리하기 위해

사용자가 직접 만든 함수 등을

서브 루틴이라고 부른다

 

보통, 서브루틴이 메인 루틴에 종속된

상태로 호출받는 입장으로, 서브루틴에서

반환 값이 있다면 그 값을 이용하는 방식이다.

 


코 루틴(Co-routine)

 

코 루틴은 호출한 메인 루트와 함께 실행되는

방식이다, 여기서 Co-routine의 'Co'는 '동등한',

'협력관계'의 의미이기도 한다

 

코 루틴의 선언 방식은 아래와 같다

using System.Collections;
using UnityEngine;

public class TestCoroutine : MonoBehaviour
{
    private IEnumerator Test()
    {
        yield return null;
    }
}

이처럼 코 루틴은 함수의 반환 타입을 IEnumerator 인터페이스를

사용해야 되며, 무조건 하나 이상 yield return 구문을 써주어야 한다

 

코 루틴에서의 내부 기능을 실행하다가, yield return 구문을 만나게 되면

yield return 구문으로 지정한 명령어에 맞게 실행하고, 다시 코 루틴을

호출한 루틴으로 제어권을 넘기게 되는데 null 은 1 프레임을 호출자에게

양보해준다는 뜻이며, yield return 구문으로 지정한

명령어는 null 뿐만이 아닌 다양하게 존재한다.

 

만약 1 프레임이 아닌 5초 동안 제어권을 넘겨주고 싶다면

 

using System.Collections;
using UnityEngine;

public class TestCoroutine : MonoBehaviour
{
    private IEnumerator Test()
    {
        yield return new WaitForSeconds(5.0f);
    }
}

이런 식으로 yield return 구문 뒤에 null이 아닌 WaitForSeconds라는

클래스 형식에 대기시간을 인자로 넘겨 new로 할당해준다

 

이렇게 하면 실행 제어권을 5초간 넘기게 되고

5초가 지나게 되면 중단된 코드 위치로 복귀하여

코 루틴 함수의 작업을 이어가게 된다.

 

이처럼 함수가 시작되는 위치를

진입 지점(Entry Point)라고 하는데

코 루틴이 서브루틴과의 결정적인 차이점이라 함은

호출될 때마다 처음부터 다시 실행되는 진입지점이

하나인 서브루틴과는 달리 코 루틴은 진입 지점을

여러 개 정의할 수 있는 것이다.

 

아래는 코 루틴에서 사용하는 반환 타입의 목록이라 할 수 있다

null 다음 프레임까지 대기
new WaitForSeconds(float) 지정한 초만큼 대기
new WaitForFixedUpdate() 다음 물리 프레임까지 대기
new WaitForEndOfFrame() 모든 렌더링 작업이 끝날 때까지 대기
StartCoroutine(string) 코루틴이 끝날 때까지 대기
new WWW(string) 웹 통신 작업이 끝날 때까지 대기
new AsyncOperation 비동기 작업이 끝날 때까지 대기

사실 이중 가장 자주 쓰이는 것은 null, WaitForSeconds, StartCoroutine

정도로 나머지 반환 타입 목록들은 필요할 때 알아봤으면 한다.

 

 

이를 토대로 Hello를 출력시키는 코 루틴 함수를 만들어

실행시키는 순서까지 보여주도록 하겠다.

 

using System.Collections;
using UnityEngine;

public class TestCoroutine : MonoBehaviour
{
    void Start()
    {
        StartCoroutine(Test());
    }

    private IEnumerator Test()
    {
        Debug.Log("Hello");
        yield return new WaitForSeconds(5.0f);
        Debug.Log("Hello");
    }
}

한 가지 주의할 점은 코 루틴 함수는 일반적인 서브루틴

함수처럼 호출하는 것이 아닌 MonoBehaviour 클래스

내부에 존재하는 StartCoroutine 함수의 도움을

받아 호출하는 것이다. (매개 변수로 위처럼 함수로

전달할 수 있지만 문자열 형식으로도 전달 가능)

 

자 그럼 위의 코드를 보고 출력 결과를 예상해보자

 

정답은 시작과 동시에 콘솔 창에 Hello 문구가 표시되고

5초 후에 다시 Hello 문구가 표시되는 것을 확인할 수 있다.

 

한번 직접 실행해 봤으면 한다

 


기타 활용 방안

 

using System.Collections;
using UnityEngine;

public class TestCoroutine : MonoBehaviour
{
    IEnumerator Start()
    {
        yield return StartCoroutine(Test());
        yield return StartCoroutine(Test2());
        Debug.Log("End");
    }

    private IEnumerator Test()
    {
        Debug.Log("Hello");
        yield return new WaitForSeconds(5.0f);
        Debug.Log("Hello");
    }

    private IEnumerator Test2()
    {
        Debug.Log("World");
        yield return new WaitForSeconds(5.0f);
        Debug.Log("World");
    }
}

이런 식으로 Start함수의 반환 형식을 IEnumerator 형식으로 변환시킬 수 있다.

 

여기서 yield return StartCoroutine() 은 약간 생소할 수 있는데 설명하자면

해당 코 루틴 함수 자체가 종료지점에 도달할 때까지 기다린다는 것이다.

 

한번 코드를 넣고 실행시켜보면 무슨 뜻인지 알게 될 것이다.

 

이 외에도

using UnityEngine;

public static class Util
{
    public static readonly WaitForSeconds delay01 = new WaitForSeconds(0.1f);
    public static readonly WaitForSeconds delay02 = new WaitForSeconds(0.2f);
    public static readonly WaitForSeconds delay03 = new WaitForSeconds(0.3f);
}

이렇게 자주 사용하는 yield return 구문들은 잦은

new 할당으로 인해 힙 영역에 부담이 가므로

미묘한 성능 차이가 나더라도 이런 식으로

캐싱해서 최적화하는 편이다.

참고로 readonly는 런타임 상수다

 

이처럼 코 루틴은 하나의 프로세스 내에서

여러 루틴들이 시간을 나눠서 사용하는

비동기 방식 중 하나이다

 

앞서 동기, 비동기 방식의 차이를 모른다면

아래 내가 올린 글을 참고하길 바란다

 

https://plugxp.tistory.com/8

 

[C#] 비동기 프로그래밍(Asynchronous Programming) 에 대해 알아보자

동기, 비동기 프로그래밍 동기 프로그래밍(Synchronous Programming)은 프로그램이 실행되는 도중 어떤 작업 요청이 들어오면 해당 작업이 종료될 때까지 기다렸다가 다음 작업을 하는 것을 의미 하고

plugxp.tistory.com

여기에선 async, await를 활용하여 함수를

사용하는 방식을 설명해주는데

코 루틴과 같은 비동기 방식이더라도 각각의

장단점이 존재하기 마련이다

 

필자가 이 둘을 써보면서 직접 느낀 것은

코 루틴 같은 경우 사용하기에 매우 좋지만

예외 처리가 안되고, 리턴이 불가능하다는 점이

아쉬웠다, 그리고 코 루틴은 Monobehaviour를

상속받는 클래스 내부에서만  StartCoroutine을 이용하여

호출이 가능해서 따라서 따로 리턴이 필요하거나

MonoBehaviour를 상속받지 않은 클래스에서

비동기 작업을 필요로 할 때 async를 주로 사용하였다.

 

이 외에도 코 루틴을 이용한 다양한 활용방안들이 있으니

아래 레퍼런스 사이트나 유니티 공식 홈페이지 등에서

자료를 찾아보길 바란다.

 


레퍼런스 사이트

 

https://docs.unity3d.com/kr/530/Manual/Coroutines.html

 

유니티 - 매뉴얼: 코루틴(Coroutine)

게임 오브젝트 생성 및 삭제 특수 폴더와 스크립트 컴파일 순서 코루틴(Coroutine) 함수를 호출하면 반환값을 반환하기 전에 실행 완료됩니다. 즉, 함수에서 수행되는 작업은 하나의 프레임에서 수

docs.unity3d.com

https://docs.unity3d.com/Manual/Coroutines.html

 

Unity - Manual: Coroutines

Coroutines A coroutine allows you to spread tasks across several frames. In Unity, a coroutine is a method that can pause execution and return control to Unity but then continue where it left off on the following frame. In most situations, when you call a

docs.unity3d.com

저작자표시 (새창열림)

'Unity > 지식' 카테고리의 다른 글

[Unity] 좌표계 에 대해 알아보자  (0) 2022.01.13
[Unity] 쿼터니언과 짐벌락 현상에 대해 알아보자  (0) 2022.01.05
[Unity] Attribute 에 대해 알아보자  (0) 2021.12.21
[Unity] 라이프 사이클(Life Cycle) 에 대해 알아보자  (0) 2021.12.20
[Unity] Delta Time 에 대해 알아보자  (0) 2021.12.19
  • 메인 루틴과 서브루틴
  • 코 루틴(Co-routine)
  • 기타 활용 방안
  • 레퍼런스 사이트
'Unity/지식' 카테고리의 다른 글
  • [Unity] 좌표계 에 대해 알아보자
  • [Unity] 쿼터니언과 짐벌락 현상에 대해 알아보자
  • [Unity] Attribute 에 대해 알아보자
  • [Unity] 라이프 사이클(Life Cycle) 에 대해 알아보자
고현우
고현우
Unity / DirectX 게임 개발
개발 일지Unity / DirectX 게임 개발

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.