참고 링크
* ENetDormancy의 Value들에 대한 설명은 이 링크에 잘되어 있습니다.
https://docs.unrealengine.com/4.27/en-US/InteractiveExperiences/Networking/NetworkProfiler/*
https://docs.unrealengine.com/5.0/en-US/using-the-network-profiler-in-unreal-engine/
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_Awake와 DORM_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를 통해 부하를 유의미하게 줄일 수 있을 듯 합니다.
'언리얼 개발자' 카테고리의 다른 글
[Unreal] ASC TryActivateAbility flow in dedicated server (0) | 2023.03.23 |
---|---|
[Unreal] NetExecutionPolicy in GameplayAbility (1) | 2023.03.10 |
[Unreal] Camera epic Learning (0) | 2023.02.18 |
[Unreal] AcknowledgedPawn (0) | 2023.01.19 |
[Unreal] Include Path 추가하기 (0) | 2022.12.29 |