언리얼 엔진 본캠프 19주차-2 언리얼 엔진 네트워크 : 최적화 - Actor Replication

정재훈·2025년 4월 22일
0

unreal engine

목록 보기
38/45

1. Relevancy & Dormancy

Actor Relevancy : Unreal은 각 Actor가 Client와의 관련 여부를 판단하고, 관련된 Actor만 Replicate

  • 기본은 거리 기반
  • NetCullDistanceSquared : 설정한 값 이내의 플레이어들에게만 해당 Actor를 Replication
    • 범위에 Pawn이 있다고 가정하면, 이 Pawn에 Possess한 PlayerController를 소유하고 있는 Client에게 Actor의 변경된 값을 알려줌
  • AlwaysRelevant : 거리에 상관없이 모든 플레이어에게 Replication

Dormancy(휴면) : 네트워크 관점에서 Actor를 "휴면"시키는 기능

  • 해당 Actor를 깨울 때까지 Replication 중지
  • defualt로 깨어있는 상태(Awake)
  • DormantAll, DormantPartial로 휴면
  • SetNetDormancy(), FlushNetDormancy()

Net Dormancy Flush

휴면 상태의 액터에서 AActor::FlushNetDormancy 를 호출하여 휴면 상태 액터의 변경사항을 리플리케이트할 수도 있습니다.
이렇게 하면 실제로 액터의 휴면 상태 스테이트를 변경하지 않고도 액터가 관련된 모든 연결에 대해 하나 이상의 업데이트를 강제로 리플리케이트합니다.

한 가지 예외가 있는데, AActor::NetDormancyENetDormancy::DORM_Initial로 설정된 액터에서 AActor::FlushNetDormancy를 호출하면, AActor::FlushNetDormancy호출에 따라 해당 액터의 휴면 상태가 ENetDormancy::DORM_DormantAll로 변경됩니다.

⚠️ 주의
Blueprint Actor 휴면 상태(Dormant)일 때, Replicated된 프로퍼티를 업데이트하면 Actor가 자동으로 AActor::FlushNetDormancy를 호출하며 다시 Awake 상태가 됩니다.

  • 테스트 해볼려고 Blueprint Actor 만들어서 해봤는데 안바뀜
  • 이게 1초마다 print string 하도록 해서 그런가? 리플리케이션하는 순간 Awake 상태가 되었다가 다시 DormantAll로 되는건가
    • 그러면 왜 주의하라는 건지 모르겠네;; 그냥 C++ 액터는 그 순간에도 Awake로 안바껴서 그런건가

▶️ Relevancy와 Dormancy를 조합해서 잘 사용하면, 네트워크 트래픽을 줄이는데 도움이 됨

Dormancy 예시로 한 번만 움직이는 문을 들었는데, 사실 한 번만 움직이고 더 이상 움직이지 않는다면, 변경되는 값이 없으니까 Replication도 안되는거 아닌가? 따지고 보면 Dormancy라는게 필요한가?
- 엔진 내부적으로는 Replication을 하기 위해 값이 변경이 되었는지 체크를 할건데, 이 체크하는 것도 연산임. Dormanct 상태로 만들어 놓으면, 이 체크 로직마저도 안하게 되니까 Actor가 많아지면 많아질수록 최적화할 때 필요

2. Update Rate 조절

앞에서 리플리케이션을 할 때, FastArray를 쓰거나, Condition을 달고, 큰 데이터는 쪼개고 등을 해서 리플리케이션을 효율적으로 하도록하였음.

이뿐 아니라 특정 데이터나 Actor의 Replication 주기를 조절할 수도 있음

  • NetUpdatedFrequency : 초당 최대 Replication 횟수
    • 최대 횟수가 보장되는 건 아님, 엔진에서 네트워크의 상황에 맞게 조절
    • MinNetUpdateFrequency : 최소로 이정도는 보장해라고 정한 횟수
  • NetPriority : 네트워크 Bandwidth가 부족할 때, 어떤 Actor를 우선 보낼지 결정하는 가중치
    • 네트워크의 상황에 따라 우선순위가 낮은 Actor의 Replication이 무시될 수 있음
  • Adaptive Frequency : Actor Replication 사용 빈도에 따라 자동으로 업데이트 주기를 조절
    // DefaultEngine.ini
    [SystemSettings]
    net.UseAdaptiveNetUpdateFrequency=1

3. Network Profiling

에디터 커맨드 창에 stat net명령어를 사용하면, 포괄적인 네트워크 상황을 볼 수 있음

좀 더 상세한 내용을 보고 싶으면 툴 사용(Network Insights)


4. Throttling 고려사항

Throttling : Replication 양이 너무 많아졌을 때, 실제 네트워크 상황에 맞게 그 양을 줄이는 것

CPU가 작업을 너무 과하게 해서 온도가 높아졌을 때, 강제로 성능을 죽이는 것을 쓰로틀링이라고 했었음능을 죽이는 것을 쓰로틀링이라고 했었음
  1. Update Rate 조절
    • 중요도가 낮거나, 게임에 영향이 적은 것들의 Update Rate를 줄이기
  2. 조건부 Replication
    • Rate는 줄여놓고, 필요할 때만 RPC를 사용
  3. 중요 시점 즉시 업데이트
    • RPC
    • ForceNetUpdate()
  4. 업데이트 속도와 물리/게임 로직의 틱 속도
    • Server의 FPS : 렌더링은 하지 않지만, 물리 연산/게임 로직 관련 연산에 따라 FPS 계산
    • Client의 FPS : 한 화면을 그리는 것을 기준으로 FPS 계산
      • Frequency가 100이어도 Server의 FPS가 30이면, 아무리 잘 보내도 최대 30번 밖에 못 보낼거임

▶️ Update Rate를 조절하는 것은 게임의 부드러움과 네트워크 Bandwidth 절약의 TradeOff

  • 게임의 상황에 맞게 어느 것을 가져가고 어느 것을 포기할지 결정
  • 네트워크 프로파일링을 통해, 실제 네트워크 부하를 보고 게임의 상황에 맞게 최적화







참조 사이트
1. https://dev.epicgames.com/documentation/en-us/unreal-engine/actor-relevancy-in-unreal-engine
2. https://dev.epicgames.com/documentation/ko-kr/unreal-engine/actor-network-dormancy-in-unreal-engine
3. https://dev.epicgames.com/community/learning/tutorials/K8vY/unreal-engine-optimizing-server-performance-with-net-dormancy
4. https://dev.epicgames.com/documentation/en-us/unreal-engine/actor-relevancy-and-priority?application_version=4.27

profile
드가자

0개의 댓글