[CS] A* 알고리즘(최단거리 탐색 알고리즘)
·
Computer Science/Algorithm
서론이전 글에서 다익스트라 알고리즘을 다뤘다. 다익스트라는 출발 노드로부터 모든 노드까지의 최단거리를 보장하는 강력한 알고리즘이다. 그런데 게임 AI 길찾기 상황을 생각해보자.캐릭터가 맵의 좌측 끝에서 우측 끝으로 이동해야 한다. 다익스트라는 목적지에 도달하기 전에 출발점을 기준으로 사방으로 탐색을 퍼트린다. 맵 전체를 샅샅이 뒤지는 셈이다. 결국 목적지에 도달했을 때, 이미 탐색한 노드의 절반 이상이 "가지 않아도 될 방향"이었다는 것이다.이 낭비를 없앨 수 없을까? "목적지가 오른쪽에 있다는 걸 알고 있으니, 왼쪽은 덜 살펴봐도 되지 않을까?" — 이 직관이 A* 알고리즘의 시작점이다.A* 알고리즘이란?A* 알고리즘은 출발 노드에서 목적 노드까지의 최단 경로를 찾는 알고리즘이다. 다익스트라와의 결정적..
2. [Unreal 5] 언리얼 엔진의 가비지 컬렉션(Garbage Collection, GC)
·
Unreal 5/Study
서론이전 글에서 언리얼 엔진의 가비지 컬렉션(GC)이 Mark & Sweep 방식을 사용한다는 것을 알아보았다. 이는 개발자에게 메모리 관리의 편리함을 제공하지만, 실시간 게임 환경에서는 치명적인 단점이 될 수 있다. 바로 GC가 수행되는 동안 모든 게임 로직이 멈추는 Stop-the-World 현상 때문이다.특히 오픈 월드나 대규모 멀티플레이어 게임처럼 UObject의 수가 수십만 개에 달하는 환경에서는, GC 수행 시간이 길어져 프레임 드랍(Hitch)을 유발할 가능성이 높다. 이를 해결하기 위해 오브젝트 풀링(Object Pooling) 같은 기법을 사용하기도 하지만, 언리얼 엔진 자체적으로도 이러한 GC 오버헤드를 분산시키기 위한 최적화 기술을 제공한다.그것이 바로 점진적 도달 가능성 분석(Inc..
[CS] 데이터 지향 프로그래밍(DOP)
·
Computer Science
서론"객체 지향 프로그래밍(OOP)은 만능일까?" 학교나 학원에서 C++을 배우면 캡슐화, 상속, 다형성과 모든 것을 객체(Object)로 모델링하는 법을 우선적으로 배운다. 일반적인 상황에서는 OOP의 철학대로 설계를 하는것이 바람직하지만 최적화가 중요한 프로젝트에서는 OOP가 CPU 캐시를 괴롭히는 주범이라며 이를 피하려 한다. 오늘은 성능 최적화의 핵심 패러다임인 데이터 지향 프로그래밍(Data-Oriented Programming, DOP)에 대해 알아보자.데이터 지향 프로그래밍(DOP)이란?DOP는 데이터가 메모리에 어떻게 배치되는가를 최우선으로 고려하는 프로그래밍 기법이다.OOP가 현실 세계를 코드로 모델링하는 것에 집중한다면, DOP는 하드웨어(CPU, 캐시, 메모리)가 데이터를 효율적으로 ..
[CS] 운영체제가 사용하는 메모리 영역
·
Computer Science
서론우리가 C++로 int a = 10; 같은 코드를 작성하면, 이 변수는 컴퓨터의 어디에 저장될까? 단순히 메모리(RAM) 어딘가에 있겠지라고 생각할 수도 있지만, 운영체제는 효율적인 관리와 보안을 위해 메모리를 구역별로 엄격하게 나누어 관리한다.개발을 하다 보면 스택 오버플로우(Stack Overflow)나 힙 메모리 단편화(Fragmentation) 같은 단어들을 마주하게 된다. 이러한 문제들의 원인을 이해하려면, 운영체제가 프로세스에게 할당하는 가상 메모리 구조(Virtual Memory Layout)를 먼저 파악해야 한다. 오늘은 프로세스가 실행될 때 메모리가 어떻게 구성되는지, 그리고 각 영역이 어떤 역할을 하는지 알아보자.프로세스 메모리 구조 (Memory Layout)운영체제는 프로그램을 ..
1. [Unreal 5] 언리얼 엔진의 가비지 컬렉션(Garbage Collection, GC)
·
Unreal 5/Study
서론필자는 C++을 주로 사용해 개발해왔기에, 가비지 컬렉션(Garbage Collection)은 ‘약자들이나 쓰는 기능’이라며 멸시해왔다. 하지만 언리얼 엔진을 사용할 때는, 언리얼의 게임 프레임워크 클래스들을 반드시 사용해야 하며, 이 수많은 클래스들의 생명 주기를 정확히 알지 않는 이상, 직접적인 메모리 관리는 사실상 불가능하다.따라서 언리얼에서는 더 이상 참조되지 않거나 명시적으로 소멸 예약된 UObject를 주기적으로 정리하기 위해, 자체적인 가비지 컬렉션 시스템을 사용한다.Garbage Collection제목에 '언리얼 엔진의 가비지 컬렉션'이라 적었지만, 사실 언리얼만의 독특한 방식이 있는 것은 아니다. 기본적으로는 일반적인 가비지 컬렉션 원리를 따른다.다만 차이점이 있다면, UObject를..
[CS] 프로세스(Process)와 스레드(Thread)
·
Computer Science
프로세스(Process)와 스레드(Thread)프로세스(Process)정의: 운영체제에서 실행 중인 프로그램의 인스턴스를 뜻한다. 코드, 데이터, 시스템 자원(메모리 영역, 파일 디스크립터 등)을 포함하는 독립적인 실행 단위다.특징:독립된 메모리 공간을 가지므로, 서로 다른 프로세스 간 메모리 침범이 불가능해 안정성이 높다.문맥 전환(Context Switch) 시 커널이 레지스터, 메모리 맵 등 전체 상태를 저장하고 복원해야 하므로 오버헤드가 크다.프로세스 간 통신(IPC)이 필요할 때는 파이프, 소켓, 공유 메모리 등을 사용해야 하며, 구현이 비교적 복잡하다.스레드(Thread)정의: 프로세스 내에서 작업 흐름의 단위를 의미하며, 같은 프로세스 자원을 공유하는 실행 단위다.특징:메모리 공간(코드, 데..
[CS] 캐시 메모리(Cache Memory)
·
Computer Science
서론컴퓨터 시스템의 성능을 높이기 위해 다양한 방법이 연구되고 있으며, 그중 하나는 메모리 계층 구조를 효율적으로 구성하는 것이다. 특히 CPU와 메인 메모리 사이의 속도 차이를 완화하는 데 중요한 역할을 하는 구성 요소가 바로 캐시 메모리(Cache Memory)다. 캐시 메모리는 자주 사용하는 데이터를 빠르게 접근할 수 있도록 도와 전체 시스템의 처리 속도를 크게 향상시킨다. 그러나 캐시에 원하는 데이터가 없을 때 발생하는 캐시 미스(Cache Miss)는 오히려 성능 저하로 이어질 수 있다. 이 글에서는 캐시 메모리의 역할과 구조를 이해하고, 캐시 미스가 시스템 성능에 미치는 영향을 살펴보자.캐시 메모리캐시 메모리(SRAM)는 집적도가 낮아 많은 데이터를 담을 수는 없지만(수 MB 단위), 속도가 ..