본문 바로가기

유니티(Unity)

vscode와 유니티에서 async 스레드 테스트

테스트 이유:

유니티는 기본적으로 메인 스레드에서 작동되고, 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