테스트 이유:
유니티는 기본적으로 메인 스레드에서 작동되고, UI나 컴포넌트에 접근하는 것은 메인스레드에서만 가능함.
그런데 async를 이용하면 다른 스레드에서 실행될 것이라고 생각함. 그래서 UI업데이트나 GetComponent 와 같이 메인스레드에서만 작동 가능한 기능들을 사용못할 줄 알았음.
그런데 실제로는 async 메소드 안에서 메인스레드에서 작동되어야할 기능들이 작동되었음.
그래서 테스트 하게 됨.
vscode
using System.Diagnostics;
partial class Program
{
static async Task Main(string[] args)
{
await TestAsync();
}
static async Task TestAsync()
{
string path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "korean_fire_extinguisher_01_4k.glb");
Debug.WriteLine($"{Environment.CurrentManagedThreadId} : Task run 시작 스레드");
await Task.Delay(1000);
byte[] testBytes = await File.ReadAllBytesAsync(path);
Debug.WriteLine($"{Environment.CurrentManagedThreadId} : {testBytes.Length} 파일 읽는 스레드");
await Task.Delay(1000);
Debug.WriteLine($"{Environment.CurrentManagedThreadId} : 끝나기전 스레드");
}
}
출력 :
1 : Task run 시작 스레드
9 : 315678296 파일 읽는 스레드
9 : 끝나기전 스레드
마지막 await Task.Delay(1000);를 5000으로 바꿨더니 3개의 출력 모두 다른 스레드 에서 실행됨.
시간이 오래 걸리면 자동으로 다른 스레드에서 실행함.
유니티
using System.Threading.Tasks;
using UnityEngine;
using Debug = UnityEngine.Debug;
using TMPro;
using System.Threading;
using System.IO;
using System;
public class TestTask : MonoBehaviour
{
[SerializeField] private Transform testTarget;
[SerializeField] private TMP_Text asyncText;
[SerializeField] private TMP_Text taskRunText;
public async void TestAsyncBtn()
{
await TestAsync();
}
async Task TestAsync()
{
string path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "korean_fire_extinguisher_01_4k.glb");
Debug.Log($"{Thread.CurrentThread.ManagedThreadId} : Task run 시작 스레드");
await Task.Delay(1000);
byte[] testBytes = File.ReadAllBytes(path);
Debug.Log($"{Thread.CurrentThread.ManagedThreadId} : {testBytes.Length} 파일 읽는 스레드");
await Task.Delay(2000);
Debug.Log($"{Thread.CurrentThread.ManagedThreadId} : 끝나기전 스레드");
}
}
출력 :
1 : Task run 시작 스레드
1 : 315678296 파일 읽는 스레드
1 : 끝나기전 스레드
딜레이 타임을 늘려봐도 결과는 같았음.
결론:
유니티에서는 비동기 메소드를 사용해도 기본적으로 메인스레드 에서 실행된다.
Task.Run을 이용하면 다른스레드에서 이용가능.
'유니티(Unity)' 카테고리의 다른 글
Webgl 로컬에서 실행시키기(Express) (0) | 2024.05.12 |
---|---|
코루틴 확장하기 (0) | 2024.05.06 |
자바스크립트 Dll 사용하기 (0) | 2024.04.30 |
Unity 텍스처 압축 시 주의 할 점. (0) | 2024.04.14 |
텍스처 (0) | 2024.04.13 |