목록언리얼 엔진 (77)
게임 개발 메모장
코드를 짜다보면, 특정 객체의 클래스 정보를 알기 위해 GetClass 혹은 StaticClass 를 쓰는 것을 볼 수 있다. 그런데 이 둘의 차이는 무엇일까? 한 줄 요악 : StaticClass 는 컴파일 타임에서 UClass 타입의 정보를 얻어오는 것이며, GetClass 는 런타임에서 실제 객체의 클래스를 조회할때 사용된다. AMyActor* ActorPtr = NewObject(...); UObject* ObjPtr = Actor; UClass* MyActorClass = AMyActor::StaticClass(); // AMyActor UClass* ObjectClass = UObject::StaticClass(); // UObject UClass* ActorPtrClass = ActorPtr..
댕글링 포인터란 C 에서 예를 들면 malloc() 함수를 이용해 Heap 공간에서 동적 메모리를 할당한 후에는 free() 함수를 통해 할당된 메모리를 해제 한다. 하지만, 포인터가 여전히 해제된 메모리 영역을 가리키고 있을 때에 문제가 될 수 있는데, 이것을 댕글링 포인터라고 부른다. 문제점 * 메모리 접근시 예측 불가능한 동작을 일으킬 수 있다. * 메모리 접근 불가 시 Segmentation fault가 발생한다. * 잠재적인 보안 위험이 있을 수 있다. 처음에 *ptr을 1로 값을 넣어주고 메모리를 해제해주었는데 ptr은 여전히 처음 할당된 메모리 영역을 가리키고 있다. 여기서 다시 *ptr = 2 처럼 해제된 메모리 영역에 접근하게 되면 문제가 발생할 수 있다. 해결 방법 free() 함수를 ..
1. PendingKill Actor는 일반적으로 가비지 콜렉팅되지 않는데, 월드 오브젝트가 액터 레퍼런스 목록을 저장하기 때문이다. 액터는 Destroy() 를 호출하여 명시적으로 소멸시킬 수 있다. 그러면 레벨에서 제거되어 pending kill (킬 대기) 상태로 마킹, 잠시 후 다음 가비지 콜렉션 때 지워진다는 뜻이다. 언리얼의 엑터나 컴포넌트는 Destroy를 호출하여 제거를 하게 되면 씬 상에서는 제거된 것으로 보이지만 메모리에서는 Pending Kill 상태가 되어 존재하며 다음 GC(Garbage Collection) 실행시 메모리에서 해제된다. 이는 에디터의 프로젝트 기본 설정상으로 1분단위로 Pending Kill 상태인 오브젝트를 제거하며 사용자가 설정을 변경할 수 있다. C++ 코드..
실행시간에 실시간 게임플레이 데이터를 분석할 수 있도록 해주는 툴입니다. https://docs.unrealengine.com/4.27/ko/ProgrammingAndScripting/GameplayDebugger/ 게임플레이 디버거 실행시간에 실시간 게임플레이 데이터를 분석할 수 있도록 해주는 툴입니다. docs.unrealengine.com
참고 : C++ Assert - https://yooyoungjae0627.tistory.com/6 assert 는 일반적으로 참조하고자 하는 변수가 null 인지 아닌지를 체크하는 용도로 자주 사용된다. 실제 개발을 할 때는 프로젝트명으로 된 헤더 파일에 assert 구문을 이용한 커스텀 로그를 만들어 놓는 게 간편하다. 언리얼에서의 assert 종류는 크게 check, verify, ensure 이 있다. // assert 는 DO_CHECK = 1 일때만 실행 // check 는 false 값이면 실행을 중지 check(Mesh != nullptr); checkf(MyPtr, TEXT("MyPtr is nullptr")); // false 이면 로그 출력 checkcodeMyPtr, TEXT("My..
- 디버그 모드에서 디버깅시 어떤 이유 때문에 에러가 났는지를 알 수 있는 유용한 키워드다. - #include 를 해주어야 사용이 가능하다. 1. assert(조건) * 이 조건식이 false 라면 런타임 에러가 나도록 한다. #include using namespace std; int main() { int number = 5; assert(number == 4); return 0; } 1) Release모드 에선 아무런 문제가 없는 코드. 2) 하지만, Debug모드에선 에러를 발생. - assert(number == 4) : number 값이 4가 아닌 5이기 때문. - 프로그래머가 직접 number값이 4가 맞는지 찍어보지 않더라도 number값이 4가 아니면 에러를 발생시켜주므로 디버깅 시 편..
C/C++를 사용하는 이유 중 하나로는 빠른 속도와 커스터마이징 가능한 자원관리 등의 최적화를 위해서 사용할 것이다. 이러한 부분에서 코드를 개발하면서, 컴파일러단에서 부터 코드를 최적화 시켜서 더욱 바르게 실행 할 수 있도록 하려는 노력들이 많이 있다. 이처럼 C/C++ 에서는 내가 원하는대로 코드를 작성하더라도 컴파일러에 의해 최적화 시킬 여지가 있으면 그러한 부분은 컴파일러가 최적화 시켜서 돌아가도록 만들어준다. RVO(Return Value Optimization) #include class Yoo { public: Yoo(const std::string& name) { this->name = name; std::cout