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

리플렉션과 가비지 컬렉션

  • 1.
  • 2.
    주제 선정 이유 •저번에 가비지 컬렉션을 발표했었음 • 회사에서도 가비지 컬렉션을 공부해서 좀 더 내용을 보충하고자 … • 시간이 없어요
  • 3.
  • 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는 다음과같은 정보들을 모두 저장하고 있다 • 클래스 계층 구조 정보 • 멤버 변수 • 멤버 함수 • 기타 등등 • 이를 통해 언리얼 엔진은 리플렉션을 지원할 수 있다
  • 11.
    사용 • 생성자 호출 •Display • DisplayAll • 블루프린트 • GC
  • 12.
  • 13.
    가비지 컬렉션이란? • 프로그램이동적으로 할당했던 메모리 영역 중에서 어떤 변수도 가 리키지 않는 영역을 해제하는 기능 • 언리얼 엔진은 UObject와 UObject의 자식 객체에 한해서 GC를 수행
  • 14.
    장단점 • 장점, 다음과같은 문제를 줄이거나 완전히 해결 가능 • 유효하지 않은 포인터 접근 • 이중 해제 • 메모리 누수
  • 15.
    장단점 • 단점 • 어떤메모리를 해제할지 결정하는 데 비용이 든다 • GC가 일어나는 타이밍이나 점유 시간을 미리 예측하기 어렵다 때문에 프로그램이 예측 불가능하게 일시적으로 정지할 수 있다 • 할당된 메모리가 해제되는 시점을 알 수 없다
  • 16.
    장단점 • GC의 단점은실시간으로 동작하고 퍼포먼스가 중요한 게임에서는 치명적인 결점이 될 수 있다 • 따라서 GC를 제대로 이해하고 게임이 실행되는데 문제가 없도록 코딩을 하는 것이 중요하다
  • 17.
    가비지 컬렉션 알고리즘 •엔진에서는 레퍼런스 그래프를 만들어 어느 오브젝트가 아직 사용 중이고 어느것이 미사용 중인 지 알아낸다 • 이 그래프 루트에는 ‘RootSet’이라 지정된 오브젝트 세트가 있다. 어떤 오브젝트든 RootSet에 추 가시킬 수 있다 • GC가 발생하면 RootSet부터 시작해서 알려진 Uobject 레퍼런스 트리를 검색하여 참조된 오브젝 트를 전부 추적한다 • 참조되지 않은 오브젝트, 즉 트리 검색에서 찾지 못한 것들은 더 이상 필요하지 않은 오브젝트라 가정하고 제거한다 • 오브젝트가 제거되면 해당 오브젝트를 참조했던 변수는 모두 nullptr로 세팅된다
  • 18.
  • 19.
    가비지 컬렉션 알고리즘 1.오브젝트를 순회하면서 RootSet이거나 IsPendingKill이 아닌 오브젝트를 레퍼런스 체크 대상에 포함시킨다 2. IsPendingKill인 오브젝트는 Unreachable Flag를 마킹한다 3. 레퍼런스 체크 대상인 오브젝트들을 순회하면서 오브젝트의 프로퍼티가 다른 오브젝트를 가 리키고 있는지 확인한다 4. 가리키고 있는 오브젝트가 IsPendingKill이면 오브젝트를 가리키는 포인터를 null로 세팅한다 5. 가리키고 있는 오브젝트가 Unreachable이면 Unreachable Flag를 지우고 레퍼런스 체크 대상 에 포함시킨다 6. 레퍼런스 체크 대상이 없을 때까지 3 ~ 5번을 반복한다 7. 오브젝트를 순회하면서 오브젝트가 Unreachable이면 ConditionalBeginDestroy -> IsReadyForFinishDestroy -> ConditionalFinishDestroy 호출 8. ConditionalFinishDestroy가 끝나면 소멸자를 호출하고 메모리를 해제한다
  • 20.