Unitask?
Unitask는 unity용의 async-await integration 패키지이다.
efficient allocation free async/await provider라고 하는 데, 메모리 할당에 효율적인 솔루션을 제공한다는 느낌이다.
어떻게 이게 가능한것인가?
그전에, 짚고 넘어가야 할점이 있다. Task인데, 하나의 operation을 할당하기 위해선 Task가 쓰이게 된다. Task(클래스)는 하나의 operation을 나타내고 return값이 없으며, 비동기적으로 돌아간다. .NET 프레임워크 4에서 소개된 task-based asynchronous pattern 주요 기능중 하나이고, 메인 쓰레드에서 동기적으로 실행하는것이 아닌 쓰레드 풀에서 비동기적으로 실행하게 된다.
(쓰레드풀이란? 미리 생성해둔 스레드의 그룹을 스레드풀이라 하며, 미리 생성해두고 재활하여 작업을 할당한다. 데몬스레드가 아닌데, 데몬스레드란 주스레드를 돕는 보조 스레드인데, 메인이 종료되면 같이 종료되지만, 스레풀은 메인스레드가 종료되어도 따로 존재하며 종료할 타이밍에 따로 종료를 시켜줘야 한다.)
쓰레드 풀과 Task는 다르지 않나?라고 생각하는 사람도 많을 것이다. 하지만 Task는 스레드 풀위에서 작업을 하는 하위 개념이다.
헷갈린다면, 이를 실험한 포스팅이 있는 데, 이분의 블로그를 참고해보도록 하자.
https://kukuta.tistory.com/363
Task에 대해서 알아보았는 데, 알아본바로는 괜찮은 클래스인것 같다. 이를 그대로 unity에 가져다 쓰면 편하게 비동기 작업을 할수 있을것 같다. 하지만, 문제가 있다. 바로 unity에 가져다 쓰기에는 Task가 너무 무겁다는 것이다.
Unity는 단일 쓰레딩(single-thread)환경인데, Monobehaviour 스크립트는 start(), Update()등에서 작업을 실행 할것이다. 하지만 대부분의 unity api들은 Thread-safe가 보장 되어 있지 않기 때문에, 여분의 스레드를 생성하여 Unity 엔진 api에 연결 할수 없다는 것이다.
Task는 Unity의 이런 스레드 제한적인 환경에서 사용하기에는 너무 무겁기만 하다. 이에 대한 해결책으로 Unitask가 있다.
Unitask는 스레드와 SynchronizationContext/ExecutionContext를 사용하지 않는다. 유니티의 비동기 객체는 유니티 엔진 내부에서 자동으로 분열되기 때문에, 더 빠르고, 메모리 할당을 줄일수 있는 것이다.
(간단하게 이해만 할 것이면, 안보고 가도 되지만, 마음속에 그럼 그비동기 객체는 어디에서 돌아 가는 것인가? 결국 스레드라는 operation환경이 필요한거 아니야?라는 질문이 생긴다면, 주목해보자.
-> 위에서 언급했다 싶이, unity는 단일 스레드 환경이다. 엔진 api가 스레드에 안전하지 않기 때문이다. 스레드 풀을 만들려면 만들수가 있다. 그러니 executable작업은 풀에서 동작후 마무리 작업을 switch to mainthread 을 해주는 것이다. 이러는 동안은 mainthread도 기다려 지게 된다. 그러니 switch to mainthread를 자주 부를것은 성능저하의 원이 될수가 있다.)
그렇다면, 결국 unitask란 task의 단점을 보완하기 위해 나온custom task-like object 이며, 스레드풀에서 작업을 완료후 마무리로 메인스레드로 스위치해주는 고마운 친구였던 것이다.
이 다음 글로, unitask 사용법을 알아보도록 하겠다.
'Game Dev > Unity' 카테고리의 다른 글
Unity 리소스 관리 - 어드레서블(Addressable) (0) | 2023.04.23 |
---|---|
TestRunner - Unity 테스트 환경 (feat. 테스트 코드의 중요성) (0) | 2023.04.23 |
Unity로 배우는 game dev architecture : Part1_SOLID (0) | 2023.03.18 |
자율 회로 조립 시뮬레이션 개발 정리 (0) | 2023.02.12 |
wifi로 unity 빌드 하는 법-초간단 (1) | 2023.01.08 |