Ottoman

내일배움캠프 7주 토요일 TIL- 코루틴매니저? 프로퍼티에 이벤트? 본문

TIL

내일배움캠프 7주 토요일 TIL- 코루틴매니저? 프로퍼티에 이벤트?

오토만 2024. 6. 1. 15:26

코루틴은 오브젝트가 비활성화되면 에러로그를 남기면서 멈춰버린다.

이를 방지하는 사용방법은

1. 빈 오브젝트를 상위 오브젝트로 두고 여기에 코루틴을 사용하는 스크립트를 넣는다. => 활성화, 비활성화될 오브젝트는 하위 오브젝트로 만들어 스크립트를 담은 오브젝트가 비활성화되는걸 피한다

2. 코루틴매니저

코루틴을 돌려주는 클래스를 따로 만들어서 관리한다.

 

// 코루틴 매니저는 어떤 역할을 하지?

 

Chapter 11. Corutine, 커스텀 코루틴, 최적화 - 평생 공부 블로그 : Today I Learned‍ 🌙 (ansohxxn.github.io)

https://ansohxxn.github.io/unity%20lesson%202/ch11/

 

Chapter 11. Corutine, 커스텀 코루틴, 최적화

인프런에 있는 Rookiss님의 [C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진 강의를 듣고 정리한 필기입니다. 😀 🌜 강의 들으러 가기 Click

ansohxxn.github.io

 

 

코루틴(Coroutine) 대신 유니테스크(UniTask) : 네이버 블로그 (naver.com)

https://m.blog.naver.com/sorang226/223273254019

 

코루틴(Coroutine) 대신 유니테스크(UniTask)

게임을 개발하면서 비동기 로직을 가볍게 만들 일이 있을 때 유니티 기본 내장인 Coroutine도 조종 썼고, ...

blog.naver.com

 

 

 

 

 


StartCoroutine을 사용하면 가비지가 생긴다. => 새로운 StartCoroutine을 호출할 때마다 가비지가 생긴다?

(GPT)

더보기

코루틴을 사용할 때 가비지 컬렉션(GC)이 발생하는 이유는 IEnumerator를 통해 반환된 객체들이 반복적으로 생성되고, 이 객체들이 더 이상 참조되지 않으면 가비지 컬렉션이 이를 정리하기 때문입니다. 일반적으로 Unity의 코루틴에서 가비지가 많이 발생하는 주요 원인은 다음과 같습니다:

  1. 박싱(Boxing): 값 타입(예: int, float, bool)이 IEnumerator의 Current 속성으로 반환될 때, 박싱이 일어나면서 힙에 할당되고 이후 가비지가 됩니다.
  2. 익명 메서드와 람다 표현식: 코루틴 내에서 익명 메서드나 람다 표현식을 사용할 경우, 이들이 클로저(closure) 객체를 생성하여 힙 메모리를 소비합니다.

CoroutineManager 자체가 이러한 가비지 생성을 직접적으로 줄여주는 것은 아닙니다. 그러나 몇 가지 방법을 통해 코루틴 사용 시 가비지 생성을 최소화할 수 있습니다:

가비지 생성을 줄이는 방법

  1. 재사용 가능한 IEnumerator 구현:
    • 코루틴을 매번 새로 생성하지 않고, 반복 사용 가능한 IEnumerator를 구현하여 재사용합니다.
public class CoroutineManager : MonoBehaviour
{
    private static CoroutineManager _instance;
    public static CoroutineManager Instance
    {
        get
        {
            if (_instance == null)
            {
                GameObject obj = new GameObject("CoroutineManager");
                _instance = obj.AddComponent<CoroutineManager>();
            }
            return _instance;
        }
    }

    private List<Coroutine> coroutines = new List<Coroutine>();

    public Coroutine StartManagedCoroutine(IEnumerator routine)
    {
        Coroutine coroutine = StartCoroutine(routine);
        coroutines.Add(coroutine);
        return coroutine;
    }

    public void StopManagedCoroutine(Coroutine coroutine)
    {
        if (coroutines.Contains(coroutine))
        {
            StopCoroutine(coroutine);
            coroutines.Remove(coroutine);
        }
    }

    public void StopAllManagedCoroutines()
    {
        foreach (var coroutine in coroutines)
        {
            StopCoroutine(coroutine);
        }
        coroutines.Clear();
    }
}

// 재사용 가능한 IEnumerator 예시
public class ExampleScript : MonoBehaviour
{
    private WaitForSeconds wait = new WaitForSeconds(1f);

    void Start()
    {
        CoroutineManager.Instance.StartManagedCoroutine(MyCoroutineRoutine());
    }

    IEnumerator MyCoroutineRoutine()
    {
        while (true)
        {
            // Do something
            yield return wait;
        }
    }
}

 

 

2. 박싱 방지:

  • 코루틴 내에서 값 타입을 반환하지 않도록 합니다. 예를 들어, yield return 0; 대신 yield break;를 사용합니다.
IEnumerator MyCoroutineRoutine()
{
    while (true)
    {
        // Do something
        yield return null; // or yield return new WaitForSeconds(1f); to avoid boxing
    }
}

 

 

 

3. 클로저 사용 최소화:

  • 람다나 익명 메서드를 사용하지 않거나, 필요한 경우 최소한으로 사용하여 클로저 객체 생성을 줄입니다.

CoroutineManager의 간접적인 장점

CoroutineManager가 가비지 생성을 직접적으로 줄여주지 않지만, 다음과 같은 간접적인 장점이 있습니다:

  • 코루틴 재사용 촉진: 중앙 관리 방식은 코루틴을 더 체계적으로 재사용할 수 있게 도와줍니다. 이는 가비지 생성을 줄이는 데 도움이 됩니다.
  • 효율적인 관리: 코루틴의 시작과 중지를 중앙에서 관리함으로써 불필요한 코루틴의 생성을 줄이고, 더 나아가 메모리 사용을 최적화할 수 있습니다.

결론

CoroutineManager 자체가 가비지 생성을 줄이는 직접적인 해결책은 아닙니다. 그러나 올바르게 사용하면 코루틴의 생성과 관리를 더 체계적으로 하고, 재사용 가능한 패턴을 도입할 수 있어 가비지 생성을 줄이는 데 도움이 됩니다. 코루틴을 재사용하고, 박싱을 피하며, 클로저 생성을 최소화하는 것이 가비지 생성을 줄이는 주요 방법입니다. CoroutineManager는 이러한 관리 작업을 더 쉽게 만들어 줄 수 있습니다.

 

소감

아직 코루틴을 많이 써보지도 않았고 코루틴매니저를 써 본적도 없다. 코루틴을 사용하게 된다면 코루틴매니저를 만들어서 어떤 점이 달라지는지 직접 경험해보자.

 

 

 

 

// 프로퍼티의 set에서 이벤트를 호출하는 경우?

주로 프로퍼티 값이 변경될 때 다른 시스템이나 객체에 변경 사항을 알리기 위해 사용된다.

(GPT)

 

이벤트 호출을 위한 게터, 세터, 프로퍼티- 기본구조 알기 - Beatchoi

 

이벤트 호출을 위한 게터, 세터, 프로퍼티- 기본구조 알기

Getter, Setter, Property를 이용해 이벤트 호출

beatchoi.github.io

 

 

// 유니티 콘텐츠 개발의 특성상 데이터의 은닉의 경우 그 활용도가 점점 줄어들고 있는 추세??

(GPT)

더보기

이런 시선도 있구나 정도...