Unity에서 코 루틴 대신 Async & Await를 사용해야합니까?

Aug 18 2020

Unity에서 Async 및 Await를 사용해야합니까? 아니면 코 루틴을 계속 사용해야합니까? Async & Await를 사용해야한다면 어떻게 코 루틴과 비슷한 방식으로 사용할 수 있습니까?

답변

2 Kevin Aug 19 2020 at 01:04

Evorlor의 답변과 달리 코 루틴을 사용하는 몇 가지 좋은 이유는 다음과 같습니다.

  • 그들은 수년 동안 Unity의 표준 솔루션이었으며 팀에 합류 한 다른 사람들은 이미이 솔루션에 익숙 할 것입니다.
  • 그들은 엔진과 일치합니다. WaitForFixedUpdate()Coroutine의 다음 단계가 Fixed Update주기 동안 실행되도록합니다. WaitForEndOfFrame()업데이트주기에서 다음 단계가 실행되도록합니다. C #의 async / await 를 사용하는 경우 코드가 엔진과 동일한 수준으로 유지되도록하는 것이 복잡하다는 것을 확인할 수있는 방법이 없습니다 (주석 참조).
  • 마찬가지로 .NET에서는 불가능한 WaitForSeconds()전류 Time.timeScale를 고려합니다 await.
  • 코 루틴을 실행하는 객체가 파괴되거나 비활성화되면 코 루틴이 자동으로 중지됩니다 (때로는 바람직하지 않은 경우가 있습니다.이 경우 async / await를 원할 수 있습니다).

또 다른 메모 : Evorlor는 조건 대기를 위해이 솔루션을 제안했습니다.

//Wait until condition has been met
while (!ConditionMet())
{
    yield return new WaitForEndOfFrame();
    Debug.Log("Condition has been met.");
}

이는 일반적이지만 조건을 기다리는 데 의도 된 솔루션이 아닙니다. 의도 한 솔루션은 상용구가 적고 CPU 오버 헤드가 적습니다.

yield return new WaitUntil(() => ConditionMet());

언제 코 루틴을 사용 하지 말아야 합니까?

  • 코 루틴과 유사한 함수가 값을 반환하기를 원할 때 ( DMGregory에서 권장하는 이 블로그 게시물 참조 )
  • 코 루틴을 사용하기 위해 오류를 처리하는 데 문제가있는 경우 (이전 글 머리 기호의 블로그 게시물을 참조하십시오. 해당 블록에 "yield"명령이 포함되어 있지 않은 한 코 루틴에 try-catch 블록을 넣을 수 있습니다 ) .
  • 애플리케이션을 프로파일 링 한 후 코 루틴으로 인해 성능 오버 헤드가 발생하고 있으며, 코 루틴을 최적화하여 해결할 수없는 경우 (대부분의 게임에서 가능하지 않음)
  • 확장되지 않는 일반 C # 클래스에서 코 루틴과 유사한 함수를 실행해야하는 경우 MonoBehaviour
  • GameObject가 파괴되거나 비활성화되었을 때 계속 실행하기 위해 코 루틴과 같은 함수가 필요한 경우.
  • 많이 사용하는 라이브러리 async(예 : Google Firebase)로 작업 할 때
  • 코드가 병렬 (다중 스레드)이어야하는 경우. 비용이 많이 드는 작업을 여러 프레임에 분산하여 성능을 향상시키는 데 사용할 수 있지만 코 루틴은 스레드되지 않습니다 . 최대 성능을 위해 다중 스레드 코드가 필요한 경우 C # 스레드 또는 Unity 작업 시스템을 사용하십시오.
  • 코 루틴을 사용하지 않을 다른 합당한 이유 가있는 경우

내 경험상 이러한 모든 예외는 매우 드물며 일반적으로 고려할 필요가 없습니다. 프로젝트 및 코딩 스타일에 따라 YMMV.