728x90

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(); // Job + Burst ์ ์šฉ ๊ฐ€๋Šฅ
    }
}

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 ์„ฑ๋Šฅ ์ €ํ•˜ ์ฃผ์˜





๋ฐ˜์‘ํ˜•

+ Recent posts