오늘 UE_Log를 통해 언리얼 엔진의 라이프 사이클을 테스트해보다가 CDO 라는 것을 알게 됐다.
CDO (Class Default Object)는 모든 UCLASS마다 자동으로 하나씩 만들어지는 객체이다.
이름은 보통 Default_ClassName이며 해당 클래스의 기본 상태를 저장하는 템플릿 역할을 한다.
클래스가 로드될 때 리플렉션 시스템이 클래스 정보를 읽어오며, 해당 클래스의 CDO가 자동으로 한 번 생성된다.
실제로 Item이라는 C++ 클래스를 만들고, 생성자에 UE_Log를 출력해보면 컴파일이나 에디터 실행 시 다음과 같은 로그가 출력된다.


C++ 생성자에서 설정한 값, 블루프린트에서 지정한 값이 CDO에 저장되며, 디테일 패널과 블루프린트 Class Default에서 보이는 값은 CDO를 참조한 값이다.
인스턴스 생성 시 CDO 메모리를 memcpy로 복사하여 빠르게 초기화가 가능하므로 최적화에 도움이 된다.
만약 CDO가 없다면 객체를 생성할 때마다 이 변수는 이 값, 저 변수는 저 값, Config는 어디서 로드... 같은 메타데이터 기반 초기화를 해야하기 때문에 인스턴스 생성 속도가 느려지고, 비용이 많이 들어서 성능이 떨어질 것이다.
CDO가 없는 경우와 있는 경우를 간단히 비유하자면 다음과 같다.
CDO가 없는 경우CDO가 있는 경우즉, CDO가 있으면 굉장히 빠른 속도로 인스턴스를 생성할 수 있는 것이다.
CDO는 모든 UCLASS 마다 반드시 하나씩 메모리에 올라가 있으며, 인스턴스 생성 시 해당 클래스의 CDO를 참조하여 생성된다.