|
1 |
| -# Unity_Study_ECS |
2 |
| -유니티 ECS 공부 목적용 저장소입니다. |
| 1 | +# 개요 |
| 2 | +유니티 ECS & Job System 공부 목적용 저장소입니다. |
| 3 | + |
| 4 | +### ECS & C# Job System & Burst Compiler? |
| 5 | + |
| 6 | +- **ECS(엔티티 컴포넌트 시스템) :** 새로운 C# 잡 시스템은 간편하면서도 안전한 방식으로 멀티코어를 활용합니다. C# 스크립트를 활용하여 사용자가 빠르게 잡 코드를 작성할 수 있으므로 간편하며, 경합 조건과 같은 멀티스레딩의 일부 위험을 방지하므로 더욱 안전합니다. |
| 7 | + |
| 8 | +- **C# Joyb System(멀티 스레딩 활용 API) :** ECS는 실제 해결해야 하는 문제, 즉 게임을 구성하는 데이터와 동작을 집중적으로 다루는 코드 작성 방식입니다. |
| 9 | +ECS를 사용하면 디자인 측면에서 더 나은 방식의 게임 프로그래밍이 가능할 뿐 아니라, Unity의 C# 잡 시스템과 버스트 컴파일러를 더욱 효과적으로 이용하여 최첨단 멀티코어 프로세서의 기능을 빠짐없이 활용할 수 있습니다. |
| 10 | +Unity는 ECS를 통해 오브젝트 중심의 디자인에서 데이터 중심의 디자인으로 이동하고자 합니다. 이러한 변화를 통해 사용자 간에 코드를 이해하고 작성에 참여하거나 코드를 재사용하기가 더욱 수월해질 것입니다. |
| 11 | +- **Burst Compiler(고도의 최적화 컴파일러) :** 새로운 LLVM 기반의 연산 인식 백엔드 컴파일러 기술을 통해 C# 작업을 처리하고 고도로 최적화된 코드를 작성할 수 있습니다. |
| 12 | +또한 ECS 기반의 코드라면 코드 수정을 크게 하지 않고 쉽게 적용할 수 있습니다. |
| 13 | + |
| 14 | +- **ECS & JobSystem & Burst Compolier 퍼포먼스** |
| 15 | + - 오브젝트를 만개 단위로 뿌려 FPS 30까지 얼마나 많은 오브젝트를 동시 실행할 수 있는지 |
| 16 | + |
| 17 | + |
| 18 | +| 작동 방식 | 오브젝트 개수 | 유튜브 영상 링크 | |
| 19 | +| :---: | :---: | :---: | |
| 20 | +| Classic | 18500개 | [링크](https://youtu.be/WZ6-LxwxWEI?t=2m51s) | |
| 21 | +| Classic & Job System | 25000개 | [링크](https://www.youtube.com/watch?v=j2z5KRWZTDA) | |
| 22 | +| ECS & Job System | 96000개 | [링크](https://youtu.be/D1KShj8ZV_I?t=12s) | |
| 23 | +| ECS & Job System & Burst Compolier | 156000개 | [링크](https://youtu.be/D1KShj8ZV_I?t=1m57s) | |
| 24 | + |
| 25 | + |
| 26 | +- 출처 링크 - 유니티 홈페이지에 소개된 설명 |
| 27 | + - https://unity3d.com/kr/unity/features/job-system-ECS |
| 28 | + |
| 29 | +### ECS 개발 세팅 |
| 30 | +- Unity 2018.01 버젼 이상 설치 |
| 31 | +- Unity - PlayerSetting - API Compatibility Level - .net 3.x -> .net 4.x로 변경 |
| 32 | +- Unity 2018버젼부터 생긴 Package Manager - ECS 설치 |
| 33 | + |
| 34 | +- Visual Studio 최신으로 설치 |
| 35 | +( VS 버젼이 오래되었을 경우 Unity 컴파일러와 VS 컴파일러가 따로 구동되어 VS에서 ECS 관련 스크립트 작성 불가 ) |
| 36 | + |
| 37 | +- 추천 개발 세팅 비디오 - Brackeys / New way of CODING in Unity! ECS Tutorial |
| 38 | +https://www.youtube.com/watch?v=_U9wRgQyy6s |
| 39 | + |
| 40 | +### ECS 장단점 |
| 41 | + |
| 42 | +#### 장점 |
| 43 | + |
| 44 | +- 데이터 지향 개발을 사용하기 때문에, CPU 캐쉬메모리와 멀티 쓰레딩에 친화적이다. ( 성능 UP ) |
| 45 | +- 개발이 진행됨에 따라 생기는 예기치 못한 기능 추가 및 변경에 대해 보다 빠르게 대처할 수 있다. |
| 46 | +- 코드의 상호 의존성이 없어 코드를 재사용하기 용이하다. |
| 47 | +- 위와 마찬가지로 상호 의존성이 없어, 전체적으로 코드가 짧아져 코드 분석 및 유지보수가 용이하다. |
| 48 | + |
| 49 | + |
| 50 | +사진 출처 유니티 테크니컬 에반젤리스트 Mike Geig 트윗 : https://twitter.com/mikegeig/status/951260836538003458 |
| 51 | + |
| 52 | +#### 단점 |
| 53 | + |
| 54 | +- 기존 객체 지향 개발 방식 **(OOP Object Oriented Develop)** 을 버리고 새로운 설계방식 **(DOP(Data Oriented Develop) - 데이터 지향 개발)** 을 사용해야 하기 때문에, 학습 및 개발 비용이 생긴다. |
| 55 | +- 나온지 얼마 안된 기능으로, Research & Develop하기가 힘들다. |
| 56 | +- Physics관련 기능을 ECS로 사용할 수 없다. |
| 57 | + |
| 58 | +- 디버깅 관련 |
| 59 | + - VS 디버그 - 중단점 기능을 지원하지 않는다. ( 시도 시 VS 멈춤 & 유니티 응답 없음 ) |
| 60 | + - Classic처럼 게임을 중단하여 렌더링 된 오브젝트를 클릭 시 오브젝트를 선택할 수 없다. ( Entity Debug - Entity를 선택해야 한다. ) |
| 61 | + - Job System을 사용할 경우 멀티 스레딩 방식이기에 디버깅하기가 더 힘들다. |
| 62 | + |
| 63 | +#### 결론 |
| 64 | + |
| 65 | +- **장단점은 결국 OOP와 DOP의 차이점이다.** |
| 66 | +- 모든 스크립트를 ECS 기반으로 설계하는 것은 비효율적이다. |
| 67 | + - 대규모 오브젝트(성능을 요하는) 혹은 UI(재사용을 요하는)부분에만 ECS로 구현하는것이 좋다. |
| 68 | + - 절차위주나 그 외 **OCP(Open Close Principle, OOP - 개방 폐쇄의 원칙)** 을 적용하기 용이한 경우 - 구체적으로 게임 규칙의 경우 기존의 MonoBehaviour & Scriptable Object 방식으로 구현하는 것이 좋다. |
| 69 | + |
| 70 | + |
| 71 | +--- |
| 72 | +## ECS |
| 73 | + |
| 74 | +### ECS 예시 |
| 75 | + |
| 76 | +#### Pure ECS |
| 77 | +```csharp |
| 78 | +using Unity.Collections; |
| 79 | +using Unity.Entities; |
| 80 | +using Unity.Jobs; |
| 81 | +using Unity.Mathematics; |
| 82 | +using Unity.Transforms; |
| 83 | +using UnityEngine; |
| 84 | + |
| 85 | +[System.Serializable] |
| 86 | +public struct Rotater_Pure : IComponentData |
| 87 | +{ |
| 88 | + public float fSpeed; |
| 89 | +} |
| 90 | + |
| 91 | +public class Rotater_PureComponent : ComponentDataWrapper<Rotater_Pure> { } |
| 92 | + |
| 93 | +public class RotaterSystem_Pure : JobComponentSystem |
| 94 | +{ |
| 95 | + struct RotationJob : IJobProcessComponentData<Rotation, Rotater_Pure> |
| 96 | + { |
| 97 | + public float fDeltaTime; |
| 98 | + |
| 99 | + public void Execute(ref Rotation sRotation, [ReadOnly]ref Rotater_Pure sRotater) |
| 100 | + { |
| 101 | + sRotation.Value = math.mul(math.normalize(sRotation.Value), quaternion.axisAngle(math.up(), sRotater.fSpeed * fDeltaTime)); |
| 102 | + } |
| 103 | + } |
| 104 | + |
| 105 | + protected override JobHandle OnUpdate(JobHandle inputDeps) |
| 106 | + { |
| 107 | + var job = new RotationJob() { fDeltaTime = Time.deltaTime }; |
| 108 | + return job.Schedule(this, 64, inputDeps); |
| 109 | + } |
| 110 | +} |
| 111 | +``` |
| 112 | + |
| 113 | +Pure ECS의 경우 오브젝트에 |
| 114 | +Rendrer Component -> MeshInstanceRendererComponent |
| 115 | +Transform Component -> Position & Rotation Component |
| 116 | +를 Attach해야 동작합니다. |
| 117 | + |
| 118 | +#### Hybrid ECS |
| 119 | +```csharp |
| 120 | +using System.Collections; |
| 121 | +using System.Collections.Generic; |
| 122 | +using Unity.Entities; |
| 123 | +using UnityEngine; |
| 124 | + |
| 125 | +public class Rotater : MonoBehaviour |
| 126 | +{ |
| 127 | + public float fSpeed; |
| 128 | +} |
| 129 | + |
| 130 | +class RotaterSystem : ComponentSystem |
| 131 | +{ |
| 132 | + struct Components |
| 133 | + { |
| 134 | + public Rotater rotater; |
| 135 | + public Transform transform; |
| 136 | + } |
| 137 | + |
| 138 | + protected override void OnUpdate() |
| 139 | + { |
| 140 | + float fDeltaTime = Time.deltaTime; |
| 141 | + foreach (var e in GetEntities<Components>()) |
| 142 | + { |
| 143 | + e.transform.Rotate(0f, e.rotater.fSpeed * fDeltaTime, 0f); |
| 144 | + } |
| 145 | + } |
| 146 | +} |
| 147 | +``` |
| 148 | + |
| 149 | + |
| 150 | +#### Class & Interface |
| 151 | + |
| 152 | +- ComponentDataWrapper |
| 153 | + |
| 154 | +- ComponentSystem |
| 155 | + |
| 156 | +- IComponentData |
| 157 | + |
| 158 | +- ISharedComponentData |
| 159 | + |
| 160 | + |
| 161 | +--- |
| 162 | +## Job System |
| 163 | + |
| 164 | +--- |
| 165 | +## Burst Compiler |
| 166 | + |
| 167 | + |
| 168 | +--- |
| 169 | +## 도움이 되는 링크 |
| 170 | + |
| 171 | +### Github |
| 172 | + |
| 173 | +비디오를 시청 후 번호 순서대로 보시는 것을 추천합니다. |
| 174 | + |
| 175 | +#### 1. Unity Tehcnologies / EntitiyComponentSystemSamples |
| 176 | +- 유니티에서 제작한 ECS Sample 예제이며, 항상 최신버젼으로 업데이트됩니다. |
| 177 | +https://github.com/Unity-Technologies/EntityComponentSystemSamples |
| 178 | + |
| 179 | + |
| 180 | +#### 2. stella3d / job - system - cookbook |
| 181 | +- 유니티에서 소개하는 C# Job System Sample 예제입니다. |
| 182 | +https://github.com/stella3d/job-system-cookbook |
| 183 | + |
| 184 | +#### 3. KptEmreU / Roll - A - Ball - ECS - style |
| 185 | +- 어떤 개발자가 제작한 Pure ECS Style Roll a Ball 예제입니다. |
| 186 | +https://github.com/KptEmreU/Roll-A-Ball-ECS-style |
| 187 | + |
| 188 | +--- |
| 189 | +### Youtube Video |
| 190 | + |
| 191 | +번호 순서대로 보시는 것을 추천합니다. |
| 192 | + |
| 193 | +#### 1. Unity / Overview - Intro To The Entity Component System And C# Job System 1/5 |
| 194 | +- 유니티에서 ECS & Job System에 대해 개요부터 Classic ~ ECS & Job System 퍼포먼스 체크까지 설명합니다. |
| 195 | +- 7~11여분 정도 길이의 비디오가 총 5편으로 되어있으며, 코드보단 왜 ECS를 사용해야 하는지에 대해 초점이 맞춰져 있습니다. |
| 196 | + https://www.youtube.com/watch?v=WLfhUKp2gag&list=PLX2vGYjWbI0S4yHZwjDI1boIrYStpBCdN |
| 197 | + |
| 198 | +#### 2. Brackeys / New way of CODING in Unity! ECS Tutorial |
| 199 | +- 유니티 및 개발 전문 방송 Brackeys에서 설명하는 ECS 튜토리얼입니다. |
| 200 | +- 10분정도 길이이며, Hybrid ECS만 간단하게 설명합니다. |
| 201 | +https://www.youtube.com/watch?v=_U9wRgQyy6s |
| 202 | + |
| 203 | +#### 3. Infallible Code / Unity ECS Tutorial • Introduction |
| 204 | +- 유니티 및 개발 전문 방송 Infallible Code에서 설명하는 ECS 튜토리얼 입니다. |
| 205 | +- 10여분 정도 길이의 비디오가 총 7편으로 되어있으며, Hybrid ~ Pure ECS, Job System까지 슈팅게임 제작 기준으로 설명합니다. |
| 206 | +https://www.youtube.com/watch?v=yzhsgaFVpZY |
0 commit comments