ParallelForTransform 잡
멀티플레이어 및 네트워킹

C# 잡 시스템 팁 및 문제 해결

Unity C# 잡 시스템을 사용할 때는 다음 사항을 준수해야 합니다.

잡에서 정적 데이터에 액세스하지 않기

잡에서 정적 데이터에 액세스하면 모든 안전 시스템을 우회하게 됩니다. 잘못된 데이터에 액세스하면 Unity에 예상치 못한 크래시가 발생할 수 있습니다. 예를 들어, MonoBehaviour에 액세스하면 도메인을 다시 로드할 때 크래시가 일어납니다.

참고: 이러한 위험성 때문에 향후 Unity 버전에서는 정적 분석을 사용하여 잡이 전역 변수에 액세스하지 못하도록 막을 예정입니다. 향후 Unity 버전의 경우 잡 내에서 정적 데이터에 액세스하면 코드가 손상될 수 있습니다.

예약된 배치를 플러시하기

잡 실행을 시작하려는 경우 JobHandle.ScheduleBatchedJobs를 사용하여 예약된 배치를 플러시할 수 있습니다. 이 메서드를 호출하면 성능 저하가 발생할 수 있습니다. 배치를 플러시하지 않으면 메인 스레드가 결과를 기다릴 때까지 예약이 지연됩니다. 그외 다른 경우에는 JobHandle.Complete을 사용하여 실행 프로세스를 시작하십시오.

참고:엔티티 컴포넌트 시스템(ECS)에서 배치는 암시적으로 플러시되므로 JobHandle.ScheduleBatchedJobs를 호출할 필요가 없습니다.

NativeContainer 콘텐츠를 업데이트하지 않기

레퍼런스 반환의 부재로 인해 NativeContainer의 콘텐츠를 직접 변경할 수 없습니다. 예를 들어, nativeArray[0]++;nativeArray에서 값을 업데이트하지 않는 var temp = nativeArray[0]; temp++;를 작성하는 것과 동일합니다.

대신에 인덱스의 데이터를 로컬 임시 복사본으로 복사하고 해당 복사본을 수정한 후 다음과 같이 다시 저장해야 합니다.

MyStruct temp = myNativeArray[i];
temp.memberVariable = 0;
myNativeArray[i] = temp;

JobHandle.Complete를 호출하여 소유권 다시 얻기

데이터 소유권을 추적하려면 종속성을 완료하여 메인 스레드가 다시 사용할 수 있도록 해야 합니다. JobHandle.IsCompleted을 확인하는 것만으로는 부족합니다. JobHandle.Complete 메서드를 호출하여 NativeContainer 타입의 소유권을 다시 얻어 메인 스레드에 제공해야 합니다. 또한 Complete를 호출하면 안전 시스템의 상태도 정리됩니다. 이렇게 하지 않으면 메모리 누수가 발생합니다. 이전 프레임의 잡에 대한 종속성이 있는 모든 프레임마다 새 잡을 예약하는 경우에도 이 프로세스가 적용됩니다.

메인 스레드에서 예약 및 완료 사용

메인 스레드에서는 ScheduleComplete만 호출할 수 있습니다. 한 잡이 다른 잡에 종속되는 경우에는 잡 내에서 잡을 예약하지 말고 JobHandle을 사용하여 종속성을 관리하십시오.

적시에 예약 및 완료 사용

잡이 필요한 데이터를 얻은 후 잡에 대해 Schedule을 호출하고, 결과를 얻을 때까지 잡에 대해 Complete를 호출하지 마십시오. 잡을 예약할 때는 실행 중인 다른 잡과 경쟁하지 않을 때까지 기다릴 필요가 없도록 해야 합니다. 예를 들어, 한 프레임의 끝과 다른 프레임의 시작 간에 시간 간격이 있고 아무런 잡도 실행되지 않으며 한 프레임의 지연이 용인할 수 있는 수준인 경우에는 잡을 프레임 끝에 가깝게 예약하고 그 결과를 다음 프레임에 사용할 수 있습니다. 또는 게임에서 다른 잡과의 전환 기간이 포화 상태이고 프레임 내 어딘가에 충분히 활용하지 않은 시간이 있는 경우에는 해당 지점에서 잡을 예약하는 것이 더 효율적입니다.

NativeContainer 타입을 읽기 전용으로 표시

잡에는 기본적으로 NativeContainer 타입에 대한 읽기/쓰기 권한이 있습니다. 적절한 경우 [ReadOnly] 속성을 사용하여 성능을 향상시키십시오.

데이터 종속성 검사

Unity Profiler 창에서 메인 스레드의 “WaitForJobGroup” 마커는 Unity가 워커 스레드에 대한 잡이 완료되기를 기다리고 있음을 나타냅니다. 또한 어딘가에서 데이터 종속성이 사용되고 있어 해결이 필요함을 의미할 수도 있습니다. JobHandle.Complete를 찾아보면 메인 스레드를 대기하도록 만드는 데이터 종속성의 위치를 추적할 수 있습니다.

잡 디버깅

잡에는 Schedule 대신에 사용하여 메인 스레드의 잡을 즉시 실행할 수 있는 Run 함수가 있습니다. 이 함수는 디버깅 목적으로도 사용할 수 있습니다.

잡에서 관리되는 메모리 할당하지 않기

잡에서 관리되는 메모리를 할당하면 속도가 매우 느려지고, 잡이 Unity Burst 컴파일러를 충분히 활용하여 성능을 향상할 수 없습니다. Burst는 여러 이점을 제공하는 새로운 LLVM 기반 백엔드 컴파일러 기술입니다. C# 잡을 사용하여 플랫폼의 특정 기능을 활용하여 고도로 최적화된 기계어 코드를 생성합니다.

추가 정보


  • 2018–06–15 편집 리뷰를 거쳐 페이지 게시됨

  • 2018.1에서 공개된 C# 잡 시스템 NewIn20181

ParallelForTransform 잡
멀티플레이어 및 네트워킹