Job 시스템이 사용하는 자료구조 NativeContainer
원리
멀티 스레딩 방식의 프로그래밍 기법이지만, 스레드를 별도로 생성하지 않는다.
유니티 내부에는 우리가 익숙하게 작업을 진행하는 메인 스레드와, CPU 코어 개수에 맞춰 월드의 변경사항을 적용하여 렌더링 할 준비를 해주는 작업자 스레드, 렌더링 과정을 처리하는 렌더 스레드가 존재한다. 이 중, 작업자 스레드에 작업을 지시할 수 있게끔 해준다.
장점과 단점
장점
- 빠르다.
- 메모리 절약된다.
- 유니티에서 제공하는 각종 스레드 안전장치를 사용할 수 있다.
- 유니티의 로직에 맞춰 돌아가므로 비교적 안정적인 프레임을 기대할 수 있다.
- 유니티가 관리하는 스레드이므로, 에러가 발생하면 유니티 콘솔을 통해 디버깅할 수 있다.
- 다수의 작은 작업을 처리하기에 용이하다.
단점
- 일반 멀티 스레드에서 무한 루프 발생 시 해당 스레드만 빠지는거와 달리, Job 시스템에서 발생되는 문제는 유니티 전체가 빠지게 된다.
- 데이터 관리를 유니티에서 제어하므로, 굉장히 한정적인 조건 내에서 스레드 간의 데이터 교환이 허용된다.
- 작업자 스레드라 멈추면 안된다 즉 System.Thread.Sleep에 대응되는 기능이 없다.
- 함부로 무거운 기능을 지시하기가 애매하다 그래서 커다란 작업을 분할하지 않은 채 하는건 비합리적이다.
- C/C++의 멀티 스레드와 비슷할 정도로 까다롭다.
- 스레드 작업과 달리 인터럽트 할 수 없다.
- 메인 스레드에서만 접근할 수 있는 데이터(Ex. Time 구조체 등)에 접근할 수 없다.
예제
using Unity.Collections;
using Unity.Jobs;
using UnityEngine;
using UnityEngine.Jobs;
public class Jobs_PingPong : MonoBehaviour
{
public Transform[] transforms;
TransformAccessArray _transformAccessArray;
void Start()
{
_transformAccessArray = new TransformAccessArray(transforms);
}
public struct PingPongJob : IJobParallelForTransform
{
public float time;
public void Execute(int index, TransformAccess transform)
{
Vector3 position = transform.position;
position.y = Mathf.Sin(time);
transform.position = position;
}
}
private void Update()
{
var job = new PingPongJob() { time = Time.time };
var handler = job.Schedule(_transformAccessArray);
}
}
'게임엔진 > Unity' 카테고리의 다른 글
[Unity] 이동, 회전, 크기변경 정리 (2) | 2023.05.05 |
---|---|
[Unity] 어드레서블 에셋(Addressable Asset)의 모든것 (0) | 2023.04.02 |
[Unity] Job 시스템 이해 4, IJobParallelFor (0) | 2023.03.23 |
[Unity] Job 시스템 이해 3, JobHandle (0) | 2023.03.23 |
[Unity] SQL 데이터 베이스 연동 SQLite (0) | 2023.03.23 |