๊ฒ์ ๊ฐ๋ฐ์์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๊ฐ ์ ๋๋ก ์๋๋ฉด?
- ํ๋ ์ ๋๋
- ๋ฉ๋ชจ๋ฆฌ ๋์
- ๊ฒ์ ํฌ๋์
๊ทธ๋์ ๊ฒ์ ์์ง๋ค์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ํ ๋ค์ํ ์ต์ ํ ๊ธฐ๋ฒ์ ์ ์ฉํ๊ณ ์์
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์ด ์๋์ผ๋ก ์๋ํ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ํ์ธ ํ์