잡소리 없이 바로 시작하자 !!
아래는 현재 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에서 물리엔진을 사용해보도록 하겠다.