최신 글

[CS] A* 알고리즘(최단거리 탐색 알고리즘)
·
Algorithm
서론이전 글에서 다익스트라 알고리즘을 다뤘다. 다익스트라는 출발 노드로부터 모든 노드까지의 최단거리를 보장하는 강력한 알고리즘이다. 그런데 게임 AI 길찾기 상황을 생각해보자.캐릭터가 맵의 좌측 끝에서 우측 끝으로 이동해야 한다. 다익스트라는 목적지에 도달하기 전에 출발점을 기준으로 사방으로 탐색을 퍼트린다. 맵 전체를 샅샅이 뒤지는 셈이다. 결국 목적지에 도달했을 때, 이미 탐색한 노드의 절반 이상이 "가지 않아도 될 방향"이었다는 것이다.이 낭비를 없앨 수 없을까? "목적지가 오른쪽에 있다는 걸 알고 있으니, 왼쪽은 덜 살펴봐도 되지 않을까?" — 이 직관이 A* 알고리즘의 시작점이다.A* 알고리즘이란?A* 알고리즘은 출발 노드에서 목적 노드까지의 최단 경로를 찾는 알고리즘이다. 다익스트라와의 결정적..
[C++] C++의 Rule of 3/5/0
·
Study
서론C++에서 리소스 관리 코드를 작성할 때 가장 자주 마주치는 질문은 이것이다."특수 멤버 함수를 어디까지 직접 작성해야 안전하고, 또 빠를까?"이 질문에 대한 대표적인 가이드가 바로 Rule of Three, Rule of Five, Rule of Zero다. 이름은 단순하지만, 실제로는 객체 수명, 복사/이동 비용, 예외 안전성, 유지보수성까지 함께 다루는 설계 원칙이다.이번 글에서는 세 규칙을 단순 암기가 아니라, "왜 등장했는지"와 "언제 어떤 규칙을 선택해야 하는지" 관점으로 연결해서 정리해보자.Rule of Three: 왜 복사 제어 3종 세트가 필요했을까?고전 C++(C++11 이전)에서는 자원 소유 객체를 만들면 보통 아래 세 함수를 같이 고려해야 했다.소멸자(~T())복사 생성자(T(c..
[C++] C++의 Move semantics, forwarding
·
Study
서론C++11 이후 현대적 C++ 설계의 중심에는 항상 성능과 자원 관리가 있다. 그 핵심 도구가 바로 std::move와 std::forward다.우리의 교과서 모던 C++에서 이 move와 forward에 대한 중요성을 잘 다루고있다. 오늘은 이 두 함수가 왜 존재하며, 내부적으로는 어떤 원리로 동작하는지, 주로 하는 실수에 대해 정리해보자.값 카테고리(Value Category): lvalue와 rvalue의 본질move와 forward를 논하기 전에 반드시 짚고 넘어가야 할 것이 값 카테고리다. 단순히 "이름이 있으면 lvalue, 없으면 rvalue"라는 식의 암기보다 수명(Lifetime)과 정체성(Identity) 관점에서 접근하는 것이 정확하다.lvalue (left value): 지속적인..
2. [Unreal 5] 언리얼 엔진의 가비지 컬렉션(Garbage Collection, GC)
·
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, 캐시, 메모리)가 데이터를 효율적으로 ..

인기 글

[Unreal 5] 언리얼 엔진의 Map 컨테이너(TMap, TSet)
·
Study
서론언리얼 엔진에서 Key를 기반으로한 컨테이너는 언리얼 개발을 조금이라도 해보았으면 TMap과 TSet을 바로 떠올릴 것이다. 검색을 해보면 TMap과 TSet의 메서드에 대한 설명은 정말 많지만 내부적으로 TMap과 TSet이 어떤 원리로 동작을 하는지와 같은 원론적인 내용을 다룬 글은 별로 없다. 따라서 이 글은은 언리얼 엔진의 대표적인 Map 컨테이너인 TMap과 TSet에 대한 원론적인 내용을 다룰 것이며 사용법이나 메서드에 관한 설명은 다른 글을 참고하기를 권장한다.HashTable(해시 테이블)언리얼 엔진의 TMap과 TSet은 해시 테이블(Hash Table) 기반의 컨테이너이다. 해시 테이블이란 [Key, Value] 쌍(또는 Key만 존재)의 데이터를 저장하는 자료구조로, 내부적으로 버..
3. [Unreal 5 / C++] 동적 크로스헤어 구현
·
FPS Shooting
이번 시간에는 플레이어의 움직임(속도)에 비례하여 동적으로 변화하는 크로스헤어를 구현해볼 것이다. 우선 크로스헤어에 필요한 Texture를 구해준다.여기서 동적으로 움직이는 부분은 상하좌우의 Line이고, 중간의 Dot은 정적이니 필수는 아니다.CrosshairWidget 클래스 작성UserWidget을 상속받는 클래스를 작성하고, 상하좌우 Line에 해당하는 이미지를 바인딩한다.#pragma once#include "CoreMinimal.h"#include "Blueprint/UserWidget.h"#include "Components/Image.h"#include "CrosshairWidget.generated.h"UCLASS()class PROJECT_4_API UCrosshairWidget : p..
2. [Unreal 5] 언리얼 엔진의 렌더링 파이프라인 (Rendering Pipeline)
·
Computer Graphics
서론 이전 시간에 Unreal Engine에서의 렌더링 파이프라인에 알아보기 전에 기초적인 하드웨어(GPU)관점에서의 렌더링 파이프라인에 대해서 알아보았다. 이번 시간에는 Unreal Engine에서 사용하는 렌더링 파이프라인은 어떤 방식이며 그것에 대해서 알아보도록 하자.Forward rendering Unreal Engine에서 사용하는 파이프 라인은 기본적으로 디퍼드 렌더링(Deferred rendering)과 포워드 렌더링(Forward rendering)을 선택하여 사용하고 디폴트는 디퍼드 렌더링을 사용한다고 한다. 우선 디퍼드 렌더링에 대해 알기 전에 포워드 렌더링에 대해 간략하게 알아보자. 이전 시간에 GPU의 관점에서의 렌더링 파이프라인에 대해 알아보았다. 포워드 파이프라인은 이것에서 조금..
[CS] A* 알고리즘(최단거리 탐색 알고리즘)
·
Algorithm
서론이전 글에서 다익스트라 알고리즘을 다뤘다. 다익스트라는 출발 노드로부터 모든 노드까지의 최단거리를 보장하는 강력한 알고리즘이다. 그런데 게임 AI 길찾기 상황을 생각해보자.캐릭터가 맵의 좌측 끝에서 우측 끝으로 이동해야 한다. 다익스트라는 목적지에 도달하기 전에 출발점을 기준으로 사방으로 탐색을 퍼트린다. 맵 전체를 샅샅이 뒤지는 셈이다. 결국 목적지에 도달했을 때, 이미 탐색한 노드의 절반 이상이 "가지 않아도 될 방향"이었다는 것이다.이 낭비를 없앨 수 없을까? "목적지가 오른쪽에 있다는 걸 알고 있으니, 왼쪽은 덜 살펴봐도 되지 않을까?" — 이 직관이 A* 알고리즘의 시작점이다.A* 알고리즘이란?A* 알고리즘은 출발 노드에서 목적 노드까지의 최단 경로를 찾는 알고리즘이다. 다익스트라와의 결정적..
3. [Unreal 5 / STILL LOADING] Rendering system - Pixelart style
·
STILL LOADING
서론카툰 렌더링이야 그나마 자료도 많고 언리얼에서도 엔진을 수정하지 않고 PPM만을 사용해서 완벽하게는 아니더라도 카툰렌더링을 표현하는 시도가 적은 것은 아니다. 하지만 언리얼에서 픽셀아트 스타일의 게임, 즉 2D 도트 게임을 만드는 시도는 사례가 그리 많지 않다. 그도 그럴것이 언리얼 엔진은 실사지향을 하기 때문에 기본 렌더링 방식 자체가 멀티 라이팅에 유리한 디퍼드 렌더링으로 되어있기 때문에 성능상 유리하지 않다. 이를 해결하고자 엔진을 커스텀해서 사용하는 시간과 노력을 들일바엔 차라리 유니티 엔진으로 2D 게임을 만든는 것이 효율적인 선택일 것이다. 따라서 엔진을 커스텀하지 않고 3D 그래픽을 픽셀 아트로 변환하고자 하는 시도는 "정말 이것이 가능한가?" 라는 의문이 있었다.Transforming ..