본문 바로가기

전체 글

(17)
UE Actor 라이프사이클 게임플레이 도중 다음 함수를 호출할 수 있지만, 플레이 도중 실제로 소멸되지 않는 액터가 많으므로 완전히 선택 사항입니다(가비지 컬렉션 참조).액터를 메모리에서 소멸시키는 대신 일단 게임 로직상 필요에 따라 액터를 제거(비활성화 또는 'pending kill' 상태로 전환)해야 한다는 의미입니다. 즉, 액터는 즉각적으로 메모리에서 삭제되지 않고, AActor::Destroy를 호출하여 레벨에서 제거하고, 나중에 가비지 컬렉션을 통해 실제 메모리 해제가 이루어지게 됩니다.액터는 킬 보류 중(pending kill)으로 표시되고 레벨의 액터 배열에서 제거됩니다.액터의 수명이 다해가는 것을 보장하기 위해 AActor::EndPlay가 여러 곳에서 호출.플레이 도중 액터가 포함된 스트리밍 레벨이 언로드되면 이 ..
World Grid 렌더링 최적화: 두 가지 접근 방식 기존 방식: 모든 데이터를 하나의 벡터에 삽입하여 렌더링과거에는 World Grid, AABB, Cone, OBB 등 렌더링에 필요한 모든 정점 데이터를 미리 계산한 후,하나의 벡터(예: worldVector)에 모두 저장하고,D3D11_PRIMITIVE_TOPOLOGY_LINELIST 상태에서 단일 드로우콜(context->Draw)로 한 번에 렌더링하는 방법을 사용했다.이 방식의 장점은 데이터가 미리 준비되어 있어 렌더링 시 바로 사용할 수 있다는 점이다.그러나 AABB나 Cone이 회전하거나 위치 변경이 발생할 때마다, 전체 버퍼를 다시 업데이트해야 한다.동적 변환이 자주 발생하면 매 프레임마다 CPU가 매번 정점 데이터를 재계산하면서 불필요한 연산 비용이 발생하게 되고, 이를 최적화할 수 있는 여..
std::vector erase, std::remove 관련 std::remove 함수는 제거 대상이 존재하지 않으면 vec.end()를 반환한다.이 경우 erase의 단일 요소 제거 버전을 호출하면 정의되지 않은 동작이 발생할 수 있다. 범위 버전을 사용하면 반환된 new_end부터 vec.end()까지의 빈 범위가 안전하게 처리된다.따라서 아래와 같이 수정하는 것이 좋다.vec.erase(std::remove(vec.begin(), vec.end(), target), vec.end());.
FName 문자열 비교에 있어서 기존의 strcmp(pString1, pString2) == 0 방식을 사용하는 대신, 문자열을 한 번만 저장하는 풀을 활용하여 인덱스끼리 비교하는 방법을 사용한다. 이 방식은 문자열 전체를 매번 비교하는 오버헤드를 줄이고, 동일한 문자열이 중복 저장되는 문제를 해결하여 메모리 사용량을 크게 개선한다.예를 들어, FNamePool 클래스는 문자열을 풀에 저장하고, FName 클래스는 해당 문자열의 인덱스를 저장한다. 이후 두 FName 객체를 비교할 때는 인덱스 값만 비교하면 되므로, 비교 연산의 효율성이 크게 향상된다.간단한 코드 예시는 다음과 같다:class FName { int index;public: FName(const std::string& Name) { index..
[후기] 크래프톤 게임 테크랩 1기 지원 및 합격 후기 2024년 게임 업계 공채에서 연이어 탈락하며, 결국 타업계로의 취업을 고민했다.하지만 게임 업계에서 일하고 싶은 마음이 쉽게 사그라지지 않았다.단순히 계속 지원만 하는 것보다는 실력을 쌓을 수 있는 프로그램에 참여하는 것이 더 나을 것 같았다. 그렇게 고민 끝에 크래프톤 게임 테크랩과 언씬(UNSEEN) 프로그램 두 가지를 고려했다.솔직히 언씬에 더 끌렸다. 게임 테크랩은 참가비 300만 원 + 기숙사 생활 + 식비 별도라는 부담이 있었기 때문.하지만 문제는 언씬 3기 모집 소식이 들려오지 않는 것이었다. 1기와 2기가 모집된 시기를 고려하면 이미 발표가 나야 할 때였는데, 아무런 소식이 없었다. 결국 타업계 취업 준비도 병행하기로 했다. 게임 테크랩의 선발 과정은 다음과 같다.서류 지원사전 학습 자..
[ 백준 18870 ] 좌표 압축 https://www.acmicpc.net/problem/18870 수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다.Xi를 좌표 압축한 결과 X'i의 값은 Xi > Xj를 만족하는 서로 다른 좌표 Xj의 개수와 같아야 한다.X1, X2, ..., XN에 좌표 압축을 적용한 결과 X'1, X'2, ..., X'N를 출력해보자.  자기 자신보다 작은 값의 개수들을 출력하는 문제다.단순히 모든 값에 대해 자신보다 작은 값을 탐색하면서 개수를 세는 방식은 비효율적이라고 판단했다. 따라서 정렬을 이용하면, 좌표 압축에 필요한 순서를 효율적으로 정할 수 있다고 생각했다. 전체 코드#include #include #include using namespace std..
[백준 1206 ] DFS와 BFS 펄어비스 코테 준비로 백준 문제이지만 프로그래머스 스타일로 코딩해봤다.백준 1206는 DFS와 BFS 모두 구현해야하는 문제다.https://www.acmicpc.net/problem/1260 //예제 입력 25 5 35 45 21 23 43 1//예제 출력 23 1 2 5 43 1 4 2 5//예제 입력 31000 1 1000999 1000//예제 출력 31000 9991000 999 예제 2를 보고 양방향 연결이라는 걸 알 수 있었다. 예제 입력3을 보고 graph를 vector 대신 map>로 처리하고 visited은 set으로 처리해야 한다고 판단했다.왜냐하면 vector>를 사용하면 정점 번호가 1부터 1000까지 모두 할당되므로, 1000개의 빈 벡터가 생성되고visited도 vector 사용..
[ C++ ] RAII Resource Acquisition Is Initialization : 자원 획득은 초기화Resource Acquisition Is Initialization (RAII)는 C++에서 자원의 소유권과 생명주기를 관리하기 위한 설계 패턴입니다. Garbage Collector(GC)를 사용하는 언어(예: Java, Python)에서는 RAII 자체가 구현되지 않습니다.  다만, 자원을 안전하게 해제하기 위해 이를 모방한 유사한 개념이나 패턴(예: Python의 with문, C#의 using문 등)을 활용할 수 있습니다.  그러나 GC 언어의 특성상 RAII와 완전히 동일하게 작동하지는 않습니다.  이 패턴을 더 명확히 이해하기 위해 세부적으로 설명하겠습니다. RAII의 기본 개념자원 획득 시 초기화객체가..