Awaitable을 통한 비동기 프로그래밍 소개
Understand the key features of Unity's Awaitable and how it compares to both .NET Task and iterator-based coroutines.
읽는 시간 4분최근 업데이트: 한 달 전
Awaitableasyncawait- Unity 코루틴: ,
NextFrameAsync,WaitForSecondsAsync,EndOfFrameAsyncFixedUpdateAsync - 백그라운드 스레드 또는 메인 스레드로 전환
- 에서 상속하는 모든 유형
AsyncOperation - Unity 이벤트
- 비동기 GPU 리드백
다음과 같이 자체 코드에서 클래스를 연산자와 함께 사용하거나 반환 유형으로 사용할 수 있습니다.
Awaitableawaitasyncasync Awaitable<List<Achievement>> GetAchievementsAsync(){ var apiResult = await SomeMethodReturningATask(); // or any await-compatible type List<Achievement> achievements = JsonConvert.DeserializeObject<List<Achievement>>(apiResult); return achievements;}async Awaitable ShowAchievementsView(){ ShowLoadingOverlay(); List<Achievement> achievements = await GetAchievementsAsync(); HideLoadingOverlay(); ShowAchivementsList(achievements);}
Awaitable과 .NET Task 비교
AwaitableTaskAwaitableTask가장 중요한 제한 사항은 할당을 제한하기 위해 인스턴스를 풀링한다는 것입니다. 다음 예시를 참고하십시오.
Awaitableclass SomeMonoBehaviorWithAwaitable : MonoBehavior{ public async void Start() { while(true) { // do some work on each frame await Awaitable.NextFrameAsync(); } }}
풀링이 없다면 이 예시에서 의 각 인스턴스는 매 프레임마다 오브젝트를 할당하게 되므로 가비지 컬렉터 작업 부하가 증가하고 성능이 저하됩니다. Unity는 이를 완화하기 위해 오브젝트가 대기 처리된 후 내부 풀로 반환합니다.
MonoBehaviorAwaitableAwaitableAwaitable중요: 인스턴스를 풀링한다는 것은 인스턴스에서 두 번 이상 를 수행하는 것은 안전하지 않다는 의미입니다. 그렇게 하면 예외나 교착 상태와 같이 정의되지 않은 행동이 발생할 수 있습니다.
AwaitableAwaitableawaitAwaitable과 .NET ValueTask 비교
.NET 는 의 몇 가지 주요 이점과 한계를 제공합니다. 는 일반적으로 대부분의 경우 동기식으로 완료될 것으로 예상되는 비동기식 워크로드에 사용하는 것이 좋습니다. 자세한 내용은 ValueTask의 이유, 내용, 시점 이해하기를 참고하십시오.
ValueTask<TResult>AwaitableValueTaskAwaitable, Task, ValueTask 요약
아래의 표는 Unity의 클래스와 .NET 및 간의 기능을 비교한 내용을 요약한 것입니다.
AwaitableTaskValueTask기능 |
|
|
|
|---|---|---|---|
| 필수 할당 | 많음. 모든 호출에 | 필요한 만큼. 풀링으로 최적화할 수 있습니다. | 필요에 따라 최소한. 기본적으로 |
| 여러 번 안전하게 대기 가능 | 예. | 아니오. | 아니오. 커스텀 |
| 비동기식으로 실행되는 지속 | 예. 기본적으로 동기화 컨텍스트를 사용하며, 그렇지 않으면 | 예. 대기 중인 작업들이 동기식으로 완료되는 경우에 최적화되었습니다. 작업들이 비동기식으로 완료될 경우 지속 동작은 | 아니오. 지속은 완료가 트리거되면 동기식으로 실행됩니다. 즉, 완료가 트리거된 해당 프레임에서 코드가 즉시 재개됩니다. 자세한 내용은 Awaitable 완료 및 지속에서 확인하십시오. |
| 코드로 완료를 트리거할 수 있음 | 예. | 대부분 동기식으로 완료되는 작업의 일반적인 사용 사례에는 적용되지 않습니다. | 예. |
| 값 반환 가능 | 예. | 예. | 예. |
| 예. | 아니오. | 아니오. 커스텀 |
| Unity 스레드 및 업데이트 루프 인식 실행 작업 예약 | 아니오. | 아니오. | 예. |
Task 또는 ValueTask가 아닌 Awaitable을 사용해야 하는 경우
API 선택 기준은 비동기 코드의 성능 프로파일에 따라 달라지지만 일반적으로는 다음과 같습니다.
-
여러 번 또는 여러 소비자로에서 동시에 대기해야 할 경우에는만 사용할 수 있습니다.
Task -
대부분의 경우 동기적으로 완료되는 높은 처리량의 비동기식 코드가 있을 경우를 사용하는 것이 좋습니다.
ValueTask -
은 다음과 같은 경우에 적합합니다.
Awaitable- 메서드를 여러 번 기다릴 필요가 없으며 대부분 비동기식으로 완료될 것으로 예상되는 경우
- 비동기 작업이 메인 스레드와 Update 및 FixedUpdate 루프와 같은 Unity 관련 개념을 기본적으로 지원하기를 원합니다.
Awaitable과 반복자 기반 코루틴 비교
AwaitableWaitForFixedUpdate그러나 여러 개의 코루틴을 동시에 실행하면 성능상의 이점이 줄어듭니다. 예를 들어 이전의 코드 예시에서 루프에서 를 기다리는 MonoBehavior는 대규모 프로젝트에서 모든 게임 오브젝트에 연결될 경우 성능 문제를 일으킬 가능성이 높습니다.
AwaitablewhileAwaitable.NextFrameAsync