posted by REDFORCE 2018. 12. 22. 22:37

이번에는 최근 삽질과 연구 끝에 마무리한 C# Job System과 ECS에 대해서 적어보려 합니다.


아직 한글로 된 블로그 중에는 C# JobSystem과 ECS에 대해서 제대로 정리하거나 적어둔

블로그를 못 본것 같은데, 좋은 자료가 있다면 저도 알려주세요.


----------------------


본 글은 Unity 2018.2.1f1 을 기반으로 작성되었습니다.


관련 글 링크 목록

 #04. C# Job System_01

 #04. C# Job System_02


----------------------


먼저 C# Job System을 왜 만들었고, 어떻게 만들어졌으며 어떻게 쓰는지

차례대로 설명하도록 하겠습니다.


Unity C# Job System 메뉴얼

- https://docs.unity3d.com/kr/2018.1/Manual/JobSystem.html



1. C# Job System 


(개념적인 설명은 적기 귀찮으므로 메뉴얼 문서를 그대로 가져왔습니다)



잡 시스템이란?

잡 시스템(job system)은 스레드를 대신하여 을 만들어 멀티스레드 코드를 관리합니다.

잡 시스템은 여러 코어에 걸쳐 워커 스레드 그룹을 관리합니다. 컨텍스트가 바뀌지 않도록 하기 위해 일반적으로 CPU 논리 코어당 하나의 워커 스레드가 있지만, 시스템이 운영체제나 기타 전용 애플리케이션에서 사용할 코어 몇 개를 예약해 둘 수 있습니다.

잡 시스템은 잡 대기열에 잡을 배치하여 실행합니다. 잡 시스템의 워커 스레드는 잡 대기열에서 항목을 가져와 실행합니다. 잡 시스템은 종속성을 관리하고 작업이 올바른 순서대로 실행되도록 합니다.

잡이란?

잡(job)은 특정한 단일 작업을수행하는 작은 작업 단위입니다. 잡은 메서드 호출의 동작과 유사한 방식으로 파라마터를 수신하고 데이터 작업을 수행합니다. 잡은 독립적일 수도 있고, 다른 잡이 먼저 완료된 후에 실행되어야 할 수도 있습니다.

잡 종속성이란?

게임 개발에 필요한 시스템처럼 복잡한 시스템에서는 각 잡이 독립적일 가능성이 낮습니다. 이 경우 잡은 일반적으로 다음 잡에 사용할 데이터를 준비하는데, 이를 위해 종속성을 인식하고 지원합니다. jobA jobB에 종속된 경우 잡 시스템은 jobB가 완료될 때까지 jobA가 실행되지 않도록 합니다.


C# 잡 시스템의 안전 시스템

경쟁 상태

멀티스레드 코드를 작성할 때는 항상 경쟁 상태가 발생할 위험이 있습니다. 경쟁 상태는 통제할 수 없는 다른 프로세스의 타이밍에 따라 작업의 결과가 달라지는 경우에 발생합니다.

경쟁 상태가 반드시 버그는 아니지만, 비결정론적인 동작의 원인이 됩니다. 경쟁 상태로 인해 버그가 발생한 경우, 타이밍에 따라 원인이 달라지기 때문에 특수한 경우를 제외하고는 문제를 재현할 수 없어 근본적인 원인을 식별하기가 어려울 수 있습니다. 이러한 문제를 디버깅하면 중단점과 로깅에 따라 개별 스레드의 타이밍이 바뀌므로 문제가 사라질 수 있습니다. 경쟁 상태는 멀티스레드 코드 작성 시 가장 중대한 문제를 유발할 수 있습니다.

안전 시스템

멀티스레드 코드를 더 쉽게 작성할 수 있도록 Unity C# 잡 시스템은 모든 잠재적인 경쟁 상태를 감지하고 그로 인해 발생할 수 있는 버그를 차단합니다.

예를 들어, C# 잡 시스템에서 메인 스레드에 있는 코드의 데이터에 대한 레퍼런스를 잡으로 전송하는 경우, 잡이 데이터를 쓰는 동시에 메인 스레드가 데이터를 읽는지 시스템이 확인할 수 없습니다. 이 경우 경쟁 상태가 발생합니다.

C# 잡 시스템은 각 잡에 메인 스레드의 데이터에 대한 레퍼런스를 보내지 않고 작업이 필요한 데이터를 보내 이 문제를 해결합니다. 이 복사본은 데이터를 격리시키므로 경쟁 상태가 발생하지 않습니다.

C# 잡 시스템이 데이터를 복사하는 방법으로 인해 잡은 blittable 데이터 타입에만 액세스할 수 있습니다. 이 데이터 타입을 관리되는 코드와 네이티브 코드 간에 전달하는 경우 변환할 필요가 없습니다.

C# 잡 시스템은 memcpy를 사용하여 blittable 타입을 복사하고 Unity의 관리되는 파트와 네이티브 파트 간에 데이터를 전송할 수 있습니다. 시스템은 잡을 예약할 때 memcpy를 사용하여 데이터를 네이티브 메모리에 저장하고, 잡을 실행할 때 이 복사본에 액세스할 수 있는 권한을 관리되는 파트에 할당합니다. 자세한 내용은 잡 예약을 참조하십시오.

'Unity Engine > Unity3D Engine' 카테고리의 다른 글

C# Unity - Serializable Dictionary  (1) 2020.01.29
#04.C# Job System_02  (0) 2018.12.23
#03.JobSequenceManager  (0) 2018.12.21
#02.JobRepeatManager - 03  (0) 2018.12.20
#02.JobRepeatManager - 02  (0) 2018.12.20
posted by REDFORCE 2018. 12. 21. 11:20

이번에 적을 글은 전편인 JobRepeatManager 에 이어서 JobSequenceManager 입니다.

(대체 얼마나 할일없으면 나 자신은 이런걸 만드는거니...코딩 덕후 같으니)


다음과 같은 이유나 상황일 때 사용하기 위해 만들었습니다.


 > 순차적인 함수 호출이 필요하다

 > 서로 다른 인스턴스에서의 함수 호출로 인해 순차적 호출 시점 제어가 너무 귀찮다.

 > 각 함수들을 Coroutine 으로 순차적 실행을 하고 싶을 때가 있다.


그래서 만든 것이 JobSequenceManager 입니다.



JobSequenceManager는 다음과 같은 함수와 파라미터를 가지고 있습니다.


 멤버 변수

 설명


 public Queue<Tuple<MethodInfo, object, object[]>> _sequenceJobs


 등록되는 Job을 담고 있는 컨테이너 입니다.



 메소드

 설명 

 public void AddJob<T>(string methodName, params object[] parameter) 


 - 수행시킬 Job을 등록하는 함수입니다. 

 - AddJob<T>에서 <T>에는 본인이 등록 시킬 클래스 타입을 넣어주세요.

 - methodName에는 Type T에 구현되어있는 함수 이름을 넣어주세요.

 - 해당 함수에 파라미터를 전달 하고 싶은게 있을 시엔 parameter에 전달하면 됩니다.


 public void OnExecuteSequenceJob()


 - 등록 된 Job을 수행시킵니다.
 - 모든 Job을 일괄 순차적으로 수행시킵니다.


 public void OnExecuteSequenceCoroutine()


 - 등록 된 Job을 Corotuine 형태로 수행시킵니다.

 - 모든 Job을 순차적으로 수행시킵니다.

 - JobSequenceManager의 CoExecuteJobSequence( )
에서 한 Job마다 수행이 끝날 때마다 yield return null 이 불려집니다.


 protected IEnumerator CoExecuteJobSequence()


 - 등록 된 Job을 IEnumerator(Corotuine) 형태로 수행시키는 함수입니다.

 



사용 방법은 간단하게 아래 샘플로 적어두겠습니다.



'Unity Engine > Unity3D Engine' 카테고리의 다른 글

#04.C# Job System_02  (0) 2018.12.23
#04.C# Job System_01  (0) 2018.12.22
#02.JobRepeatManager - 03  (0) 2018.12.20
#02.JobRepeatManager - 02  (0) 2018.12.20
#02.JobRepeatManager - 01  (0) 2018.12.19
posted by REDFORCE 2018. 12. 21. 00:53

Unity 2018.2.1f1 - NGUI 3.12.0 을 기반으로 작성 되었습니다.

-----------------------

이번에 작성할 내용은 UIRoot에 이어서 UIPanel입니다.




UIPanel 은 NGUI의 UIWidget들이 담겨져서 보여지게 되는 일련의 가장 뒷편에 깔리는 도화지 같은 개념이라 보시면 됩니다.


 

 설명

 Alpha 


 해당 패널의 Hierarcy 구조상 하위에 붙은 모든 Widget들의 Alpha에 영향을 미치는 값 입니다. 하위에 붙어있는 Panel에는 영향을 주지 않습니다.

 

 Depth


 만약 UIPanel이 2개 이상 UIRoot에 자식으로 활성화되어 있을 시

먼저 보여지게 될 순서를 의미합니다.


 Clipping


 특정 영역을 설정하고 그 영역 밖에 있는 부분을 렌더링하지 않는 것을 의미합니다.


 > None : 클리핑을 하지 않습니다.

 > Texture Mask : 등록 된 Texture 영역을 제외하고 클리핑 합니다.

 > Soft Clipping : 패널 영역을 설정하고 클리핑 합니다. Softness 값을 주어 외곽부분을 부드럽게 클리핑 되도록 합니다.

 > Constrained But Dont Clip : 패널 영역을 지정하지만 클리핑은 하지 않습니다.


 Advanced Options

  

 Render Q :
  - Rendering 되어질 때의 순서를 정할 수 있습니다.

  - UI에 Particle System 을 사용하는 상황 같은 Render Queue 경쟁이 벌어질 수 있는 환경에서 설정하는 값 입니다. 

 Sort Order :
  - 같은 DEpth에서 렌더링 순서를 결정합니다.
  - Unity Sprite의 OrderInLayer와 유사합니다.
  - 높을 수록 위에 출력됩니다.

 Normal : 체크하면 패널이 Light에 영향을 받습니다.

 Cull : ScrollView 패널에서 성능 향상을 위해 사용되어지는 옵션입니다. 패널이 드래그(Drag) 되어 Widget이 패널 영역을 벗어날 시 자식위젯들을 Rendering 하지 않습니다.

 Visible : 패널 내부의 Widget들이 스크린 안에 있는지 계산하여 Rendering 여부를 결정하는 데, 이 계산을 건너띄게 만듭니다.
UIWidget 들이 패널을 벗어날 일이 없을 경우 체크하게 되면 성능이 향상 됩니다.

 Padding : 패널의 외각 부분을 부드럽게 만듭니다.
 (클리핑 옵션이 Softness 인 상태에서는 의미는 없는 듯)

 Static : 패널 내의 위젯들이 이동이 없는 경우 Static으로 설정하면 유니티가 Position, Rotation, Scale 값을 계산하지 않아 성능이 향상 됩니다.


 Anchors


  UIPanel 또는 UIWidget 에서 특정 위치를 기준으로 좌표가 잡히도록 설정하는 값 입니다.


 Show Draw Calls

 Draw Call Tool 창을 불러옵니다.


'Unity Engine > NGUI' 카테고리의 다른 글

[NGUI] Infinite ScrollView (AT)  (1) 2019.06.20
NGUI #01.UIRoot  (0) 2018.12.18