- Job내에 있는 Static data에 접근하지 말라
예를들어 Job내에서 MonoBehaviour 멤버에 접근하면 크래쉬를 야기 시킨다.
- Flush scheduled batches
다른 Job들이 수행중일때(executing), 즉, 끝나지 않은 상태에서 또 다른 대기 Job들을 JobHandle.ScheduleBatchedJobs 으로 호출하면, 대기순서를 무시하고 바로 실행된다( Execute )
디폴트로, Job들은 Schedule 함수호출로 큐에 놓여져만 있다. 이는 작업자 스레드가 큐에 있는 Job들을 하나씩 가져와서 실행하게 해준다.
Job 시스템은 ScheduleBatchedJobs를 사용자가 호출하지 않는다면, 현재 수행중인 Job이 끝날때까지 job 수행을 하지 않는다. 왜냐하면, 또 다른 작업자 스레드를 강제로 키는 것은 성능에 않좋기 때문이다. 그래서 많은 양의 Job들이 스케줄되어 있더라도, 순차적으로 스케쥴된 Job들이 수행되게 기다려라.
Note: ECS 에서는 batch가 암묵적으로 flush된다. ScheduleBatchedJobs를 호출할 필요가 없다.
- NativeContainer 데이타를 바로 변경하지 말라
Job내에서 ref return 이 안되므로, NativeContainer를 참조형 변경을 하지 말라. 항상 복사본을 만들어서 변경시켜라
예)
nativeArray[0]++; // failed
var temp = nativeArray[0];
temp++;
nativeArray[0] = temp; // success
- 소유권을 얻기위해서는 JobHandle.Complete 호출하라
메인스레드에서 소유권을 얻으며, safety system이 상태를 리셋시켜서 메모리누수를 방지한다.
- Schedule, Complete를 메인 스레드에서 사용해라
- Schedule, Complete를 적절한 시간에 사용해라
Schedule() 함수를 호출하고 Job 결과값이 필요하기 전에는 Complete()함수를 호출하지 말아라. 다른 Job의 수행 결과를 기다릴 필요가 없을때 Schedule() 함수를 호출하는것이 좋은 습관이다. 예를 들어 1 frame latency일 경우에, 한 frame이 끝날때 즈음에 Schedule() 을 호출하고 다음 frame 의 시작시기에 그 결과 데이타를 사용하도록하자.
- NativeContainer 타입은 readonly로 설정하라
Job은 초기에 NativeContainer에 대한 읽기, 쓰기권한을 갖고 있다. 성능향상을 위해서 ReadOnly만을 설정해라.
- 데이타 의존성을 체크해라
유니티 프로파일러에, 메인스레드에 "WaitForJobGroup" 문구가 나온다면, 이는 작업 스레드의 Job이 완료되기를 Unity가 기다리고 있다는 의미.
이는 사용자가 어디선가 작업이 끝내기를 기다리는 선작업이 있다는 것으로 , 의존성 데이타를 사용하고 있다는 의미이다. JobHandle.Complete 를 찾아라. 메인스레드가 기다리게 만드는 데이타 의존성을 찾아야 한다.
- Debugging jobs
Job은 Run() 함수를 갖고 있다. Schedule() 함수 콜 위치에서 사용할수 있다. 이는 메인스레드의 Job을 바로 실행케하는 것이다. 이는 Debugging 목적으로만 쓰인다.
- Job내에서 managed memory를 생성하지 말아라
이는 매우 느려지게 하는 원인이다. job은 성능향상을 위해서 Unity Burst Compiler( managed code )를 이용할 수 없다.
댓글 없음:
댓글 쓰기