본문 바로가기

언리얼 개발자

[Unreal] Actor Dormancy & Network Profiling

참고 링크

https://velog.io/@hon454/NetDormancy-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%ED%9C%B4%EB%A9%B4-%EC%97%AC%EB%B6%80-%EC%9D%B4%ED%95%B4

* ENetDormancy의 Value들에 대한 설명은 이 링크에 잘되어 있습니다.

 

https://docs.unrealengine.com/4.27/en-US/InteractiveExperiences/Networking/NetworkProfiler/*

 

Network Profiler

Tool for displaying network traffic and performance information captured at runtime.

docs.unrealengine.com

 

https://docs.unrealengine.com/5.0/en-US/using-the-network-profiler-in-unreal-engine/

 

Network Profiler

Analyze network traffic and performance information captured at runtime.

docs.unrealengine.com

https://www.youtube.com/watch?v=mT8VUVuk-CY 

 

 Unreal의 Network Profiler를 써보고 싶은 겸 Actor의 Dormancy를 확인하고자 테스트를 해보았습니다.

변수 Replication Condition ( ELifetimeCondition ) 은 자주 써보았지만, Actor Dormancy는 개념만 알 뿐 사용해본 적이 없기 때문입니다.

 

* Unreal Network Profiler

단계1) Profiling file 만들기

    `키를 누른 후 NetProfile Enable 를 입력하면 네트워크 부하를 감지하기 시작합니다.

    `키를 누른 후 NetProfile Disable 를 입력하면 네트워크 부하 감지를 종료하며, 프로젝트폴더/Saved/Profiling/ 경로에 .nprof 확장자로 파일이 생성됩니다.

 

단계2) Network Profiler 사용하기

    엔진설치폴더\Engine\Binaries\DotNET\NetworkProfiler.exe 를 실행합니다.

    창 상단의 Open File을 눌러 단계1 에서 만든 .nprof 파일을 누릅니다.

 

* Actor Dormancy

 Dormancy 란 단어는 휴면, 비활동 상태를 뜻합니다. Unreal에서는 Dormancy 상태를 ENetDormancy 란 enum 을 통해 표현합니다. 이름에 'Net' 이 붙어있는 걸로 느낄 수 있듯이 싱글이 아닌 Network 관련 환경에서 유효합니다.

 

 제가 비교를 한 옵션은 DORM_AwakeDORM_DormantAll 두 가지 입니다.

전자는 지속적인 Property Replication이 일어나는 반면 후자는 휴면 상태로 Property Replication이 일어나지 않습니다.

DORM_DormantAll 상태의 Actor는 Replication이 필요한 경우 AActor::FlushNetDormancy() 를 직접 호출해주어야 합니다. 또한 Dormancy 상태 값은 변경되지 않기 때문에, 지속적으로 필요한 타이밍마다 매 번 호출해주어야 합니다. 이 번거로움을 감당하는 대신 분명 성능적으로 얻는 부분들이 있습니다.

 

* 테스트 환경

테스트 사진

* AMyTestEnemy

Rep 변수 :  COND_None 으로 세팅되어 있습니다.

- CurrentHP ( float ) / COND_None

NetUpdateFrequency : 10 ( 0.1초마다 업데이트 )

 

: 위 사진에서 초록색 구체에 해당하는 액터 클래스입니다. 플레이어에 의해 공격을 받을 수 있고 공격을 받을 시 CurrentHP가 감소합니다.

 

* 생성되는 AMyTestEnemy 개수 : 200개

* 플레이어의 공격 횟수 50회

* 네트워크 부하 검사 시간 60초

 

* 아래의 표는 위의 테스트 환경에서 AMyTestEnemy 객체 Network Profiling 결과입니다. 명확한 차이가 나는 항목들을 가져왔습니다.

Dormancy Count Time (ms) Update HZ Rep HZ Waste
DORM_Awake 105668 140.42 1766.71 4.03 99.77
DORM_DormantAll  455 2.03 7.55 3.38 55.16

* Count : 액터의 정보가 리플리케이트된 횟수

* Time : 리플리케이트된 정보를 보내는데 사용된 총 시간

* Waste : 리플리케이션 시스템이 프로퍼티 업데이트를 확인했을 때 변화가 없는 비율

                ( CPU가 리플리케이트되는 프로퍼티 값을 비교할 때 변화가 없는 비율 )

 

Waste 값은 (Rep HZ) / (Update HZ) 의 비율이 아닌가 싶습니다.

아래의 두 변수는 설명을 찾지 못해 예상되는 의미이며, 부정확합니다.

* Update HZ : 1초에 리플리케이션 업데이트를 시도한 횟수 ( ? )

* Rep HZ : 1초에 리플리케이션이 일어난 횟수 ( ? )

 

 

단순한 액터를 1분 간 돌렸을 뿐인데도 꽤 큰 차이가 납니다. 특정 이벤트에 의해서만 간헐적으로 동기화해주어야 하는 객체들의 경우 Dormancy를 통해 부하를 유의미하게 줄일 수 있을 듯 합니다.