게임 개발자를 위한 메모리 구조 시리즈 정리

게임 엔진을 공부하다 보면 생각보다 많은 문제들이 결국 메모리 구조로 연결된다는 것을 알게됩니다.

게임 엔진 메모리 구조 시리즈를 정리한 이미지로 Stack Heap, Cache Miss, allocator, Object Pool, SoA, ECS 구조를 설명하는 인포그래픽
게임 엔진 메모리 구조 시리즈 전체 흐름을 한눈에 정리한 인포그래픽 이미지

왜 최근 엔진들이 ECS 구조에 관심을 가지는지,
왜 allocator를 직접 구현하는지,
왜 Cache Locality가 중요한지,
왜 Object Pool이나 SoA(Struct of Array) 같은 구조들이 등장했는지도 결국 같은 흐름 안에 있습니다.

이 시리즈에서는 게임 엔진을 메모리 관점에서 이해해보기 위해 다양한 주제들을 하나씩 정리했습니다.

아래는 현재까지 작성한 글 목록입니다.


1. 스택과 힙은 왜 중요한 개념일까?

개발을 하다 보면 자연스럽게 스택과 힙이라는 개념을 접하게 됩니다.

그리고 실제 게임 엔진도 결국 이 두 메모리 영역과 많은 부분에서 연관되어 있다는 것을 알게됩니다.

객체 생성, 메모리 수명, 동적 할당 같은 개념들이 왜 중요한지 정리한 글입니다.

글 보러가기


2. Cache Miss는 왜 게임 성능에 영향을 줄까?

최근 CPU는 굉장히 빠릅니다.

문제는 데이터를 얼마나 빠르게 가져올 수 있는가입니다.

이 글에서는 Cache, Cache Miss, Cache Locality 개념과 함께 왜 최근 엔진들이 데이터 배치를 중요하게 보기 시작했는지 정리했습니다.

글 보러가기


3. 게임 엔진은 왜 allocator를 직접 구현할까?

게임은 객체 생성과 제거가 굉장히 자주 발생하는 프로그램입니다.

이 과정에서 힙 할당 비용과 메모리 파편화 문제가 등장하기 시작합니다.

이 글에서는 allocator, memory pool, 메모리 재사용 구조가 왜 중요한지 정리했습니다.

글 보러가기


4. placement new는 왜 등장했을까?

처음 placement new를 보면 굉장히 특이한 문법처럼 느껴질 수 있습니다.

그런데 allocator와 memory pool 구조를 이해하기 시작하면 중요한 역할을 한다는 것을 알게 됩니다.

이 글에서는 객체 생성과 메모리 할당을 분리하는 이유를 중심으로 정리했습니다.

글 보러가기


5. 왜 게임 엔진은 Object Pool을 사용할까?

게임에서는 총알, 파티클, 이펙트 같은 객체들이 굉장히 자주 생성되고 제거됩니다.

그리고 이 과정은 생각보다 큰 비용이 될 수 있습니다.

이 글에서는 Object Pool 구조가 왜 등장했는지, 그리고 왜 최근 엔진들이 메모리 재사용을 중요하게 보는지 정리했습니다.

글 보러가기


6. 왜 최근 엔진들은 SoA 구조를 사용하기 시작했을까?

AoS와 SoA는 처음 보면 굉장히 낯선 용어처럼 느껴질 수 있습니다.

하지만 결국 핵심은 데이터를 메모리에 어떻게 배치할 것인가입니다.

이 글에서는 AoS와 SoA의 차이, Cache Locality, Data Oriented Design 흐름을 중심으로 정리했습니다.

글 보러가기


7. 왜 최근 게임 엔진은 ECS 구조에 관심을 가지기 시작했을까?

최근 게임 엔진 구조를 보면 ECS, Data Oriented Design, Job System 같은 키워드를 굉장히 자주 보게 됩니다.

이 글에서는 ECS가 왜 등장했는지, 왜 최근 엔진들이 객체보다 데이터를 중요하게 보기 시작했는지 정리했습니다.

글 보러가기


게임 엔진을 살펴보면 많은 문제들이 결국 메모리 구조와 관련되어 있다는 것을 알게됩니다.

그리고 이런 내용들을 이해하기 시작하면 최근 게임 엔진이 왜 지금과 같은 방향으로 발전하고 있는지도 이해되기 시작합니다.

앞으로도 게임 엔진 구조를 지속적으로 정리해보려고 합니다.


👉 게임 엔진 구조를 더 깊이 이해하고 싶다면

아래 강의를 통해 직접 구현해보는 것을 추천드립니다.

C++로 만드는 게임 엔진 프레임워크 강의

👉 C++로 만드는 게임 엔진 프레임워크 강의 바로가기

댓글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다