※다운로드하시면 더 선명한 자료를 보실 수 있습니다.
언리얼 엔진 프로그래밍을 시작하면, 편리하지만 한편으로는 골치아픈 UObject 시스템을 만나게 됩니다.
이 발표에서는 C++ 프로그래머를 대상으로 UObject 시스템과 그 핵심 기능인 리플렉션, 가비지 컬렉션을 소개하고 그 동작 원리를 함께 들여다봅니다.
목차
1. 일반적인 리플렉션의 개념
2. 언리얼엔진의 리플렉션
3. 일반적인 가비지컬렉션의 개념
4. 언리얼엔진의 가비지 컬렉션
대상
- C++ 개발자
- 언리얼 C++ 프로그래밍에 관심 있는 분
■관련 동영상: https://youtu.be/VpEe9DbcZIs
※다운로드하시면 더 선명한 자료를 보실 수 있습니다.
언리얼 엔진 프로그래밍을 시작하면, 편리하지만 한편으로는 골치아픈 UObject 시스템을 만나게 됩니다.
이 발표에서는 C++ 프로그래머를 대상으로 UObject 시스템과 그 핵심 기능인 리플렉션, 가비지 컬렉션을 소개하고 그 동작 원리를 함께 들여다봅니다.
목차
1. 일반적인 리플렉션의 개념
2. 언리얼엔진의 리플렉션
3. 일반적인 가비지컬렉션의 개념
4. 언리얼엔진의 가비지 컬렉션
대상
- C++ 개발자
- 언리얼 C++ 프로그래밍에 관심 있는 분
■관련 동영상: https://youtu.be/VpEe9DbcZIs
Scala, Spring-Boot, JPA를 활용한 웹 애플리케이션 개발 과정에 대해 다룬다. Spring-Boot와 JPA 조합만으로도 생산성 있는 웹 애플리케이션 개발이 가능하다. 이 조합만으로도 충분히 의미가 있지만 여기에 Scala라는 약간은 불편한 듯 보이는 언어를 도입함으로써 얻을 수 있는 즐거움을 공유한다. Spring-Boot + JPA 조합에 Scala를 적용하면서의 좌충우돌 경험담을 전한다.
4. 리플렉션이란?
• 프로그램이 실행 시간에 자기 자신을 조사하고 수정할 수 있는 기능
• 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는 다음과 같은 정보들을 모두 저장하고 있다
• 클래스 계층 구조 정보
• 멤버 변수
• 멤버 함수
• 기타 등등
• 이를 통해 언리얼 엔진은 리플렉션을 지원할 수 있다
13. 가비지 컬렉션이란?
• 프로그램이 동적으로 할당했던 메모리 영역 중에서 어떤 변수도 가
리키지 않는 영역을 해제하는 기능
• 언리얼 엔진은 UObject와 UObject의 자식 객체에 한해서 GC를 수행
14. 장단점
• 장점, 다음과 같은 문제를 줄이거나 완전히 해결 가능
• 유효하지 않은 포인터 접근
• 이중 해제
• 메모리 누수
15. 장단점
• 단점
• 어떤 메모리를 해제할지 결정하는 데 비용이 든다
• GC가 일어나는 타이밍이나 점유 시간을 미리 예측하기 어렵다
때문에 프로그램이 예측 불가능하게 일시적으로 정지할 수 있다
• 할당된 메모리가 해제되는 시점을 알 수 없다
16. 장단점
• GC의 단점은 실시간으로 동작하고 퍼포먼스가 중요한 게임에서는
치명적인 결점이 될 수 있다
• 따라서 GC를 제대로 이해하고 게임이 실행되는데 문제가 없도록
코딩을 하는 것이 중요하다
17. 가비지 컬렉션 알고리즘
• 엔진에서는 레퍼런스 그래프를 만들어 어느 오브젝트가 아직 사용 중이고 어느것이 미사용 중인
지 알아낸다
• 이 그래프 루트에는 ‘RootSet’이라 지정된 오브젝트 세트가 있다. 어떤 오브젝트든 RootSet에 추
가시킬 수 있다
• GC가 발생하면 RootSet부터 시작해서 알려진 Uobject 레퍼런스 트리를 검색하여 참조된 오브젝
트를 전부 추적한다
• 참조되지 않은 오브젝트, 즉 트리 검색에서 찾지 못한 것들은 더 이상 필요하지 않은 오브젝트라
가정하고
제거한다
• 오브젝트가 제거되면 해당 오브젝트를 참조했던 변수는 모두 nullptr로 세팅된다