UE5

점진적 가비지 컬렉션

뽀또치즈맛 2024. 11. 23. 20:20

 

점진적 가비지 컬렉션이란?

UObject를 위한 개선된 가비지 컬렉션 시스템이다.

 

언리얼 엔진은 마크 앤 스윕 가비지 컬렉터를 사용하여 UObject 메모리를 관리한다.

소프트 리얼 타임( soft-real-time ) 애플리케이션의 경우,

가비지 컬렉터에 한 가지 큰 단점이 있다.

가비지 컬렉터가 어떤 오브젝트의 메모리를 회수할 수 있는지 결정하는 동안

Gameplay hitches가 발생할 수 있다는 것이다.

 

UE에서는 이 프로세스를 도달 가능성 분석이라고 한다.

UE5는 항상 가비지 컬렉션의

이 단계가 한 프레임 내에 완료되도록 의존해 왔으며,

이로 인해 일시적으로 모든 UObject 처리가 중지된다.

 

도달 가능성 분석에서

스캔해야 할 오브젝트가 많을수록 일시정지 시간이 길어지고,

그 결과 가시적인 게임플레이 히치를 발생하기 충분조건을 만족하게 된다.

 

프로그래머는 다음과 같은 몇 가지 방법으로 이 문제를 해결할 수 있습니다.

  • keeping tight UObject budgets (UObject 사용량 엄격히 제한하기)

    생성하는 UObject의 수를 엄격히 관리하여,
    사용하지 않는 UObject를 줄여서
    가비지 컬렉션에서 스캔해야 하는 객체의 수를 최소화하는 방식이다.
    이를 통해 가비지 컬렉션의 작업 부하를 줄이고, 히치 발생 가능성을 낮출 수 있다.

  • using UObject pools (풀링 사용하기)

    UObject를 매번 새로 생성하고 삭제하는 대신,
    객체를 미리 생성해 풀(pool)에 저장해두고 재사용하는 방법이다.
    이렇게 하면 객체를 새로 생성하거나 삭제하지 않아도 되므로
    가비지 컬렉션의 부담을 줄일 수 있다.

  • disabling garbage collection during normal gameplay
    (일반적인 게임플레이 실행하는 동안 가비지 컬렉션 비활성화 하기)

    게임플레이 중에는 가비지 컬력션을 일시적으로 비활성화 시켜
    가비지 컬렉션이 원인이 되어 히치를 발생하는 것을 방지하는 방법이다.
    대신, 가비지 컬렉션은 로딩 화면이나 특정 이벤트 중과 같이
    플레이어가 히치를 느끼지 못할 때 실행된다.

그렇지만, 이러한 해결책을 사용하면 코드의 복잡도와

전체 프로젝트의 비용이 증가하게 된다.

 

점진적 도달 가능성 분석

 

UE는 점진적 도달 가능성 분석을 사용하여 이를 개선한다.

이제 사용자는 환경설정할 수 있는 프레임별 소프트 시간 제한을 사용하여

가비지 컬렉터의 도달 가능성 분석 단계를 여러 프레임에 걸쳐 분할할 수 있다.

 

언리얼 엔진은 TObjectPtr 프로퍼티를 통해

도달 가능성 반복작업 간의 UObject 레퍼렌스를 추적한다.

 

즉, 가비지 컬렉션이 진행되는 동안 TObjectPtr로 노출된

UPROPERTY에 대한 할당이 있을 경우,

가비지 컬렉션이 진행 중인 동안

해당 객체를 도달 가능(reachable) 상태로 즉시 표시한다는 뜻이다.

이러한 메커니즘을 가비지 컬렉션의 쓰기 장벽(write barrier)이라고도 한다.

 

엔진은 이미 UObject 또는 FGCObject, AddReferencedObjects 함수를

포함하여 가비지 컬렉터에 UObjects를 호출하는 모든 위치에서 

원시 C++ 포인터 대신 TObjectPtr을 사용하도록 변환되었다.

 

언리얼 엔진으로 빌드한 프로젝트에서

점진적 도달 가능성 분석을 사용하려면

모든 원시 C++ 대신 TObjectPtr을 사용하도록

UPROPERT 인스턴스를 변환해야 한다.

 

그렇지 않으면 가비지 컬렉션이 일부

UObject 메모리를 너무 일찍 회수할 수 있다.

 

이 기능은 초기에는 아직까지는 실험단계 기능으로 출시된.

왜냐하면 여전히 도달 가능성 분석 단계가

지정된 시간제한을 초과할 수 있기 때문이다.

 

점진적 도달 가능성 분석 활성화

 

다음 콘솔 변수를 프로젝트의 DefaultEngine.ini 파일에 추가하여

점진적 도달 가능성 분석을 활성화할 수 있다.

 

	[ConsoleVariables]
gc.AllowIncrementalReachability=1 ; enables Incremental Reachability Analysis
gc.AllowIncrementalGather=1 ; enables Incremental Gather Unreachable Objects
gc.IncrementalReachabilityTimeLimit=0.002 ; sets the soft time limit to 2ms

 

 

추가 콘솔 변수

 

스트레스 테스트(stress testing) 및

디버깅 목적으로 추가 콘솔 변수 세트도 제공된다.

 

 

 

++ Plus ++

Gameplay hitches란?
게임에서 짧고 눈에 띄는 성능 저하 현상을 뜻한다.

흔히 프레임이 갑자기 끊기거나 멈추는 느낌을 받을 때 

이를 히치라고 한다.

 

stress testing이란?

 

최대 부하 또는 극한 상황에서

어떻게 동작하는지 평가하기 위한 테스트 방식이다.

 

GC barrier

GC barrier에는 Write barrier가 있는데,

운영 체제에서 쓰기 장벽은 컴퓨터 시스템의

저장 시스템에 대한 쓰기 시퀀스에서 특정 순서를 적용하기 위한 메커즘이다.

예를 들어, 파일 시스템의 쓰기 장벽은 메모리 내 파일 시스템 상태가

올바른 순서로 영구 저장소에 쓰여디도록 보장하는 메커니즘이다.

++++++++

 

 

참고 사이트

https://engineering.linecorp.com/ko/blog/go-gc

https://en.wikipedia.org/wiki/Write_barrier

 

Write barrier - Wikipedia

From Wikipedia, the free encyclopedia In operating systems, write barrier is a mechanism for enforcing a particular ordering in a sequence of writes to a storage system in a computer system. For example, a write barrier in a file system is a mechanism (pro

en.wikipedia.org

 

 

Go 언어의 GC에 대해

 안녕하세요, LINE Ads Platform 개발을 담당하고 있는 Okada(@ocadaruma)입니다. 이번 포스팅에서는 개인적으로 쭉 관심있었던 Go 언어의 가비지 컬렉션(Garbage Collection, GC)에 대해 조사한 내용을 소개하겠

engineering.linecorp.com

https://dev.epicgames.com/documentation/ko-kr/unreal-engine/incremental-garbage-collection-in-unreal-engine#%EC%A0%90%EC%A7%84%EC%A0%81%EB%8F%84%EB%8B%AC%EA%B0%80%EB%8A%A5%EC%84%B1%EB%B6%84%EC%84%9D%ED%99%9C%EC%84%B1%ED%99%94

https://learn.microsoft.com/en-us/windows/iot/iot-enterprise/soft-real-time/soft-real-time

 

Soft Real-Time

Soft Real-Time on Windows 10 IoT Enterprise

learn.microsoft.com

https://medium.com/@MartinCracauer/generational-garbage-collection-write-barriers-write-protection-and-userfaultfd-2-8b0e796b8f7f

'UE5' 카테고리의 다른 글

언리얼 내부 - 모듈 (Modules) 2  (0) 2024.11.25
언리얼 내부 - 모듈 (Modules)  (0) 2024.11.25
UE5 하마치를 이용한 서버 열기  (0) 2024.10.22
서버 시작하기  (2) 2024.10.14
Tag를 활용한 Input 값 받아오기  (1) 2024.10.08