09.23 - TIL

김혁·2025년 9월 23일

TIL

목록 보기
24/84

오늘의 코드카타

사라지는 발판

  • 미니맥스(MiniMax) 알고리즘 + DFS
  • LV3 - 16% (복습 필요, 이해 부족)
    -> 문제 풀이

오늘의 공부

언리얼의 Subsystem

  • 개념
    • 언리얼 엔진에서 특정 스코프(Engine, GameInstance, World 등)에 종속되는 객체
    • NewObject를 호출하지 않아도 엔진이 알아서 관리를 하고, 자동으로 생성/소멸 관리가 됨
    • 언리얼식 싱글톤을 사용하는 방식 중 하나
  • 기능
    • 엔진이 알아서 생성/초기화/소멸 관리
    • GetSubsystem<>() 함수로 쉽게 가져오기 가능
    • UObject 기반 -> 블루프린트 노출, GC 관리, 델리게이트 바인딩 가능
  • 종류
    1. UEngineSubsystem
      • 엔진 전체 전역에서 단 하나만 존재
      • 에디터에서도 살아있고, 게임과 맵 전환과도 무관
    2. UGameInstanceSubsystem
      • 게임 실행 단위 전역에서 하나만 존재
      • 게임 시작 시 생성, 게임 종료 시 소멸
      • 예 : 세션 관리, 인벤토리 시스템, 통계 기록
    3. UWorldSubsystem
      • 월드마다 하나씩 존재
      • 맵을 로드하면 새로 생기고, 맵이 언로드되면 사라짐
      • 예 : 특정 맵에서만 동작하는 AI 스폰 매니저, 퀘스트 시스템
    4. 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이 사용자 모드에서 처리됨
    -> 성능이 빠르고 가벼움


출처 : 팀스파르타 내일배움캠프
profile
게임 개발자를 향해..

0개의 댓글