[TIL] 비동기 프로그래밍(UniTask)

muchan
muchan
∙∙조회 5

UniTask란?

Unity에 최적화된 Zero Allocation 비동기 프로그래밍 라이브러리

  • 구조체(struct) 기반 + promise 풀링 → 신규 GC 할당 제로
  • Unity PlayerLoop 통합 → 코루틴처럼 메인 스레드에서 동작
  • 완벽한 async/await 지원 → 직관적이고 안전한 비동기 코드 작성

왜 UniTask가 필요한가?

코루틴의 한계

  • GC 할당 발생: WaitForSeconds 등 YieldInstruction 객체 생성
  • 타입 안정성 부족: 반환값처리 어려움
  • 예외 처리 복잡함: try-catch 사용 불가
  • 취소 관리 번거로움: StopCoroutine 수동 관리

UniTask의 해결책

  • 구조체 사용: promise 객체를 사용하여 GC가 없다
  • 반환값 지원: 제네릭을 사용하여 타입 안정
  • 예외 처리 가능: try-catch 구문 사용 가능
  • 취소 관리 가능: CancellationToken 활용하여 취소 가

promise 객체는 비동기 작업의 미래 결과를 담는 그릇으로 "나중에 값을 줄게"라는 약속이라고 생각하면 됨

UniTask의 3가지 핵심 장점

1. Zero Allocation

struct 기반 UniTask로 Task 객체 할당을 없애고, async 상태머신의 promise 객체를 풀링·재사용해 신규 GC 할당을 제로로 만듦.

  • Task: 호출마다 클래스 인스턴스 할당 → GC 발생
  • UniTask: struct 반환 + promise 풀링·재사용 → 신규 GC 할당 없음

2. Unity PlayerLoop 통합

UniTask는 Unity의 PlayerLoop에서 직접 실행됨.

  • 코루틴처럼 메인 스레드에서 동작
  • Update, FixedUpdate, LateUpdate 등 타이밍 지정 가능

3. 완벽한 async/await 지원

  • Task처럼 async/await 키워드 사용
  • 코루틴보다 직관적인 코드 작성
  • 예외 처리, 반환값, 취소 등 모두 지원

UniTask vs 코루틴

구분코루틴UniTask
할당적음없음 (Zero)
성능보통빠름
반환값❌✅
예외 처리❌✅
취소StopCoroutineCancellationToken
타입 안정성❌✅
Unity 통합✅✅