■ 이론
https://yjhdevelopdiary.tistory.com/247
[DOTS] C# Job System & Burst Compile 이론
■ C# Job System 1. 유니티 내에서 멀티스레딩을 할 수 있는 방법 중 하나 2. 다른 방법들과의 차별점[장점]이 아래와 같이 있다. · Automates Scheduling · Safety Checks to avoid Race conditions and other
yjhdevelopdiary.tistory.com
■ 초기 예시 코드 (ECS중 Entity, Component)

1. RotateSpeedAuthoring (Entity)
· 유니티 개체에 컴포넌트 부착을 위해 Monobehaviour 상속을 받음.
[Bake]
· Unity.Entities.Baker를 통해, 사용자가 설정한, Monobehaviour 컴포넌트의 필드인 value값을 Entity가 사용할 RotateSpeed 구조체 내 필드에 베이킹함
* 쉽게 말해 Bake는 GameObject Data [Authoring Data]를 ECS Data [Runtime Data]로 변환하는 작업임
(참고)
https://docs.unity3d.com/Packages/com.unity.entities@1.3/manual/baking-overview.html
Baking overview | Entities | 1.3.10
Baking overview Baking is a process that converts GameObject data in the Unity Editor (authoring data) into entities written to Entity Scenes (runtime data). Baking is a non-reversible process that turns a performance-intensive but flexible set of GameObje
docs.unity3d.com
· ECS 시스템에 의해 Bake 함수가 자동으로 호출됨. GetEntity는 현재 Baker가 호출되고 있는 Entity가 반환됨.
· Bake는 최적화를 목적으로 보통 Asset Import처럼 인게임이 아닌 에디터에서만 호출이 되어지고 Authoring Scene 내 Authoring 데이터에 변화가 생겼을 때마다 발생한다. 인게임에서는 이미 Bake된 데이터를 사용한다.

2. RotateSpeed (Component)
· Entity가 갖는 데이터
■ 초기 예시 코드 (ECS중 System)

* RefRW : Read & Write 가능
* RefRO : Read Only
* dummyValue는 프로파일러에서 빠른 확인을 하기 위해 일부러 성능저하용으로 작성한 코드
■ JobSystem
▼ 아직 JobSystem이 적용되지 않았기에 메인 스레드에서 돌아가고 있는 것을 확인할 수 있다.

▼ JobSystem의 Schedule 함수 적용 후 코드 & 프로파일러 예시

▼메인 스레드에서 분리 및 단일 워커에서 처리됨

* 메인스레드의 부담을 덜어주고 단일 작업을 하나의 워커스레드에 배정해줬다.
* 이와 달리 자동으로 여러 워커 스레드에 분배하기 위해선 ScheduleParallel를 사용한다.
▼ ScheduleParallel()

▼ (이슈) ScheduleParallel를 했음에도 단일 워커스레드에서 돌아가고 있음.

▼ (확인) 해당 작업을 수행하는 엔터티의 개수가 충분히 많아야 청크로 나뉘어 여러 워커스레드에 분배될 수 있음을 확인. 즉, 적은 숫자의 엔터티로 수행할 경우 여러 개의 청크가 아닌 하나의 청크에 모두 담겨지기 때문에 단일 스레드에 돌아가는 것임

▼ 개체를 대략 10개에서 789개로 늘린 뒤 다시 확인해봤다. 이젠 여러 워커스레드에서 작업을 자동적으로 분배하여 수행하고 있다.
(메인 스레드는 Schedule을 수행할 때도 0.2ms 성능을 보여주고 있었다. ScheduleParallel를 통해 789개의 개체를 운용을 하고 있음에도 메인 스레드는 0.016ms의 지연율을 유지 및 여러 워커스레드에 작업을 분배하였다.)

■ Burst Compile
▼ RotatingCubeJob 에 BurstCompile를 사용 시 성능 대폭 향상


[Burst Compile 전]
· 메인 스레드: 0.016ms
· 워커 스레드: 2.41 ~ 4.30ms
[Burst Compile 후]
· 메인 스레드: 0.013ms
· 워커 스레드: 0.01 ~ 0.02ms
· 워커스레드가 수행하고 있는 작업의 이름에도 (Burst)키워드가 붙은 것을 볼 수 있다.
■ 프레임 확인
▼ ECS, Burst Compile, Job System 셋 다 적용 시




기기별로 성능 차이가 있겠지만 대략 800개 정도 되는 개체를 회전시키고 있음에도 불구하고
430 ~ 490 fps를 유지하고 있다.
▼ 기존 Monobehaviour 방식대로 사용했을 경우

동일 개수 -> 100FPS정도 잡힘
'개발 (Game) > Unity (DOTS)' 카테고리의 다른 글
[DOTS] C# Job System & Burst Compile 이론 (0) | 2025.03.01 |
---|---|
[DOTS] Netcode For Entities, Physics (0) | 2025.03.01 |
[DOTS] 기본 이론 및 ECS 내용 정리 (0) | 2025.03.01 |