일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- c#
- 연결리스트
- 추상클래스와인터페이스
- 유니티
- 크래프톤 정글
- pintos
- 크래프톤정글4기
- 알고리즘수업-너비우선탐색2
- Unity
- BFS
- 다익스트라
- 오블완
- 네트워크
- User Stack
- 핀토스
- anonymous page
- 알고리즘
- 이벤트 함수 실행 순서
- project3
- KRAFTON JUNGLE
- 4기
- TiL
- 파이썬
- 백준
- C
- 크래프톤 정글 4기
- 크래프톤정글
- 티스토리챌린지
- kraftonjungle
- 전쟁-전투
- Today
- Total
말감로그
24.08.27 Unity_C# - 동기 비동기(코루틴, async/await, Task.Run()) 본문
동기
동기식 작업이란 순차적인 실행 방식을 말합니다. 만약 2가지의 함수가 있다면 차례에 따라 실행된다는 것입니다.
유니티는 일반적으로 동기식 작업 방식을 사용합니다.
동기식은 코드를 구현하기가 쉽고 실행 순서를 빠르게 파악할 수 있지만 하나의 함수에서 엄청난 자원과 시간을 소모한다면 프로그램에 치명적일 수 있습니다.
그렇기에 이러한 부분에서는 비동기식으로 코드를 구성하기도 합니다.
비동기
비동기식 작업은 동기식과는 다르게 여러 작업들을 동시에 실행하는 방식입니다.
비동기식 작업은 구현이 복잡하며, 구조를 정확하게 파악하지 않고 구현할 시에는 무한 루프, 무한 대기 상태에 빠지는 경우가 있기에 조심하여 구현해야합니다.
유니티에서 비동기식 작업 방식을 구현하는 방법
1. 코루틴 사용
2. async / await
3. Task.Run(() => 함수~());
코루틴(Coroutine)
코루틴은 일시 중지 및 재개가 가능한 비동기적인 작업을 처리하는 데 도움을 주는 기능입니다. 일정한 시간동안 대기하거나 다른 처리를 하고 다시 원래 작업으로 돌아오는 등의 작업을 수행할 수 있습니다.
어떤 상황에서 쓰이는가?
1. Update가 아닌 곳에서 반복적으로 코드가 실행되어야 할 필요가 있을 때 코루틴을 사용하는 것이 매우 효과적
2. Update문을 사용하면 원하든 원하지 않든 업데이트문이 매 프레임마다 계속 반복적으로 실행되지만, 코루틴을 사용한다면 자신이 필요한 순간에만 반복하고 필요하지 않을 때에는 전혀 사용하지 않음으로써 자원 관리 매우 효과적
3. 당장 실행되는 게 아니라 일정 시간동안 멈춰있다가 그 뒤에 동작하게 하거나 특정 조건을 부여해서 코드가 실행되도록 할 때
StartCoroutine(함수이름()); //실행부
IEnumerator 함수이름()
{
yield return new WaitForSeconds(시간); //리턴부
}
StopCoroutine(함수이름()); //정지부
yield return null -> 프레임 단위 실행
yield return new WaitForSeconds(2.0f); -> 2초 뒤 (유니티 시간)
yield return new WaitForSecondsRealtime(2.0); -> 2초 뒤 실제 시간
async/await
Task는 비동기 작업의 결과를 나타내는 객체. ex) Task -> void 형 반환값 x , Task<int> -> int형 반환
async는 메서드를 비동기적으로 실행할 수 있게 만듦.
await는 비동기 작업이 완료될 때까지 기다림.
async void Start()
{
await WaitAndPrint();
Debug.Log("This will print after 1 second");
}
async Task WaitAndPrint()
{
await Task.Delay(1000);
Debug.Log("Hello, World");
}
// Hello, World
// This will print after 1 second
Task.Run(()=> 함수());
Task.Run은 특정 작업을 별도의 스레드에서 비동기적으로 실행하도록 예약할 때 사용됩니다.
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
print("비동기시작-------------------------------------");
Task.Run(() => testc());
print("스페이스끝!-------------------------------------");
}
print("CCCC");
}
async Task testc()
{
int temp = await AsyncNum();
print(temp);
print("비동기진짜끝-------------------------------------");
}
async Task<int> AsyncNum()
{
await Task.Delay(50);
// 결과 값 반환
return 7;
}
// 비동기시작-------------------------------------
// 스페이스끝!-------------------------------------
// CCCC
// CCCC
// ...
// 7
// 비동기진짜끝-------------------------------------
참고
'TIL' 카테고리의 다른 글
24.08.29 Unity_C# - 자료구조의 종류, 배열과 List, ArrayList, Dictionary 차이 (0) | 2024.08.29 |
---|---|
24.08.28 알고리즘 - 파이썬 내장 함수 (0) | 2024.08.28 |
24.08.26 Unity_C# - delegate, event , action (2) | 2024.08.26 |
24.08.22 Unity_C# - C#와 C++의 차이, 구조체와 클래스, 박싱과 언박싱, 제네릭 (0) | 2024.08.22 |
24.08.21 Unity_C# - 추상 클래스와 인터페이스 ,virtual (0) | 2024.08.21 |