Invoke vs 코루틴

정채운·2023년 10월 30일
0

OderBy

  1. words의 리스트 요소들을 하나씩 꺼내고 (from in)
  2. word라는 기준으로 오름차순 정렬을한다 (orderby, select)

위 개념대로 어떠한 배열에 랜덤한 요소들이 정렬되게끔 하기위해서

int[] rtans = { 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7 };

rtans.OrderBy(item => Random.Range(-1.0f, 1.0f)).ToArray();
  1. rtans의 요소들을 하나씩 꺼내고 (from in)
  2. Random.Range(-1.0f, 1.0f): -1부터 1까지 랜덤한 수를 반환
  3. 해당 반환된 값을 이용해서 오름차순 정렬(orderby, select)

Invoke

  • 비동기처럼 동작해 보이지만 정확히는 동기함수
public void destroyCard()
{
    Invoke("destroyCardInvoke", 1.0f);
}

void destroyCardInvoke()
{
    Destroy(gameObject);
}
public void isMached()
{
    string firstCardName = firstCard.transform.Find("front").GetComponent<SpriteRenderer>().sprite.name;
    string secondCardName = SecondCard.transform.Find("front").GetComponent<SpriteRenderer>().sprite.name;

    if (firstCardName == secondCardName)
    {
        firstCard.GetComponent<card>().destroyCard();
        SecondCard.GetComponent<card>().destroyCard();

        int leftCards = GameObject.Find("cards").transform.childCount;

        if (leftCards == 2) 
        {
            endTxt.SetActive(true);
            Time.timeScale = 0.0f;
        }
    }
    else
    {
        firstCard.GetComponent<card>().closeCard();
        SecondCard.GetComponent<card>().closeCard();
    }

    firstCard = null;
    SecondCard = null;
}

위의 코드 leftCards에서 == 0이라고하면 컴퓨터가 계산하는 시간이 destroy에서 1초후 파괴시키는 시간 보다 더 빠르므로 해당 조건문에 걸리지 않게됨

코루틴

IEnumerator 함수이름()
{
	yield return // + 조건
    // 함수 내용
}

yield return 종류

  1. yield return null; -> 다음 프레임에 실행
  2. yield return new WaitForSeconds(float) -> 매개변수로 입력한 숫자에 해당하는 초만큼 기다렸다가 실행 (유니티상의 시간 timeScale)
  3. yield return new WaitForSecondsRealtime(flaot); -> 2번과 같으나 현실 시간을 기준
  4. yield break; -> 코루틴 종료

코루틴 vs Invoke

  • 컴파일 측면에서 Invoke는 런타임, 코루틴은 컴파일시 -> 만약 오류가 발생하는 코드에서
    코루틴은 컴파일단계에서 해당 오류를 잡아주지만(타입 안정성) Invoke는 컴파일에서 잡아주지 않기에
    데이터 손실, 디버깅 어려움, 애플리케이션 중단의 위험이 있다.

  • 메모리 측면에서는 코루틴은 로컬변수, 상태 정보 및 스택 프레임을 관리 해당 정보를 코루틴이 실행중일때 사용 대기상태일때는 매우 낮은 메모리를 사용하여 해당 스택을 보존 (컴파일단계에서 최적화가 일어남)

Invoke는 메서드 호출과 지연 시간에 대한 정보를 추적하고 필요한 메모리를 할당
해당 메모리는 개발자가 직접 관리 불가(Unity에서 관리) 또한 Invoke는 리플렉션을 활용하기에
런타임시에 문자열을 통해 찾아내기때문에 성능적으로 코루틴보다 불리함

1개의 댓글

comment-user-thumbnail
2023년 11월 1일

좋은 정보 감사합니다!

답글 달기