박하의 나날

[21]언리얼 오브젝트 처리

프로그래밍/Unreal

 

1) 가비지 콜렉션: 더이상 레퍼런싱되지 않거나 명시적으로 소멸예약시킨 UObject*를 주기적으로 정리한다.
가비지 콜렉션이 발생하면 엔진은 루트세트*부터 시작해서 알려진 UObject레퍼런스 트리를 검색하여 레퍼런싱된 오브젝트를 전부

추적할수 있다. 이때 레퍼런싱 되지 않은 오브젝트는 더이상 필요치않은 오브젝트라 가정하고 제거된다.

살리고싶은 오브젝트는 UPROPERTY* 레퍼런스 를 유지해주어야한다.
엑터는 예외: 엑터가 속한 레벨에 의해 레퍼런싱되어있어서.->Destroy()로 명시적 소멸예약이 가능하다.

*UObject: 기본 구성 요소, UClass와 함께한다.
프로퍼티와 메소드의 반영, 프로퍼티의 시리얼라이제이션, 가비지 컬렉션, 이름으로 UObject 찾기,
프로퍼티에 환경설정 가능 값, 프로퍼티와 메소드에 네트워킹 지원 등의 서비스 제공.

*루트세트: 엔진에는 레퍼런스 그래프를 만들어 어느 오브젝트가 아직사용중이고 고아가 되었는지를 알아내는데 이 그래프 루트에는

"루트세트"라 지정된 오브젝트 세트가 있다. 어떤 오브젝트도 추가시킬수 있다.

*UPROPERTY() : 프로퍼티를 에디터에 노출시키는 전용 매크로

 

2)레퍼런스 자동 업데이트: UPROPERTY로 마킹된 오브젝트 레퍼런스에만 적용된다.
가비지 콜렉션을 통해 UActorComponent 또는 AActor가 정리될때, 그에 대한 UPROPERTY레퍼런스는 NULL로 자동업데이트된다.

이때 명시적 소멸 예약(Destory)된 경우 포인터가 NULL이 되기 때문에 레퍼런스 해제 전 반드시 테스트할 것.

 

3)Serialization : transient 마킹 되지 않은 이상 자동으로 읽고 쓰기가 가능하다.
ex) 레벨에 AEnemy인스턴스 배치후 health=500설정하고 거장하면 UClass 정의이외의 코드를 작성하지 않고도
다시 로드가 가능하다.
UProperty가 추가/제거될때 새 프로퍼티는 새 CDO*에서 기본값을 복사해온다. 제거된 프로퍼티는 무시.

*CDO : Class Default Object 각 UClass당 하나씩 유지한다.
기본 "템플릿" 오브젝트로 클래스 생성자에 의해 생성된 이후 변경되지 않는다.

4)프로퍼티 값 업데이트
UClass의 CDO가 변경되면 엔진은 알아서 변경사항을 적용 시도한다.
ex) Enemy 생성자의 Health 기본값을 100으로 설정하고 레벨을 저장함->enemy_3만 특별히 health = 500으로 설정
-> 기본 Health 값을 150으로 올림
== 언리얼은 CDO를 변경했다고 알아채고 enemy_3제외한 모든 enemy Health를 150으로 업데이트한다.
enemy_3의 Health는 500유지하고.

5)자동프로퍼티 초기화: UObject는 생성자 호출 전 초기화시 자동으로 0으로 채워진다.
클래스, UProperty, 네이티브 멤버 모두.

6)에디터 통합(integration)
UObject와 UProperty는 에디터에 인식되며 에디터는 별도의 코드없이 값을 자동으로 노출시킬 수 있다.
선택적으로 블루프린트로의 인테그레이션이 가능하다.

7)실행시간시 유형정보

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class AEnemy : public ACharacter
{
    virtual void Speak()
    {
        Say("Time to fight!");
    }
};
 
class AMegaBoss : public AEnemy
{
    virtual void Speak()
    {
        Say("Powering up! ");
        Super::Speak();
    }
};
cs

모든 UObject 클래스에는 그 부모클래스로 설정된 커스텀 "Super" typedef가 있어서 덮어쓰기 행위에 대한
제어가 쉽게 가능하다.
Speak()를 호출하면 MegaBoss가 "Powering up! Time to fight" 라고 말한다.

템플릿 Cast함수를 사용해 베이스 클래스에서의 오브젝트를 좀더 파생된 클래스로 안전하게 형변환하거나
IsA()를 사용해서 오브젝트가 어떤 특정클래스의 것인지 알수 있다.

'프로그래밍 > Unreal' 카테고리의 다른 글

[23] 템플릿과 자주 사용되는 컨테이너들  (0) 2017.06.04
[22]npc 대화상자  (0) 2017.06.01
[20] Object  (0) 2017.05.22
0521  (0) 2017.05.21
[19] UE4 C++_tutorial 01  (0) 2017.05.21