TIL (83) | 2023.11.22 | 코루틴

kjg5370·2023년 11월 22일
0

TIL

목록 보기
81/91
post-thumbnail

들어가기 앞서

오늘은 코루틴에 대해 정리하면서 애매하게 알고 있었던 것에 대해 알게 되었습니다.

오늘 배운 것

  • 코루틴
    Co(함께) + routine(일의 순서) 2개가 합쳐진 단어로 함께 동작하며 규칙이 있는 일의 순서를 뜻함.
    비선점적 멀티태스킹을 위한 서브 루틴을 일반화한 컴퓨터 프로그램 구성요소

    • 비선점형
      하나의 프로세스가 CPU를 할당받으면 종료되기 전까지 다른 프로세스가 CPU를 강제로 차지할 수 없음
    • 선점형
      하나의 프로세스가 다른 프로세스 대신에 프로세서(CPU)를 강제로 차지할 수 있음
  • 코루틴의 사용
    코루틴을 사용하면 여러 프레임에 현재 함수의 작업을 분산하여 진행할 수 있음.
    함수 실행 중 yield return을 사용하여 작업을 일시 중단한 후, 다른 프레임/시간에 제어권을 다시 넘겨받아 사용.

  • 코루틴의 사용
    주로 시간 지연, 애니메이션 효과, 비동기 작업 등을 다루는 데에 사용

     using UnityEngine;
    
    public class LogoEffect : MonoBehaviour
    {
        public float fadeInTime = 2f;
        public float waitTime = 1f;
        public float fadeOutTime = 2f;
    
        private SpriteRenderer logoRenderer;
    
        void Start()
        {
            logoRenderer = GetComponent<SpriteRenderer>();
    
            // 코루틴 시작
            StartCoroutine(LogoAnimation());
        }
    
        IEnumerator LogoAnimation()
        {
            // 나타나기
            yield return FadeIn(fadeInTime);
    
            // 일정 시간 대기
            yield return new WaitForSeconds(waitTime);
    
            // 사라지기
            yield return FadeOut(fadeOutTime);
        }
    
        IEnumerator FadeIn(float time)
        {
            float elapsedTime = 0f;
            Color startColor = logoRenderer.color;
    
            while (elapsedTime < time)
            {
                elapsedTime += Time.deltaTime;
                float t = Mathf.Clamp01(elapsedTime / time);
                logoRenderer.color = new Color(startColor.r, startColor.g, startColor.b, t);
                yield return null;
            }
        }
    
        IEnumerator FadeOut(float time)
        {
            float elapsedTime = 0f;
            Color startColor = logoRenderer.color;
    
            while (elapsedTime < time)
            {
                elapsedTime += Time.deltaTime;
                float t = Mathf.Clamp01(1f - elapsedTime / time);
                logoRenderer.color = new Color(startColor.r, startColor.g, startColor.b, t);
                yield return null;
            }
        }
    }

    StartCoroutine(LogoAnimation())을 호출하여 코루틴을 시작하고, LogoAnimation 코루틴 내에서는 FadeIn, FadeOut 코루틴을 호출하여 각각 나타나기와 사라지기 효과를 구현
    yield return 문을 사용하여 각 단계에서 대기하도록 하며, 이를 통해 여러 프레임에 걸쳐 작업을 수행

기억 할 것 & 진행 사항

  • 쓰레드(Thread)

    • 별개의 쓰레드에서 동작
      쓰레드는 독립적으로 실행되며, 각각의 쓰레드는 자체적인 작업 흐름을 가지고 실행됨

    • 동시에 여러 개의 일을 처리
      다수의 쓰레드가 동시에 실행될 수 있어, 여러 작업을 동시에 처리할 수 있음

    • 선점형 쓰레드
      쓰레드는 선점형 방식으로 동작하여, 일을 하는 동안에도 다른 쓰레드가 실행됨

    • 비동기적 동작
      각 쓰레드는 비동기적으로 동작하며, 서로 독립적으로 실행

    • 공유 메모리와 Lock
      공유 메모리를 사용할 경우, 여러 쓰레드 간의 메모리 접근이 겹칠 수 있음
      Lock을 사용하여 동기화하면 먼저 접근한 쓰레드가 우선적으로 사용

  • 코루틴(Coroutine)

    • 단일 쓰레드에서 동작
      코루틴은 주로 단일 쓰레드에서 동작하며, 해당 쓰레드의 실행 흐름 안에서 동작

    • 여러 개의 일을 나누어 처리
      코루틴은 여러 개의 작업을 나누어 순차적으로 처리

    • 비선점형 쓰레드
      코루틴은 비선점형 방식으로 동작하여, 현재 코루틴이 끝날 때까지 다른 코루틴들은 대기

    • 동시에 동작하지 않음
      단일 쓰레드에서 동작하므로, 메모리 접근이 겹칠 일이 없음
      현재 동작 중인 코루틴이 메모리를 사용하고 있을 때, 다른 코루틴들은 대기

    • 비동기적이 아님
      코루틴은 여전히 동기적으로 동작하며, 각 작업은 이전 작업이 완료된 후에 순차적으로 진행

profile
학생입니다

0개의 댓글