리플렉션이란?
• 프로그램이 실행시간에 자기 자신을 조사하고 수정할 수 있는 기능
• C++은 리플렉션을 지원하지 않아서 언리얼은 자체적으로 리플렉션
을 구현
• 에디터의 디테일 패널, 가비지 컬렉션, 블루프린트 등에서 사용
• ‘프로퍼티 시스템’이라고 불리기도 한다
5.
리플렉션 이용 조건
•클래스 이름.generated.h 파일을 Include
• 클래스 선언 전에 UCLASS 매크로 사용
• 클래스 선언 안에 GENERATED_BODY 매크로 사용
• 멤버 변수는 선언 전에 UPROPERTY 매크로 사용
• 멤버 함수는 선언 전에 UFUNCTION 매크로 사용
6.
리플렉션 이용 조건
출처: https://blog.naver.com/destiny9720/220934094119
7.
리플렉션 이용 조건
출처: https://blog.naver.com/destiny9720/220934094119
8.
리플렉션 이용 조건
•이 규칙을 지킨다면 컴파일 시 Unreal Header Tool (UHT)이
리플렉션 관련 C++ 코드를 생성
• StaticClass() 함수 또는 GetClass() 함수가 리플렉션 데이터를 구하는
대표적인 함수
9.
UClass
• 헤더 파일에UObject를 적절하게 선언하면 UHT가 헤더 파일을 분석
하는
과정이 진행되며, 이 과정이 완료되면 Intermediate 폴더에 Uobject의
정보를 담은 메타 파일이 생성된다
• 이 메타 정보는 UClass라는 클래스를 통해 보관된다
• 컴파일 단계에서 개별 UObject의 UClass가 정의되고 런타임 단계에서
UObejct 마다 UClass의 인스턴스가 생성된다
10.
UClass
• UClass는 다음과같은 정보들을 모두 저장하고 있다
• 클래스 계층 구조 정보
• 멤버 변수
• 멤버 함수
• 기타 등등
• 이를 통해 언리얼 엔진은 리플렉션을 지원할 수 있다
가비지 컬렉션이란?
• 프로그램이동적으로 할당했던 메모리 영역 중에서 어떤 변수도 가
리키지 않는 영역을 해제하는 기능
• 언리얼 엔진은 UObject와 UObject의 자식 객체에 한해서 GC를 수행
14.
장단점
• 장점, 다음과같은 문제를 줄이거나 완전히 해결 가능
• 유효하지 않은 포인터 접근
• 이중 해제
• 메모리 누수
15.
장단점
• 단점
• 어떤메모리를 해제할지 결정하는 데 비용이 든다
• GC가 일어나는 타이밍이나 점유 시간을 미리 예측하기 어렵다
때문에 프로그램이 예측 불가능하게 일시적으로 정지할 수 있다
• 할당된 메모리가 해제되는 시점을 알 수 없다
16.
장단점
• GC의 단점은실시간으로 동작하고 퍼포먼스가 중요한 게임에서는
치명적인 결점이 될 수 있다
• 따라서 GC를 제대로 이해하고 게임이 실행되는데 문제가 없도록
코딩을 하는 것이 중요하다
17.
가비지 컬렉션 알고리즘
•엔진에서는 레퍼런스 그래프를 만들어 어느 오브젝트가 아직 사용 중이고 어느것이 미사용 중인
지 알아낸다
• 이 그래프 루트에는 ‘RootSet’이라 지정된 오브젝트 세트가 있다. 어떤 오브젝트든 RootSet에 추
가시킬 수 있다
• GC가 발생하면 RootSet부터 시작해서 알려진 Uobject 레퍼런스 트리를 검색하여 참조된 오브젝
트를 전부 추적한다
• 참조되지 않은 오브젝트, 즉 트리 검색에서 찾지 못한 것들은 더 이상 필요하지 않은 오브젝트라
가정하고
제거한다
• 오브젝트가 제거되면 해당 오브젝트를 참조했던 변수는 모두 nullptr로 세팅된다