최신 글

[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, 캐시, 메모리)가 데이터를 효율적으로 ..

인기 글

1. [Unreal 5] 언리얼 엔진의 렌더링 파이프라인 (Rendering Pipeline)
·
Computer Graphics
서론 게임에서 무언가가 모니터 화면에 보여지고 있다는 것(렌더링)은 게임 엔진이 렌더링 파이프라인 이라는 정해진 과정을 열심히 수행하고 있다는 증거이다. 게임 엔진은 일반적으로 렌더링 파이프라인 이라는 것을 수행해 이미지 또는 프레임을 화면에 렌더링 한다. 본 게시글은 Unreal Engine에서 이 렌더링 파이프라인이 어떤 방식으로 이루어지고 어떻게 플레이어의 화면에 무언가를 렌더링 할 수 있는지에 대해 다루도록 하겠다.Rendering Pipeline? 렌더링 파이프라인의 과정에 대해 설명한 글은 정말 많다. 하지만 그 글들을 보면 과정이 조금씩 다르거나 똑같은 과정이라도 지칭하는 이름이 다르다. 렌더링 파이프라인은 렌더링의 목적에 따라 여러가지 종류의 렌더링 파이프라인이 존재하고, 설명하는 주체가 ..
2. [Unreal 5] 언리얼 엔진의 렌더링 파이프라인 (Rendering Pipeline)
·
Computer Graphics
서론 이전 시간에 Unreal Engine에서의 렌더링 파이프라인에 알아보기 전에 기초적인 하드웨어(GPU)관점에서의 렌더링 파이프라인에 대해서 알아보았다. 이번 시간에는 Unreal Engine에서 사용하는 렌더링 파이프라인은 어떤 방식이며 그것에 대해서 알아보도록 하자.Forward rendering Unreal Engine에서 사용하는 파이프 라인은 기본적으로 디퍼드 렌더링(Deferred rendering)과 포워드 렌더링(Forward rendering)을 선택하여 사용하고 디폴트는 디퍼드 렌더링을 사용한다고 한다. 우선 디퍼드 렌더링에 대해 알기 전에 포워드 렌더링에 대해 간략하게 알아보자. 이전 시간에 GPU의 관점에서의 렌더링 파이프라인에 대해 알아보았다. 포워드 파이프라인은 이것에서 조금..
4. [Unreal 5 / C++] 반동(Camera Shake)과 연사
·
FPS Shooting
이전 포스트에서 발사체를 구현하고 에임 사이즈에 따라서 탄이 튀는 것 까지 구현을 하였다.이번 시간에는 발사시 발생하는 반동과 재장전 로직에 대해서 다루겠다. 1.Camera Shake를 사용한 반동 구현ULegacyCameraShake 클래스를 상속받는 UiCameraShake클래스를 생성해준다. UiCameraShake.h#pragma once#include "CoreMinimal.h"#include "Shakes/LegacyCameraShake.h"#include "UiCameraShake.generated.h"UCLASS()class PROJECT_4_API UUiCameraShake : public ULegacyCameraShake{ GENERATED_BODY()public: UUiC..
3. [Unreal 5 / STILL LOADING] Rendering system - Pixelart style
·
STILL LOADING
서론카툰 렌더링이야 그나마 자료도 많고 언리얼에서도 엔진을 수정하지 않고 PPM만을 사용해서 완벽하게는 아니더라도 카툰렌더링을 표현하는 시도가 적은 것은 아니다. 하지만 언리얼에서 픽셀아트 스타일의 게임, 즉 2D 도트 게임을 만드는 시도는 사례가 그리 많지 않다. 그도 그럴것이 언리얼 엔진은 실사지향을 하기 때문에 기본 렌더링 방식 자체가 멀티 라이팅에 유리한 디퍼드 렌더링으로 되어있기 때문에 성능상 유리하지 않다. 이를 해결하고자 엔진을 커스텀해서 사용하는 시간과 노력을 들일바엔 차라리 유니티 엔진으로 2D 게임을 만든는 것이 효율적인 선택일 것이다. 따라서 엔진을 커스텀하지 않고 3D 그래픽을 픽셀 아트로 변환하고자 하는 시도는 "정말 이것이 가능한가?" 라는 의문이 있었다.Transforming ..
1. [Unreal 5] 언리얼 엔진의 가비지 컬렉션(Garbage Collection, GC)
·
Study
서론필자는 C++을 주로 사용해 개발해왔기에, 가비지 컬렉션(Garbage Collection)은 ‘약자들이나 쓰는 기능’이라며 멸시해왔다. 하지만 언리얼 엔진을 사용할 때는, 언리얼의 게임 프레임워크 클래스들을 반드시 사용해야 하며, 이 수많은 클래스들의 생명 주기를 정확히 알지 않는 이상, 직접적인 메모리 관리는 사실상 불가능하다.따라서 언리얼에서는 더 이상 참조되지 않거나 명시적으로 소멸 예약된 UObject를 주기적으로 정리하기 위해, 자체적인 가비지 컬렉션 시스템을 사용한다.Garbage Collection제목에 '언리얼 엔진의 가비지 컬렉션'이라 적었지만, 사실 언리얼만의 독특한 방식이 있는 것은 아니다. 기본적으로는 일반적인 가비지 컬렉션 원리를 따른다.다만 차이점이 있다면, UObject를..