SlideShare a Scribd company logo
리플렉션과
가비지 컬렉션
주제 선정 이유
• 저번에 가비지 컬렉션을 발표했었음
• 회사에서도 가비지 컬렉션을 공부해서 좀 더 내용을 보충하고자
…
• 시간이 없어요
리플렉션
(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

More Related Content

What's hot

Compute shader
Compute shaderCompute shader
Compute shader
QooJuice
 
GameInstance에 대해서 알아보자
GameInstance에 대해서 알아보자GameInstance에 대해서 알아보자
GameInstance에 대해서 알아보자
TonyCms
 
[2019] 언리얼 엔진을 통해 살펴보는 리플렉션과 가비지 컬렉션
[2019] 언리얼 엔진을 통해 살펴보는 리플렉션과 가비지 컬렉션[2019] 언리얼 엔진을 통해 살펴보는 리플렉션과 가비지 컬렉션
[2019] 언리얼 엔진을 통해 살펴보는 리플렉션과 가비지 컬렉션
NHN FORWARD
 
Ndc2010 전형규 마비노기2 캐릭터 렌더링 기술
Ndc2010 전형규   마비노기2 캐릭터 렌더링 기술Ndc2010 전형규   마비노기2 캐릭터 렌더링 기술
Ndc2010 전형규 마비노기2 캐릭터 렌더링 기술henjeon
 
김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019
김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019
김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019
devCAT Studio, NEXON
 
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
devCAT Studio, NEXON
 
Tips and experience of DX12 Engine development .
Tips and experience of DX12 Engine development .Tips and experience of DX12 Engine development .
Tips and experience of DX12 Engine development .
YEONG-CHEON YOU
 
[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들
[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들
[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들MinGeun Park
 
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
devCAT Studio, NEXON
 
C++20에서 리플렉션 기능 구현
C++20에서 리플렉션 기능 구현C++20에서 리플렉션 기능 구현
C++20에서 리플렉션 기능 구현
Bongseok Cho
 
[NDC08] 최적화와 프로파일링 - 송창규
[NDC08] 최적화와 프로파일링 - 송창규[NDC08] 최적화와 프로파일링 - 송창규
[NDC08] 최적화와 프로파일링 - 송창규ChangKyu Song
 
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
영욱 오
 
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
devCAT Studio, NEXON
 
[0903 구경원] recast 네비메쉬
[0903 구경원] recast 네비메쉬[0903 구경원] recast 네비메쉬
[0903 구경원] recast 네비메쉬KyeongWon Koo
 
빠른 렌더링을 위한 오브젝트 제외 기술
빠른 렌더링을 위한 오브젝트 제외 기술빠른 렌더링을 위한 오브젝트 제외 기술
빠른 렌더링을 위한 오브젝트 제외 기술
YEONG-CHEON YOU
 
Hierachical z Map Occlusion Culling
Hierachical z Map Occlusion CullingHierachical z Map Occlusion Culling
Hierachical z Map Occlusion CullingYEONG-CHEON YOU
 
[Kgc2012] deferred forward 이창희
[Kgc2012] deferred forward 이창희[Kgc2012] deferred forward 이창희
[Kgc2012] deferred forward 이창희
changehee lee
 
언리얼을 활용한 오브젝트 풀링
언리얼을 활용한 오브젝트 풀링언리얼을 활용한 오브젝트 풀링
언리얼을 활용한 오브젝트 풀링
TonyCms
 
Compute shader DX11
Compute shader DX11Compute shader DX11
Compute shader DX11
민웅 이
 
NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술
NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술
NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술
Ki Hyunwoo
 

What's hot (20)

Compute shader
Compute shaderCompute shader
Compute shader
 
GameInstance에 대해서 알아보자
GameInstance에 대해서 알아보자GameInstance에 대해서 알아보자
GameInstance에 대해서 알아보자
 
[2019] 언리얼 엔진을 통해 살펴보는 리플렉션과 가비지 컬렉션
[2019] 언리얼 엔진을 통해 살펴보는 리플렉션과 가비지 컬렉션[2019] 언리얼 엔진을 통해 살펴보는 리플렉션과 가비지 컬렉션
[2019] 언리얼 엔진을 통해 살펴보는 리플렉션과 가비지 컬렉션
 
Ndc2010 전형규 마비노기2 캐릭터 렌더링 기술
Ndc2010 전형규   마비노기2 캐릭터 렌더링 기술Ndc2010 전형규   마비노기2 캐릭터 렌더링 기술
Ndc2010 전형규 마비노기2 캐릭터 렌더링 기술
 
김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019
김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019
김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019
 
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
 
Tips and experience of DX12 Engine development .
Tips and experience of DX12 Engine development .Tips and experience of DX12 Engine development .
Tips and experience of DX12 Engine development .
 
[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들
[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들
[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들
 
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
 
C++20에서 리플렉션 기능 구현
C++20에서 리플렉션 기능 구현C++20에서 리플렉션 기능 구현
C++20에서 리플렉션 기능 구현
 
[NDC08] 최적화와 프로파일링 - 송창규
[NDC08] 최적화와 프로파일링 - 송창규[NDC08] 최적화와 프로파일링 - 송창규
[NDC08] 최적화와 프로파일링 - 송창규
 
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
 
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
 
[0903 구경원] recast 네비메쉬
[0903 구경원] recast 네비메쉬[0903 구경원] recast 네비메쉬
[0903 구경원] recast 네비메쉬
 
빠른 렌더링을 위한 오브젝트 제외 기술
빠른 렌더링을 위한 오브젝트 제외 기술빠른 렌더링을 위한 오브젝트 제외 기술
빠른 렌더링을 위한 오브젝트 제외 기술
 
Hierachical z Map Occlusion Culling
Hierachical z Map Occlusion CullingHierachical z Map Occlusion Culling
Hierachical z Map Occlusion Culling
 
[Kgc2012] deferred forward 이창희
[Kgc2012] deferred forward 이창희[Kgc2012] deferred forward 이창희
[Kgc2012] deferred forward 이창희
 
언리얼을 활용한 오브젝트 풀링
언리얼을 활용한 오브젝트 풀링언리얼을 활용한 오브젝트 풀링
언리얼을 활용한 오브젝트 풀링
 
Compute shader DX11
Compute shader DX11Compute shader DX11
Compute shader DX11
 
NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술
NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술
NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술
 

Similar to 리플렉션과 가비지 컬렉션

Do not use Django as like as SMARTSTUDY
Do not use Django as like as SMARTSTUDYDo not use Django as like as SMARTSTUDY
Do not use Django as like as SMARTSTUDY
Hyun-woo Park
 
필요해서 하는 개발 자동화
필요해서 하는 개발 자동화필요해서 하는 개발 자동화
필요해서 하는 개발 자동화
none
 
C++ 코딩의 정석.pptx
C++ 코딩의 정석.pptxC++ 코딩의 정석.pptx
C++ 코딩의 정석.pptx
sung suk seo
 
커뮤니티와 함께한 예비개발자 성장기- 조성수님
커뮤니티와 함께한 예비개발자 성장기- 조성수님커뮤니티와 함께한 예비개발자 성장기- 조성수님
커뮤니티와 함께한 예비개발자 성장기- 조성수님
NAVER D2
 
201803 파이썬 세미나
201803 파이썬 세미나201803 파이썬 세미나
201803 파이썬 세미나
JeongHwan Kim
 
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Javajigi Jaesung
 
Source To URL Without Dockerfile
Source To URL Without DockerfileSource To URL Without Dockerfile
Source To URL Without Dockerfile
Won-Chon Jung
 
[오픈소스컨설팅]Session 6. scrum과 jira 기반의 소프트웨어 개발 프로세스
[오픈소스컨설팅]Session 6. scrum과 jira 기반의 소프트웨어 개발 프로세스[오픈소스컨설팅]Session 6. scrum과 jira 기반의 소프트웨어 개발 프로세스
[오픈소스컨설팅]Session 6. scrum과 jira 기반의 소프트웨어 개발 프로세스
Hee Jae Lee
 
멸종하는 공룡이 되지 않으려면
멸종하는 공룡이 되지 않으려면멸종하는 공룡이 되지 않으려면
멸종하는 공룡이 되지 않으려면
Byeongsu Kang
 
김찬웅_그룹웨어에 새 에너지를_NDC15
김찬웅_그룹웨어에 새 에너지를_NDC15김찬웅_그룹웨어에 새 에너지를_NDC15
김찬웅_그룹웨어에 새 에너지를_NDC15
Chanwoong Kim
 
애자일 스크럼과 JIRA
애자일 스크럼과 JIRA 애자일 스크럼과 JIRA
애자일 스크럼과 JIRA
Terry Cho
 
Image Deep Learning 실무적용
Image Deep Learning 실무적용Image Deep Learning 실무적용
Image Deep Learning 실무적용
Youngjae Kim
 
[123] electron 김성훈
[123] electron 김성훈[123] electron 김성훈
[123] electron 김성훈
NAVER D2
 
Kubernetes를 통한 laravel 개발프로세스 개선하기
Kubernetes를 통한 laravel 개발프로세스 개선하기Kubernetes를 통한 laravel 개발프로세스 개선하기
Kubernetes를 통한 laravel 개발프로세스 개선하기
Changyeop Kim
 
AngularJS In Production
AngularJS In ProductionAngularJS In Production
AngularJS In Production
MooYeol Lee
 
2021년 1월 30일 개발자 이야기
2021년 1월 30일 개발자 이야기2021년 1월 30일 개발자 이야기
2021년 1월 30일 개발자 이야기
Jay Park
 
Mec++ chapter3,4
Mec++ chapter3,4Mec++ chapter3,4
Mec++ chapter3,4문익 장
 
effective c++ chapter 3~4 정리
effective c++ chapter 3~4 정리effective c++ chapter 3~4 정리
effective c++ chapter 3~4 정리
Injae Lee
 
[MeetUp][3rd] Prometheus 와 함께하는 모니터링 및 시각화
[MeetUp][3rd] Prometheus 와 함께하는 모니터링 및 시각화[MeetUp][3rd] Prometheus 와 함께하는 모니터링 및 시각화
[MeetUp][3rd] Prometheus 와 함께하는 모니터링 및 시각화
InfraEngineer
 
More Effective C++ 4주차
More Effective C++ 4주차More Effective C++ 4주차
More Effective C++ 4주차Injae Lee
 

Similar to 리플렉션과 가비지 컬렉션 (20)

Do not use Django as like as SMARTSTUDY
Do not use Django as like as SMARTSTUDYDo not use Django as like as SMARTSTUDY
Do not use Django as like as SMARTSTUDY
 
필요해서 하는 개발 자동화
필요해서 하는 개발 자동화필요해서 하는 개발 자동화
필요해서 하는 개발 자동화
 
C++ 코딩의 정석.pptx
C++ 코딩의 정석.pptxC++ 코딩의 정석.pptx
C++ 코딩의 정석.pptx
 
커뮤니티와 함께한 예비개발자 성장기- 조성수님
커뮤니티와 함께한 예비개발자 성장기- 조성수님커뮤니티와 함께한 예비개발자 성장기- 조성수님
커뮤니티와 함께한 예비개발자 성장기- 조성수님
 
201803 파이썬 세미나
201803 파이썬 세미나201803 파이썬 세미나
201803 파이썬 세미나
 
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
 
Source To URL Without Dockerfile
Source To URL Without DockerfileSource To URL Without Dockerfile
Source To URL Without Dockerfile
 
[오픈소스컨설팅]Session 6. scrum과 jira 기반의 소프트웨어 개발 프로세스
[오픈소스컨설팅]Session 6. scrum과 jira 기반의 소프트웨어 개발 프로세스[오픈소스컨설팅]Session 6. scrum과 jira 기반의 소프트웨어 개발 프로세스
[오픈소스컨설팅]Session 6. scrum과 jira 기반의 소프트웨어 개발 프로세스
 
멸종하는 공룡이 되지 않으려면
멸종하는 공룡이 되지 않으려면멸종하는 공룡이 되지 않으려면
멸종하는 공룡이 되지 않으려면
 
김찬웅_그룹웨어에 새 에너지를_NDC15
김찬웅_그룹웨어에 새 에너지를_NDC15김찬웅_그룹웨어에 새 에너지를_NDC15
김찬웅_그룹웨어에 새 에너지를_NDC15
 
애자일 스크럼과 JIRA
애자일 스크럼과 JIRA 애자일 스크럼과 JIRA
애자일 스크럼과 JIRA
 
Image Deep Learning 실무적용
Image Deep Learning 실무적용Image Deep Learning 실무적용
Image Deep Learning 실무적용
 
[123] electron 김성훈
[123] electron 김성훈[123] electron 김성훈
[123] electron 김성훈
 
Kubernetes를 통한 laravel 개발프로세스 개선하기
Kubernetes를 통한 laravel 개발프로세스 개선하기Kubernetes를 통한 laravel 개발프로세스 개선하기
Kubernetes를 통한 laravel 개발프로세스 개선하기
 
AngularJS In Production
AngularJS In ProductionAngularJS In Production
AngularJS In Production
 
2021년 1월 30일 개발자 이야기
2021년 1월 30일 개발자 이야기2021년 1월 30일 개발자 이야기
2021년 1월 30일 개발자 이야기
 
Mec++ chapter3,4
Mec++ chapter3,4Mec++ chapter3,4
Mec++ chapter3,4
 
effective c++ chapter 3~4 정리
effective c++ chapter 3~4 정리effective c++ chapter 3~4 정리
effective c++ chapter 3~4 정리
 
[MeetUp][3rd] Prometheus 와 함께하는 모니터링 및 시각화
[MeetUp][3rd] Prometheus 와 함께하는 모니터링 및 시각화[MeetUp][3rd] Prometheus 와 함께하는 모니터링 및 시각화
[MeetUp][3rd] Prometheus 와 함께하는 모니터링 및 시각화
 
More Effective C++ 4주차
More Effective C++ 4주차More Effective C++ 4주차
More Effective C++ 4주차
 

More from QooJuice

캐릭터 애니메이션
캐릭터 애니메이션캐릭터 애니메이션
캐릭터 애니메이션
QooJuice
 
Screen space ambient occlusion
Screen space ambient occlusionScreen space ambient occlusion
Screen space ambient occlusion
QooJuice
 
Game programming patterns 2
Game programming patterns 2Game programming patterns 2
Game programming patterns 2
QooJuice
 
Game programming patterns
Game programming patternsGame programming patterns
Game programming patterns
QooJuice
 
Picking
PickingPicking
Picking
QooJuice
 
코루틴(Coroutine)
코루틴(Coroutine)코루틴(Coroutine)
코루틴(Coroutine)
QooJuice
 
테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템
QooJuice
 
Direct x 12 초기화
Direct x 12 초기화Direct x 12 초기화
Direct x 12 초기화
QooJuice
 
노말 맵핑(Normal mapping)
노말 맵핑(Normal mapping)노말 맵핑(Normal mapping)
노말 맵핑(Normal mapping)
QooJuice
 
함수형 프로그래밍
함수형 프로그래밍함수형 프로그래밍
함수형 프로그래밍
QooJuice
 
부팅
부팅부팅
부팅
QooJuice
 
절차지향 vs 객체지향
절차지향 vs 객체지향절차지향 vs 객체지향
절차지향 vs 객체지향
QooJuice
 
Segmentation and Paging
Segmentation and PagingSegmentation and Paging
Segmentation and Paging
QooJuice
 
Move semantics
Move semanticsMove semantics
Move semantics
QooJuice
 

More from QooJuice (16)

캐릭터 애니메이션
캐릭터 애니메이션캐릭터 애니메이션
캐릭터 애니메이션
 
Screen space ambient occlusion
Screen space ambient occlusionScreen space ambient occlusion
Screen space ambient occlusion
 
Game programming patterns 2
Game programming patterns 2Game programming patterns 2
Game programming patterns 2
 
Game programming patterns
Game programming patternsGame programming patterns
Game programming patterns
 
Picking
PickingPicking
Picking
 
코루틴(Coroutine)
코루틴(Coroutine)코루틴(Coroutine)
코루틴(Coroutine)
 
테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템
 
Direct x 12 초기화
Direct x 12 초기화Direct x 12 초기화
Direct x 12 초기화
 
행렬
행렬행렬
행렬
 
벡터
벡터벡터
벡터
 
노말 맵핑(Normal mapping)
노말 맵핑(Normal mapping)노말 맵핑(Normal mapping)
노말 맵핑(Normal mapping)
 
함수형 프로그래밍
함수형 프로그래밍함수형 프로그래밍
함수형 프로그래밍
 
부팅
부팅부팅
부팅
 
절차지향 vs 객체지향
절차지향 vs 객체지향절차지향 vs 객체지향
절차지향 vs 객체지향
 
Segmentation and Paging
Segmentation and PagingSegmentation and Paging
Segmentation and Paging
 
Move semantics
Move semanticsMove semantics
Move semantics
 

리플렉션과 가비지 컬렉션

  • 2. 주제 선정 이유 • 저번에 가비지 컬렉션을 발표했었음 • 회사에서도 가비지 컬렉션을 공부해서 좀 더 내용을 보충하고자 … • 시간이 없어요
  • 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
  • 13. 가비지 컬렉션이란? • 프로그램이 동적으로 할당했던 메모리 영역 중에서 어떤 변수도 가 리키지 않는 영역을 해제하는 기능 • 언리얼 엔진은 UObject와 UObject의 자식 객체에 한해서 GC를 수행
  • 14. 장단점 • 장점, 다음과 같은 문제를 줄이거나 완전히 해결 가능 • 유효하지 않은 포인터 접근 • 이중 해제 • 메모리 누수
  • 15. 장단점 • 단점 • 어떤 메모리를 해제할지 결정하는 데 비용이 든다 • GC가 일어나는 타이밍이나 점유 시간을 미리 예측하기 어렵다 때문에 프로그램이 예측 불가능하게 일시적으로 정지할 수 있다 • 할당된 메모리가 해제되는 시점을 알 수 없다
  • 16. 장단점 • GC의 단점은 실시간으로 동작하고 퍼포먼스가 중요한 게임에서는 치명적인 결점이 될 수 있다 • 따라서 GC를 제대로 이해하고 게임이 실행되는데 문제가 없도록 코딩을 하는 것이 중요하다
  • 17. 가비지 컬렉션 알고리즘 • 엔진에서는 레퍼런스 그래프를 만들어 어느 오브젝트가 아직 사용 중이고 어느것이 미사용 중인 지 알아낸다 • 이 그래프 루트에는 ‘RootSet’이라 지정된 오브젝트 세트가 있다. 어떤 오브젝트든 RootSet에 추 가시킬 수 있다 • GC가 발생하면 RootSet부터 시작해서 알려진 Uobject 레퍼런스 트리를 검색하여 참조된 오브젝 트를 전부 추적한다 • 참조되지 않은 오브젝트, 즉 트리 검색에서 찾지 못한 것들은 더 이상 필요하지 않은 오브젝트라 가정하고 제거한다 • 오브젝트가 제거되면 해당 오브젝트를 참조했던 변수는 모두 nullptr로 세팅된다
  • 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. Q / A