1. ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ์ด๋?
๋ฉํฐ์ฐ๋ ๋ ํ๊ฒฝ์์ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ ๋์ ๊ท์น๊ณผ ๋ณด์ฅ ๋ฒ์๋ฅผ ์ ์ํ ๊ฒ
- ์ฐ๋ฆฌ๊ฐ x = 10 ๊ฐ์ ์ฝ๋๋ฅผ ์ด๋ค๊ณ ํด๋, ์ค์ ์คํ ์์๋ ์ฝ๋ ๊ฐ์ CPU, ์ปดํ์ผ๋ฌ, ๋ฉ๋ชจ๋ฆฌ ์ต์ ํ์ ์ํด ๋ฌ๋ผ์ง ์ ์์
-> ์ธ์ ์ด๋ค ๊ฐ์ด ๋ณด์ฅ๋๋์ง? -> ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ์ด ์ด๊ฑธ ์ ์ํด์ ์ค
2. ์ ์ค์ํ๊ฐ?
๋ฉํฐ์ฝ์ด CPU์์๋ ๊ฐ ์ฝ์ด๋ง๋ค ์บ์๊ฐ ์์
-> ๋ณ์ ๊ฐ์ ๋ฐ๋ก RAM์์ ์ฝ์ง ์๊ณ , ์๊ธฐ ์บ์์์ ์ฝ๊ณ ์ธ ์ ์์
-> ๊ทธ๋ฌ๋ฉด ๋ฌธ์ ๊ฐ ์๊น:
A ์ฝ์ด๊ฐ x=10 ํ๋๋ฐ, B ์ฝ์ด๋ x๊ฐ 0์ธ์ค ์๊ณ ์๋ชป๋ ๊ณ์ฐ์ ํ ์ ์์
3. Cache Coherency (์บ์ ์ผ๊ด์ฑ)
๋ฉํฐ์ฝ์ด CPU๋ ์ฝ์ด๋ค ๊ฐ ์บ์์ ๊ฐ์ ๋๊ธฐํํด์ผ ํจ
-> ์ด๊ฑธ ์บ์ ์ผ๊ด์ฑ(coherency)๋ผ๊ณ ํจ
๋ํ์ ์ธ ํ๋กํ ์ฝ : MESI (Modified, Exclusive, Shared, Invalid)
-> ๊ฐ ์บ์ ๋ผ์ธ์ด ์ด๋ค ์ํ์ธ์ง ์ถ์ ํด์
-> ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ๋ค๋ฅธ ์ฝ์ด๋ค์๊ฒ ์๋ฆผ (Invalidation)
4. CPU/์ปดํ์ผ๋ฌ์ ๋ช
๋ น์ด ์ฌ๋ฐฐ์น ๋ฌธ์
- CPU๋ ์ปดํ์ผ๋ฌ๋ ์ฑ๋ฅ์ ์ํด ๋ช
๋ น์ด ์์๋ฅผ ๋ฐ๊พธ๊ธฐ๋ ํจ
- a = 1; b = 2; -> ์ค์ ๋ก๋ b = 2; a = 1; ์ด ๋จผ์ ์คํ๋ ์๋ ์์
- ๋จ์ผ ์ฐ๋ ๋์์ ๋ฌธ์ ์์ง๋ง, ๋ฉํฐ์ฐ๋ ๋์์ Race Condition ๋ฐ์ ๊ฐ๋ฅ
5. ํด๊ฒฐ ๋ฐฉ๋ฒ: ๋ฉ๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์ด & volatile
5-1. Memory Barrier (๋ฉ๋ชจ๋ฆฌ ์ฅ๋ฒฝ)
- CPU๊ฐ ๋ช
๋ น์ด ์์ ์ฌ๋ฐฐ์น๋ฅผ ํ์ง ์๋๋ก ๋ง๋ ๋ช
๋ น
- ์ข
๋ฅ
- Load Barrier: ์ฝ๊ธฐ ์์ ๊ณ ์
- Store Barrier: ์ฐ๊ธฐ ์์ ๊ณ ์
- Full Barrier: ์ฝ๊ธฐ/์ฐ๊ธฐ ๋ชจ๋ ์์ ๊ณ ์
5-2. volatile ํค์๋ (C#)
- ๋ณ์์ volatile์ ๋ถ์ด๋ฉด:
- ํญ์ ๋ฉ์ธ ๋ฉ๋ชจ๋ฆฌ์์ ์ฝ๊ณ ์
- CPU ์บ์/์ปดํ์ผ๋ฌ ์ต์ ํ ๋ฐฉ์ง
- ๋จ์ : ์์ ํ ๋๊ธฐํ๋ ์ ๋จ (lock์ ์๋)
6. .NET ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ ์์ฝ
- C#์ lock, Interlocked, volatile์ ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ ๋ณด์ฅ์ ๊ธฐ๋ฐ์ผ๋ก ๋์
- lock์ ๋ด๋ถ์ ์ผ๋ก Memory Barrier๊ฐ ํฌํจ๋จ -> ์์ ์
- Interlocked๋ ์์์ (๋์ด์ ์ชผ๊ฐค์ ์๋) ์ฐ์ฐ + ๋ฉ๋ชจ๋ฆฌ ๋ฒ ๋ฆฌ์ด๋ฅผ ์๋ ์ฝ์
7. Unity์์๋?
- Unity๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฉ์ธ ์ค๋ ๋์์ ๋ชจ๋ API ๋์์ด ์ด๋ฃจ์ด์ง
- ํ์ง๋ง Job System, Burst, NativeArray ๊ฐ์ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ ๋:
- ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ์์์ ์บ์ ๋๊ธฐํ์ ์ ๊ฒฝ ์จ์ผ ํจ
- Unity์ Jobs.WithReadOnly(), NativeContatiner ํน์ฑ์ ๋ฉ๋ชจ๋ฆฌ ์ผ๊ด์ฑ์ ์ํ ํํธ ์ญํ ์ ํจ
Burst Compiler๋?
์์ฝ
C# ์ฝ๋๋ฅผ ๋ค์ดํฐ๋ธ ๋จธ์ ์ฝ๋๋ก ์ปดํ์ผํด์ฃผ๋ Unity ์ ์ฉ ๊ณ ์ ์ปดํ์ผ๋ฌ
ํน์ง
- JIT์ด ์๋๋ผ AOT (Ahead of Time) ๋ฐฉ์
- ์ผ๋ฐ C# ์ฝ๋๋ณด๋ค ์์ญ ๋ฐฐ ๋น ๋ฅผ ์ ์์
- SIMD(๋ฒกํฐ ๋ช
๋ น์ด)์ CPU ์บ์ ์ต์ ํ๋ฅผ ์ ๊ทน ์ฌ์ฉ
- Unity Editor์์๋ Burst๊ฐ ์ ์ฉ๋ ํจ์๋ ์ฆ์ ํ์ธ ๊ฐ๋ฅ
[BurstCompile]
public struct MyJob : IJob
{
public void Execute()
{
}
}
์ฅ์
- CPU ๋ช
๋ น ์ต์ ํ
- ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ์ต์ํ
- ์ฐ๋ ๋ ์์ ๋ณด์ฅ
Job System์ด๋?
์์ฝ
Unity๊ฐ ์ ๊ณตํ๋ ๋ฉํฐ์ค๋ ๋ฉ ์์
์์คํ
-> ๋ฉ์ธ ์ค๋ ๋๋ฅผ ๋ง์ง ์๊ณ , ์ฌ๋ฌ ์์
์ ๋์์ ์คํ ๊ฐ๋ฅ
๊ธฐ๋ณธ ๊ฐ๋
- IJob : ๋จ์ผ ์์
(์์
๋จ์)
- IJobParallelFor : ๋ณ๋ ฌ ๋ฐ๋ณต (for ๋ฃจํ๋ฅผ ๋ค์ค ์ฝ์ด์ ๋ถ์ฐ)
- IJobChunk : ECS์์ ์ฐ๋ ๋์ฉ๋ ์ฒ๋ฆฌ์ฉ Job
์ฅ์
- ๋ฉ์ธ ์ค๋ ๋ ํด๋ฐฉ
- Unity๊ฐ ์๋์ผ๋ก ์์
์ ์ฐ๋ ๋ํ์ ๋ถ๋ฐฐ
- Burst + Job ์กฐํฉ์ผ๋ก ์์ฒญ๋ ์ฑ๋ฅ ํ๋ณด ๊ฐ๋ฅ
NativeArray๋?
์์ฝ
Unity์ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ ์ธ ๋ฐฐ์ด ๊ตฌ์กฐ์ฒด
C#์ List<T>, Array๋ณด๋ค ๋น ๋ฅด๊ณ ๋ฒ์คํธ/์ก ์์คํ
์ ์ต์ ํ๋จ
ํน์ง
- GC๊ฐ ๋ฐ์ํ์ง ์์
- ์ฐ์๋ ๋ฉ๋ชจ๋ฆฌ -> CPU ์บ์ ์นํ์
- ๋ฐ๋์ Dispose()๋ก ์๋ ๋ฉ๋ชจ๋ฆฌ ํด์ ํ์
Unity DOTS ์ํ๊ณ ์์ฝ
- ECS : ๊ตฌ์กฐ ์์ฒด๋ฅผ ๋ฐ์ดํฐ ์งํฅ์ ์ผ๋ก
- Job System : ๋ค์ค ์์
์ค์ผ์ค๋ง
- Burst Compiler : ์คํ ์ฑ๋ฅ ๊ทน๋ํ
- Native Collections : GC ์๋ ๊ตฌ์กฐ
Unity DOTS ์ ์ฒด ๊ฐ๋
์์ฝ
DOTS๋ Data-Oriente Technology Stack์ ์ฝ์
๋ชฉํ๋ ์์ญ๋ง ๊ฐ ์ค๋ธ์ ํธ๋ ๋ถ๋๋ฝ๊ฒ ์ฒ๋ฆฌํ๋ ๊ฒ
ECS ๊ตฌ์กฐ ํต์ฌ ์ ๋ฆฌ
ECS๋ OOP์ ๋ฐ๋๋๋ ๊ฐ๋
Entity์ ๋ฐ์ดํฐ๋ง ๋ถ์ฐฉ
์์คํ
(System)์ด ๋ชจ๋ ์ํฐํฐ ์ํ ์ฒ๋ฆฌ
์์ฐจ์ ๋ฐ์ดํฐ ์ค์ฌ (์บ์ ์นํ์ )
public struct Position : IComponentData {
public float3 Value;
}
public struct Velocity : IComponentData {
public float3 Value;
}
public partial class MoveSystem : SystemBase {
protected override void OnUpdate() {
float dt = Time.DeltaTime;
Entities
.ForEach((ref Position pos, in Velocity vel) =>
{
pos.Value += vel.Value * dt;
}).ScheduleParallel();
}
}
Chunk ๊ตฌ์กฐ
ECS๋ ๋ด๋ถ์ ์ผ๋ก ๋์ผํ Archetype (์ปดํฌ๋ํธ ์กฐํฉ)์ ์ํฐํฐ๋ค์ Chunk๋ผ๋ ๋ฉ์ด๋ฆฌ์ ์ ์ฅํจ
- ํ๋์ Chunk = ์์ญ ๊ฐ ~ ์๋ฐฑ ๊ฐ ์ํฐํฐ
- ๋ฉ๋ชจ๋ฆฌ ์ฐ์ = CPU ์บ์์ ์์ ์ต์ ํ
- System์ Chunk ๋จ์๋ก ๋ฐ์ดํฐ๋ฅผ ์ํํจ
Transform, Velocity, Health๊ฐ ๊ฐ์ด ์๋ Entity๋ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ์ ๋ ฌ๋จ
Job + Burst๊ฐ ๋ถ์ผ๋ฉด ์๊ธฐ๋ ์ผ
- SystemBase์ .ScheduleParallel()์ ๋ด๋ถ์ ์ผ๋ก Job์ ์์ฑํจ
- ์ด Job์ Burst๋ก ์ปดํ์ผ๋๋ฉด ๋ค์ดํฐ๋ธ SIMD ๋ช
๋ น์ด๋ก ์ต์ ํ๋ผ์, ์๋ฐฑ ๊ฐ ์ํฐํฐ๋ฅผ ํ ๋ฒ์ ๋ฐ์ด๋ -> ์์ฒญ ๋น ๋ฆ
์ต์ ํ ์๋ น
- IComponentData๋ง ์ฌ์ฉ : ์ฐธ์กฐํ๋ณด๋ค valueํ ๊ตฌ์กฐ์ฒด ์ฌ์ฉ
- SharedComponentData๋ ์ ์คํ๊ฒ ์ฌ์ฉ : Chunk ๋ถํ ์ ์ ๋ฐํ๋ฏ๋ก
- Archetype ์กฐํฉ ์ต์ํ : Chunk ํํธํ๋ฅผ ๋ฐฉ์ง
- System์ ScheduleParallel ์ฐ์ ์ฌ์ฉ : ๋ณ๋ ฌ ์ฒ๋ฆฌ ํจ์จ ์ฆ๊ฐ
- NativeArray์ BurstCompile ์ ์ฉ : ์ฐ์ฐ ์ฑ๋ฅ ๊ทน๋ํ
- math ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ๊ทน ํ์ฉ : float3, dot, normalize ๋ฑ SIMD ์ต์ ํ๋จ
DOTS ํ๋ฆ ์์
1. ์ํฐํฐ ์์ฑ
2. System์ด ๋ชจ๋ Entity ์ํ
3. ์ปดํฌ๋ํธ ์กฐํฉ์ ๋ฐ๋ผ Chunk ๋จ์๋ก ์ํ
4. Job System์ด ์ฐ๋ ๋๋ก ๋ถ์ฐ ์ฒ๋ฆฌ
5. Burst๊ฐ ๋ด๋ถ ์ฐ์ฐ์ SIMD ๊ธฐ๋ฐ์ผ๋ก ๊ณ ์ ์คํ
๊ฐ๋ฐ์๊ฐ ์ ๊ฒฝ ์จ์ผ ํ ๋ถ๋ถ
- ๊ตฌ์กฐ์ฒด๋ก ์ค๊ณ (์ฐธ์กฐ ์ง์)
- ์ปดํฌ๋ํธ ์กฐํฉ์ ์ผ์ ํ๊ฒ ์ ์ง
- NativeArray, NativeList ์ฌ์ฉ ์ Dispose ์ฒ๋ฆฌ
- ์ค๋ ๋ ์ธ์ดํํ Job ์ค๊ณ
- Debug ๋ก๊ทธ ์ฌ์ฉ ์ Burst ์ฑ๋ฅ ์ ํ ์ฃผ์