오늘의 코드카타
사라지는 발판
- 미니맥스(MiniMax) 알고리즘 + DFS
- LV3 - 16% (복습 필요, 이해 부족)
-> 문제 풀이
오늘의 공부
언리얼의 Subsystem
- 개념
- 언리얼 엔진에서 특정 스코프(Engine, GameInstance, World 등)에 종속되는 객체
NewObject를 호출하지 않아도 엔진이 알아서 관리를 하고, 자동으로 생성/소멸 관리가 됨
- 언리얼식 싱글톤을 사용하는 방식 중 하나
- 기능
- 엔진이 알아서 생성/초기화/소멸 관리
GetSubsystem<>() 함수로 쉽게 가져오기 가능
- UObject 기반 -> 블루프린트 노출, GC 관리, 델리게이트 바인딩 가능
- 종류
- UEngineSubsystem
- 엔진 전체 전역에서 단 하나만 존재
- 에디터에서도 살아있고, 게임과 맵 전환과도 무관
- UGameInstanceSubsystem
- 게임 실행 단위 전역에서 하나만 존재
- 게임 시작 시 생성, 게임 종료 시 소멸
- 예 : 세션 관리, 인벤토리 시스템, 통계 기록
- UWorldSubsystem
- 월드마다 하나씩 존재
- 맵을 로드하면 새로 생기고, 맵이 언로드되면 사라짐
- 예 : 특정 맵에서만 동작하는 AI 스폰 매니저, 퀘스트 시스템
- ULocalPlayerSubsystem
- 플레이어마다 하나씩 존재
- 로컬 플레이어별 UI, 입력 바인딩, HUD 매니저
팀 프로젝트 진행 내용
1. 테스트 실행 후에 개선 사항 수정
- AI
- 플레이어와 AI 메시랑 콜리전 크기 동일하게 수정
- 이동속도 플레이어와 동일하게 설정
- 좀 더 활동적이게 수정 -> 이동 범위 증가 및 이동 확률 증가
- Item
- 아이템 지속 시간 증가
- 외곽선 머터리얼 잘 보이게 수정
- 아이템 스포너 리젠 시간 감소
2. 델리게이트 매니저 구현
- 언리얼 엔진의 Subsystem을 활용해서 싱글톤으로 델리게이트를 관리하는 매니저 구현
- 게임 실행 단위 전역에서 사용할 것이기 때문에
UGameInstanceSubsystem 상속
- pragma region을 사용해서 델리게이트 정의, 델리게이트 선언, 브로드캐스트 부분을 분리
// EGDelegateManager.h
#pragma region DECLARE_DELEGATE
// Item
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnItemPickUp, AEGItemBase*, Item);
#pragma endregion
UCLASS()
class EG_API UEGDelegateManager : public UGameInstanceSubsystem
{
GENERATED_BODY()
public:
#pragma region DELEGATE
UPROPERTY(BlueprintAssignable)
FOnItemPickUp OnItemPickUp;
#pragma endregion
#pragma region BROADCAST
void BroadcastItemPickUp(AEGItemBase* Item);
#pragma endregion
};
// Subsystem 가져오기
auto* DelegateManager = GetGameInstance()->GetSubsystem<UEGDelegateManager>();
// delegate에 실행할 함수 동적 추가
DelegateManager->OnItemPickUp.AddDynamic(this, &ThisClass::HandleItemPickUp);
// delegate 브로드캐스트 호출
DelegateManager->BroadcastItemPickUp(this);
오늘의 CS
레이스 컨디션이란?
- 두 개 이상의 프로세스가 공통 자원을 병행적으로 읽거나 쓰는 동작을 할 때, 공용 데이터에 대한 접근이 어떤 순서에 따라 이루어졌는지에 따라 그 실행 결과가 달라지는 상황
- 간단하게 말하면, 두 개의 스레드가 하나의 자원을 놓고 서로 사용하려고 경쟁하는 상황
레이스 컨디션을 막는 동기화 방법
1. 뮤텍스
- 락을 가진 스레드만이 공유 자원에 접근할 수 있게 하는 방법
- 임계 영역에 먼저 접근한 스레드가 임계영역에 락을 걸면 다른 스레드들은 해당 스레드가 락을 해제하기 전까지 대기해야 함

2. 세마포어
- 공유 자원에 접근할 수 있는 스레드의 수를 정해 접근을 제어하는 방법
- 임계 영역에 접근할 수 있는 키 n개를 지정하고 이 중 하나를 가진 스레드만이 임계 영역에 접근하게 하는 방식

3. 아토믹
- 여러 스레드가 동시에 접근하는 단일 변수를 하나의 깨뜨릴 수 없는 연산으로 처리해 안전하게 만드는 방법
- 임계 영역에 있는 변수에 대한 연산 자체를 쪼개지지 않는 단일 단위로 만들고 하나의 스레드만이 접근하게 하는 방식
4. Critical Section
- 멀티 스레드 환경에서 공유 자원에 대한 동시 접근을 제어하기 위해 사용되는 동기화 객체
- C++에서 뮤텍스와 유사하지만, 단일 프로세스 내의 스레드 간 동기화에만 사용됨
- 뮤텍스와 달리 커널 객체가 아니기 때문에 스레드 간 lock, unlock이 사용자 모드에서 처리됨
-> 성능이 빠르고 가벼움
출처 : 팀스파르타 내일배움캠프