잡소리 없이 바로 시작하자 !!

 

아래는 현재 OnUpdate의 상태이다.

 

이 것을 아래와 같이 고쳐보겠다.

 

내용은 별로 바뀌지 않았다.

 

어떤부분이 왜 바뀌었는지 알아보자

 

먼저 C# Job System에서 Job은 struct로 구현해야하는 규칙이 있다.

인터페이스는 IJobEntity를 사용한다.

(보통은 C# Job System에서 IJob혹은 IJobParallelFor을 사용하는데, ECS에서는 전용 인터페이스로 IJobEntity가 구현되어있기때문에 이것을 사용하면 됨.)

 

그리고 이전의 [BurstCompile]에서 배웠던 것 처럼 partial키워드를 추가하였다.

(여기서도 Source Generator과 공존해야하기 때문)

 

아래는 좌측은 이전의 OnUpdate 우측은 C# JobSystem적용을 위해 리팩토링한 코드이다.

 

경과시간은 멤버변수로 변경되었다.

 

foreach가 아닌 Execute 메서드를 구현하였다.

 

원래라면 쿼리의 결과를 foreach를 돌렸는데, IJobEntity에서는 이 Execute메서드의 구현이 Query를 대신한다

 

쿼리의 조건을 인자값으로 전달하면 그에 일치하는 엔티티를 자동으로 탐색해서 실행하는 방식이다.

 

신기하게도 필요한건 모두 ECS와 Source Generator가 자동으로 실행해준다.

 

그 후의 로직은 거의 동일하다.

 

다음으로 이 Job을 발행하는 처리를 OnUpdate에서 작성하는데,

 

 

사진을 보면 첫번째로 DancerUpdateJob을 초기화 한다.

 

아까 만들어둔 경과시간을 멤버변수로 대입해 둬야 한다.

 

그리고 ScheduleParallel 메서드로 이 Job의 실행을 예약한다.

 

하지만 이렇게 했다고 해서 이 Job이 여기서 즉시 실행되는것이 아니다.

 

Job System의 관리 하에 비동기로 실행이 된다.

 

이런 변경을 적용한 후 프로파일러로 어떤 변화가 생겼는지 알아보자.

 

우선 메인스레드 상의 처리는 단순히 잡을 등록하는 것이라서 굉장히 빨라졌다.

(영상자료 기준 0.02ms)

 

아래의 사진자료를 보면 등록한 Job들이 멀티 스레드로 병렬처리 되고있는걸 볼 수 있다.

 

 

이와중에 제일 긴 시간이 걸린것이 0.04ms수준이다.

 

이전과 대비해서 대충 10배이상은 빨라진것이다.

 

WalkerSystem에도 최적화를 하고 결과를 알려줬는데

아래와 같은 결과가 나왔다.

 

기존 : 6.70ms

BurstCompile : 0.29ms

Jobified : 0.07ms

 

다음시간에는 ECS에서 물리엔진을 사용해보도록 하겠다.