본문 바로가기

기타

코루틴에 대한 몰랐던 사실들...

그동안 게임 제작을 하게 되면서 자연스럽게 썻던 코루틴에 대한 몰랐던 사실들을 깨달은 점을 작성하고자 한다.

 

먼저 코루틴이란, 경량 쓰레드라고 불리워지며, 쓰레드당 하나의 명령만 실행된다.

보통, 쓰레드를 만들게 된다면 Heal 메모리에서 1MB를 차지하게 되는데, 코루틴의 경우 메모리의 64Kb 만큼의 메모리 공간을 할당하기 때문에 상대적으로 경량 쓰레드라고 불리워지게 된다.

 

여기서 특징은 코루틴은 동작하는 환경에서 Context Switching 하면서 진행을 하게 된다. 

즉, 원래의 쓰레드에서 실행하는 것과 별개로 다른 쓰레드에서 실행을 완료할 수 있다는 특이점이 발생한다.

 

이때, 동시성 과 병렬성을 차이를 간단하게 서술하자면,

동시성은 아주 빠르게 여러 개의 작업을 번갈아가며 마치 프로세스가 동시에 처리되는 것처럼 보이는 현상을 의미하고,

병렬성은 여러 개의 작업들을 같은 시간안에 모두 처리하는 것을 의미한다. 

 

코루틴의 자원 관리

코루틴의 중점은, 쓰레드의 자원 할당과 해제에 있다.

이는 인터럽트 사이클의 dispatcher에서 담당하게 되는데, 해당 쓰레드의 운영과 관리는 Dispathcer에 달려있다.

 

그래서 내가 얻은 경험을 서술하자면 다음과 같다.

Unity 게임에서 AI 상태의 FSM을 구현하는 단계에서 지나친 코루틴 사용은 게임 내의 메모리 누수를 관여한다는 것이다. 코루틴이 올바르게 종료되지 않고 계속 실행되면 메모리 누수가 발생한다는 것이다.

 

예제코드이다.

using UnityEngine;
using System.Collections;

public class SimpleCoroutineExample : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        StartCoroutine(WaitAndPrint());
    }

    IEnumerator WaitAndPrint()
    {
        // 5초간 대기합니다.
        yield return new WaitForSeconds(5);
        // 5초가 지난 후에 콘솔에 메시지를 출력합니다.
        Debug.Log("5초가 지났습니다!");
    }
}

 

 

모든 비동기 작업에 대한 코루틴을 적합하게 종료시켜야한다. 

때로는, 비동기 작업에 코루틴을 사용하게 된다면, 실행 상태를 관리하기 위해 추가적인 오버헤드를 가질 수 있으며, 이는 실시간 프레임마다 많은 계산을 처리하는 CPU의 과부화를 일으켜, 오브젝트가 메모리 누수에 의하여 Destroy() 되는 심각한 오류를 불러일으킬 수 있다는 것이다. 

 

따라서, 만약 해당 메모리 누수에 의한 GameObject가 Destroy()되었다면, 메모리 프로파일링과 메모리 최적화에 대한 공부를 더욱 해야겠다.

그래서 다음 공부는 아래 링크에 따른 유니티 엔진 내의 메모리 관리에 대한 공부를 이어나갈 예정이다. 

https://docs.unity3d.com/Manual/performance-managed-memory.html

 

Unity - Manual: Managed memory

Garbage collector overview Managed memory Unity’s managed memory system is a C# scripting environment based on the Mono or IL2CPP Virtual Machines (VMs). The benefit of the managed memory system is that it manages the release of memory, so you don’t ne

docs.unity3d.com

https://docs.unity3d.com/Manual/performance-memory-overview.html

'기타' 카테고리의 다른 글

A*  (0) 2024.03.30
나의 다짐  (0) 2024.03.07