청크의 생성을 병렬로 처리해보기 위해 Job System 관련 자료를 찾아봤다.
Job System
이란 유니티에서 멀티 스레드를 안전하게 사용할 수 있도록 제공해주는 기법이다.
유니티에서 메인 스레드를 제외한 다른 스레드는 메인 로직의 객체에는 접근할 수 없도록 막혀있다.
게임에서 멀티 스레드 사용 시 교착상태나 하나의 데이터를 여러 스레드에서 변경하는 경우 등을 방지하기 위해 막아둔 것 같다.
유니티는 CPU의 코어마다 워커 스레드를 할당한다. Job System
을 이용하면 워커 스레드에 일을 하도록 명령을 할 수 있다.
Job System
에서는 값 타입을 제외한 모든 참조타입을 사용할 수 없다.
단, IJobParallelForTransform
이라는 인터페이스를 사용하면, Transform
타입을 한정해서 접근할 수 있다.
배열과 같은 컬렉션의 경우, Native
라는 컬렉션을 제공한다. 이를 통해서 안전하게 컬렉션에 접근할 수 있도록 해준다.
NativeArray
, NativeList
, NativeHashMap
, NativeQueue
등 . . .Execute()
메서드를 구현해야함NativeArray
를 이용해 배열 데이터 처리Execute(int index)
메서드를 구현해야함TransformAccess
구조체를 이용해 참조 타입인 Tranform
에 접근 가능Execute(int index, TransformAccess transform)
메서드를 구현해야함현재 프로젝트에는 약 70만개의 블럭 데이터와 약 2,000개의 청크가 존재한다.
갯수를 보면 IJobParallelFor
을 사용하는게 빠를 것 같다는 튜터님의 의견도 있었고, 나도 그게 더 빠를 것 같다.
하지만 이걸 어떻게 적용해야할지 ,,, 그게 좀 어렵다.
단순히 IJob
을 이용한다면 어떻게든 적용할 수 있을 것 같긴한데, IJobParallelFor
은 아직 제대로 이해를 못한 것 같다.
청크는 자신이 생성해야할 블럭의 수, 청크가 생성해야할 mesh의 vertices와 triangles의 수가 다 다르기 때문에 IJobParallelFor
를 어떻게 적용해야할지가 많이 어렵다.