728x90

๊ฒŒ์ž„ ๊ฐœ๋ฐœ์—์„œ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๊ฐ€ ์ œ๋Œ€๋กœ ์•ˆ๋˜๋ฉด?

- ํ”„๋ ˆ์ž„ ๋“œ๋ž
- ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜
- ๊ฒŒ์ž„ ํฌ๋ž˜์‹œ
๊ทธ๋ž˜์„œ ๊ฒŒ์ž„ ์—”์ง„๋“ค์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์„ ์ ์šฉํ•˜๊ณ  ์žˆ์Œ

1. ๋™์  ํ• ๋‹น๊ณผ ์ •์  ํ• ๋‹น

์ •์  ํ• ๋‹น(Static Allocation)
- ์ปดํŒŒ์ผ ์‹œ๊ฐ„(๋นŒ๋“œ ์‹œ์ )์— ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ๊ฐ€ ๊ฒฐ์ •๋จ
- ์˜ˆ์‹œ : ๊ธ€๋กœ๋ฒŒ ๋ณ€์ˆ˜, ์ •์  ๋ณ€์ˆ˜, ์Šคํƒ ๋ณ€์ˆ˜

๋™์  ํ• ๋‹น(Dynamic Allocation)
- ์‹คํ–‰ ์ค‘(Run-time) ํ•„์š”ํ•œ ๋งŒํผ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹น
- ์˜ˆ์‹œ : new(C++), malloc()(C), Instantiate()(Unity)

๊ฒŒ์ž„ ๊ฐœ๋ฐœ์—์„œ ์ค‘์š”ํ•œ ์ด์œ 
- ๋™์  ํ• ๋‹น์„ ๋„ˆ๋ฌด ๋งŽ์ด ํ•˜๋ฉด ํ”„๋ ˆ์ž„๋งˆ๋‹ค ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น/ํ•ด์ œ๊ฐ€ ๋ฐœ์ƒ -> ์„ฑ๋Šฅ ์ €ํ•˜
- ํ•ด๊ฒฐ์ฑ… : ๋ฉ”๋ชจ๋ฆฌ ํ’€(Memory Pool) ํ™œ์šฉ (์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๋ฏธ๋ฆฌ ํ• ๋‹นํ•ด๋‘ )

2. ์Šคํƒ(Stack) vs. ํž™(Heap) ๋ฉ”๋ชจ๋ฆฌ

์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ(Stack)
- ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ์ž๋™ ํ• ๋‹น๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„
- ํ• ๋‹น/ํ•ด์ œ ์†๋„๊ฐ€ ๋น ๋ฆ„
- ๋‹จ์  : ํฌ๊ธฐ๊ฐ€ ํ•œ์ •์ ์ด๊ณ , ๋„ˆ๋ฌด ๋งŽ์ด ์“ฐ๋ฉด ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ(Stack Overflow) ๋ฐœ์ƒ

ํž™ ๋ฉ”๋ชจ๋ฆฌ(Heap)
- new/malloc()๋กœ ๋™์  ํ• ๋‹นํ•œ ๋ฉ”๋ชจ๋ฆฌ
- ์ž์œ ๋กญ๊ฒŒ ํฌ๊ธฐ๋ฅผ ์กฐ์ ˆ ๊ฐ€๋Šฅ
- ๋‹จ์  : ํ• ๋‹น/ํ•ด์ œ ๋น„์šฉ์ด ํฌ๊ณ , ๋ฉ”๋ชจ๋ฆฌ ๋‹จํŽธํ™”(Fragmentation) ๋ฐœ์ƒ ๊ฐ€๋Šฅ

๊ฒŒ์ž„ ๊ฐœ๋ฐœ์—์„œ ์ค‘์š”ํ•œ ์ด์œ 
- ์‹ค์‹œ๊ฐ„ ๊ฒŒ์ž„์—์„œ๋Š” ํž™ ํ• ๋‹น์„ ์ตœ์†Œํ™”ํ•ด์•ผ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ๋ง‰์„ ์ˆ˜ ์žˆ์Œ
- ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๊ธฐ๋ฒ• : ์˜ค๋ธŒ์ ํŠธ ํ’€๋ง(Object Pooling) ํ™œ์šฉ

3. ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ (Memory Leak)

๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ž€?
- ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•˜์ง€ ์•Š์•„์„œ ์ ์  ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ฆ๊ฐ€ํ•˜๋Š” ํ˜„์ƒ
- ์ผ์ • ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด RAM์ด ๋ถ€์กฑํ•ด์„œ ๊ฒŒ์ž„์ด ํฌ๋ž˜์‹œ๋  ์ˆ˜ ์žˆ์Œ

๊ฒŒ์ž„ ๊ฐœ๋ฐœ์—์„œ ํ”ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ์‚ฌ๋ก€
- new๋กœ ํ• ๋‹นํ•˜๊ณ  delete๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š์Œ (C++)
- Unity์—์„œ GameObject.Destroy()๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ  ์ฐธ์กฐ๋ฅผ ๋‚จ๊ฒจ๋‘ 
- Unreal Engine์—์„œ UObject๊ฐ€ ์ ์ ˆํžˆ ๊ด€๋ฆฌ๋˜์ง€ ์•Š์Œ

์˜ˆ์ œ(C++ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐœ์ƒ ์ฝ”๋“œ)

void Function(){
	Data* data = new Data();	//๋™์  ํ• ๋‹น
	//ํ•ด์ œํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐœ์ƒ
}


ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•
- ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ(Smart Pointer) ์‚ฌ์šฉ (C++)
  - std::unique_ptr,std::shared_ptr
- Garbage Collector(GC) ์ตœ์ ํ™” (C#/Unity,UE4)
  - Resources.UnloadUnusedAssets() ์‚ฌ์šฉ
- ๋ฉ”๋ชจ๋ฆฌ ํ’€๋ง(Object Pooling) ํ™œ์šฉ

4. ๋ฉ”๋ชจ๋ฆฌ ๋‹จํŽธํ™” (Memory Fragmentation)

๋ฉ”๋ชจ๋ฆฌ ๋‹จํŽธํ™”๋ž€?
- ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์€ ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก์ด ํŒŒํŽธ์ฒ˜๋Ÿผ ํฉ์–ด์ ธ ์žˆ์–ด์„œ ํฐ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ฌธ์ œ
- ์‹ค์‹œ๊ฐ„ ๊ฒŒ์ž„์—์„œ๋Š” ํž™ ๋ฉ”๋ชจ๋ฆฌ ๋‹จํŽธํ™”๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํฐ ์˜ค๋ธŒ์ ํŠธ ๋กœ๋”ฉ์ด ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ์Œ

๊ฒŒ์ž„์—์„œ ๋‹จํŽธํ™”๋ฅผ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•
- ๋ฉ”๋ชจ๋ฆฌ ํ’€๋ง(Memory Pooling) : ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๋ฏธ๋ฆฌ ํ• ๋‹น
- ์—ฐ์†๋œ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ(Array vs. Linked List)
  - ๋ฐฐ์—ด์€ ์—ฐ์†๋œ ๊ณต๊ฐ„์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์บ์‹œ ํšจ์œจ์ด ์ข‹์Œ
- ์ •์  ํ• ๋‹น ์šฐ์„  ์‚ฌ์šฉ

5. ๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™” ๊ธฐ๋ฒ• (๊ฒŒ์ž„ ๊ฐœ๋ฐœ ์ ์šฉ)

์˜ค๋ธŒ์ ํŠธ ํ’€๋ง(Object Pooling)
- ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๋ฏธ๋ฆฌ ํ• ๋‹นํ•ด๋‘๊ณ , ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋ฒ•
- ์˜ˆ์‹œ : ์ด์•Œ, ์  ์บ๋ฆญํ„ฐ, ์ดํŽ™ํŠธ

๋ฐ์ดํ„ฐ ๋ ˆ์ด์•„์›ƒ ์ตœ์ ํ™”(Cache-Friendly Design)
- ์—ฐ์†๋œ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ CPU ์บ์‹œ ๋ฏธ์Šค๋ฅผ ์ค„์ž„
- ์˜ˆ์‹œ : SoA(Structure of Arrays) vs. AoS(Array of Structures)

๋ฆฌ์†Œ์Šค ์ŠคํŠธ๋ฆฌ๋ฐ(Texture Streaming, Level Streaming)
- ํ•„์š”ํ•  ๋•Œ๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•ด์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ˆ์•ฝ
- Unreal Engine, Unity๋Š” ๋น„๋™๊ธฐ ๋กœ๋”ฉ(Async Loading)์„ ์ œ๊ณต

์ •์  ํ• ๋‹น(Static Allocation) ํ™œ์šฉ
- ๊ฒŒ์ž„ ์‹œ์ž‘ ์‹œ ํ•œ ๋ฒˆ ํ• ๋‹นํ•˜๊ณ  ๋๊นŒ์ง€ ์œ ์ง€
- ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ์˜ค๋ธŒ์ ํŠธ์— ์ ํ•ฉ

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜(Garbage Collection) ๊ด€๋ฆฌ
- Unity: GC.Collect() ํ˜ธ์ถœ ์ตœ์†Œํ™”
- Unreal Engine: Garbage Collection์ด ์ž๋™์œผ๋กœ ์ž‘๋™ํ•˜๋ฏ€๋กœ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ํ™•์ธ ํ•„์ˆ˜

๋ฐ˜์‘ํ˜•

+ Recent posts