오늘의 코드카타
- 마법의 엘리베이터
- 거리두기 확인하기
- 숫자 카드 나누기
오늘의 공부
학습한 강의
- AI를 활용한 간단한 스텔스 게임 실습
(1) 게임 기획 : 간단하게 만들 게임의 전체적인 기획
(2) 게임의 간단한 레벨 디자인 : 엘리베이터 및 문 설계
(3) 플레이어 캐릭터 구현 : 스킬 및 기본 능력 구현
오늘의 CS
언리얼 엔진의 에셋 참조
하드 참조 (Hard Reference)
- 전통적인 C++ 포인터(raw pointer(*) 또는
TObjectPtr)를 사용하여 에셋을 직접 가리키는 방식
- 특징
- 즉시 로드 : 에셋을 포함하는 액터/클래스가 메모리에 로드되는 순간, 하드 참조된 에셋도 즉시 메모리에 로드됨
- 로드 시간 영향 : 하드 참조가 많으면 많을수록 맵 로드 시간이나 클래스 인스턴스화 시간이 길어짐
- 가비지 컬렉션 방지 : 하드 참조가 존재하는 한, 해당 에셋은 가비지 컬렉션의 대상이 되지 않음
- 주 사용처 : 게임 플레이 중 항상 필요하고 빠른 접근이 필수적인 핵심 에셋 (예: 캐릭터 메시, 주요 애니메이션 블루프린트)
소프트 참조 (Soft Reference)
- 에셋 자체를 직접 가리키는 포인터 대신, 에셋의 경로 정보를 저장하여 필요할 때 동적으로 로드하는 방식
TSoftObjectPtr(단일 에셋 참조) 또는 TSoftClassPtr(클래스 블루프린트 참조)를 사용
- 특징
- 지연 로드 : 액터/클래스가 로드될 때, 소프트 참조된 에셋은 자동으로 로드되지 않음. 메모리에는 에셋의 경로 문자열만 존재
- 로드 시간 최적화 : 맵 로드나 클래스 인스턴스화 시간을 단축시켜 줌. 에셋이 필요해질 때 비동기적으로 로드함
- 가비지 컬렉션 대상 : 소프트 참조는 에셋의 로드를 방해하지 않기 때문에, 다른 곳에서 하드 참조되지 않는 한 가비지 컬렉션의 대상이 됨
- 주 사용처 : 게임 플레이 중 선택적으로 필요하거나 즉시 접근이 필수가 아닌 에셋 (예: 레벨에서만 사용되는 사운드, 레벨 스트리밍)
소프트 참조를 사용해야 하는 이유
- 게임의 실시간 성능과 메모리 예산(Memory Budget)을 최적화하기 위해 적절히 구분하여 사용해야 함
- 하드 참조만 과도하게 사용하면 게임 로딩, 특히 중간에 플레이어가 입장하게 되면 멈춤 현상이나 히치가 발생할 가능성이 매우 높음
- 하드 참조의 위험성
- 액터가 스폰되는 순간 연쇄적으로 모든 에셋이 로드되면서 CPU가 로드 작업에 묶여 히치가 발생함
- 새로운 플레이어가 세션에 참여할 때, 그 플레이어가 필요한 모든 에셋을 동기적으로 로드해야 하기 때문에 접속 시간이 길어지거나 랙이 발생함
- 사용하지 않는 에셋이 메인 메모리에 상주하여 메모리 예산을 초과하게 만들 수 있음
- 비동기 로드 과정
- 로드 요청 : 플레이어가 에셋이 필요하면
LoadAsset()을 통해 비동기 로드를 요청함
- 백그라운드 처리 : 로드 작업은 백그라운드 스레드에서 처리되므로, 메인 게임 스레드가 멈추지 않아 히치가 발생하지 않음
- 로드 완료 콜백 : 로드가 완료되면 콜백 함수가 실행되어 로드된 에셋을 안전하게 사용할 수 있음
- 하드 참조 예시 : 캐릭터의 기본 무기, 게임 모드의 핵심 클래스
- 소프트 참조 예시 : 캐릭터의 스킨/파츠, 특수 능력의 이펙트