Unity의 Job 시스템을 이용하기 위해서는 using Unity.Jobs 를 사용해야 한다.
해당 게시글에서는 Unity.Jobs의 코드 확인 및 샘플 프로젝트를 만들어 봄으로써 Job 시스템을 이해하고자 한다.
[ Unity.Jobs 의 계층 구조 ]
● Interface IJob
▶ 단일 작업을 하는 Job을 구현 할 때, struct에 상속하는 interface
[JobProducerType( typeof( IJobExtensions.JobStruct<> ) )]
public interface IJob
{
//
// 요약:
// Implement this method to perform work on a worker thread.
void Execute();
}
Execute() 함수에 Job에서 진행할 코드를 작성, 단일 Worker 스레드에서 Execute()가실행됨
▶ Execute() 에는 parameter 값이 없기 때문에, 구조체에 사용할 값을 넣어서 사용해야 함
▶ IJob을 상속 받아, a + b를 구현한 Job의 예제 코드
using UnityEngine;
using Unity.Jobs;
using Unity.Collections;
public class JobSample : MonoBehaviour
{
/// <summary>
/// a + b 를 더하여 result에 값을 넎는 단순한 Job 예제
/// </summary>
struct JobSigle : IJob
{
/// <summary>
/// Job 에서 사용할 수 있는 변수는 값 타입
/// </summary>
public int a;
public int b;
/// <summary>
/// 메인 스레드와 메모리를 공유하기 위해서는 NativeContainer라는 특수한 변수를 사용해야함
/// </summary>
public NativeArray<int> result;
/// <summary>
/// 워커 스레드에서 실행되는 함수
/// </summary>
public void Execute()
{
result[0] = a + b;
}
}
void Start()
{
/// Job을 생성한 후 a, b에 값을 할당
JobSigle jobSigle = new JobSigle();
jobSigle.a = 1;
jobSigle.b = 2;
/// 메인 스레드에서 값을 사용하기 위해 NativeArray를 선언
jobSigle.result = new NativeArray<int>( 1, Allocator.TempJob );
/// Job을 실행 할 수 있도록 워커 스레드에 예약함,
/// 메인 스레드에서는 Schedule만 호출 할 수 있음
JobHandle handle = jobSigle.Schedule();
/// JobSingle이 완료되기 전까지 메인스레드가 동작하지 않도록
/// Complete를 선언 할 수 있음. Complete를 선언함으로써 Job의 실행이 완료 된 후
/// 메인스레드에서 안전하게 NativeContainer에 접근할 수 있음
handle.Complete();
Debug.LogWarning( " result : " + jobSigle.result[0] );
/// NativeContainer를 사용한 후에는 Dispose를 호출해서 메모리에서 삭제해야함.
/// Dispose를 호출하지 않으면 Unity에서 에러를 냄
jobSigle.result.Dispose();
}
}
'게임엔진 > Unity' 카테고리의 다른 글
[Unity] UI 카메라 설정하기 (screen space - camera) (0) | 2023.01.15 |
---|---|
[Unity] Job 시스템 이해 2, NativeContainer (0) | 2023.01.15 |
[Unity] Serializable Dictionary - 인스펙터에 노출시킬 수 있는 딕셔너리 (0) | 2023.01.14 |
[Unity] onClick.AddListener에서 함수의 파라미터 전달 문제 (0) | 2023.01.14 |
[Unity] 안드로이드 플러그인 사용해보기 (0) | 2023.01.09 |