면접준비

코루틴이란?

썩은피망 2024. 7. 4. 09:30
반응형
코루틴 (coroutine)

유니티에서의 코루틴은 싱글 스레드에서 다른 작업을 하면서 동시에 정지 또는 시작하는 등,  비동기 처리와 같이 보이는 처리 방식을 보여줍니다. 하지만 실제로는 동기 방식의 로직을 갖고 있습니다.

프로젝트의 최적화를 위해서는 Update( )의 사용을 가능한 줄여야만 합니다. 이를 코루틴을 활용해서 필요할 때만 StartCoroutine으로 반복하고 다 사용했다면 StopCorouitne 사용하는 등, 반복 작업을 종료할 수 있습니다.


코루틴의 yield

"양도하다"라는 뜻을 가진 yield는 프로그램의 제어권을 유니티에게 양도한다는 뜻으로 초기에 학습했지만 더 나아가 메인루틴의 제어권을 잠시 가져와 코루틴을 실행한다가 더 옳은 표현입니다. yield return으로 일시정지 및 언제 다시 시작할지 등을 조정할 수 있습니다.

  • yield return null
    • 다음 프레임까지 대기 후 실행
  • yield return new WaitForSeconds(float)
    • 입력된 매개변수만큼의 시간(초)가 지난 후 실행
    • Time.Scale에 영향을 받음
  • yield return new WaitForSecondsRealtime(float)
    • 입력된 매개변수만큼의 시간(초)가 지난 후 실행
    • Time.Scale의 영향을 받지 않음
  • yield return new WaitFixedUpdate()
    • FixedUpdate 기준 다음 프레임까지 대기 후 실행
  • yield return new WaitForEndOfFrame()
    • 모든 작업이 끝날 때까지 대기 후 실행
  • yield return StartCoroutine(IEnumerator)
    • 매개변수로 입력된 코루틴이 끝날 때까지 대기 후 실행
  • yield return new www(string)
    • 웹 작업이 끝날 때까지 대기 후 실행
  • yield return new Asyncloeration
    • 비동기 작업이 끝날 때까지 대기 후 실행
  • yield break
    • 종료

최적화

밑에 예시는 기본적인 형태의 코루틴입니다.

IEnumerator Test_main()
{
    for(int i = 0; i < 10; i++)
    {
    	Debug.Log("실행됌!");
        
        yield return new WaitForSeconds(1f);
    }
}

 

이 경우 반복문 안에서 "new WaitForSeconds(1f)"가 반복 생성되면서 불필요한 메모리를 사용해야만 합니다. 이를 최적화시키기 위해 미리 생성한 객체를 재활용하는 코드로 재작성할 수 있습니다.

WaitForSeconds temp = new WaitForSeconds(1f);

IEnumerator Test_main()
{
    for(int i = 0; i < 10; i++)
    {
    	Debug.Log("실행됌!");
        
        yield return temp;
    }
}

위 내용은 어디까지나 개인 학습 중, 정리한 내용이기 때문에 잘못된 내용이 있을 수 있습니다.
부족한 설명이나 잘못된 내용에 대한 지적은 언제나 환영입니다.
반응형