득이공간

[네트웍 멀티플레이 프레임웍의 이해] 3장. RPC의 이해와 활용 본문

GP/UE5

[네트웍 멀티플레이 프레임웍의 이해] 3장. RPC의 이해와 활용

쟁득 2024. 7. 12. 19:45
해당 게시물은 이득우 교수님의 '네트웍 멀티플레이 프레임웍의 이해' 강의를 수강하며
학습한 내용을 개인적으로 정리한 글입니다.

📌 목차 - 3장. RPC의 이해와 활용

3-1. RPC 기초

3-2. 캐릭터 공격 구현

3-3. 캐릭터 공격 구현 개선


📌 3-1. RPC 기초

1. RPC 함수를 선언하는 방법과 기본 사용 방법의 이해
2. RPC 종류에 따른 동작 방식의 이해
3. RPC 사용시 주의할 점의 확인
4. 프로퍼티 리플리케이션과 NetMulticast RPC의 차이점 이해

 

  • 이번 강의에서 학습할 내용
    • RPC: 검증
  • RPC(Remote Procedure Call)이란?
    • 원격 프로시저(함수) 호출의 약자
    • 원격 컴퓨터에 있는 함수를 호출할 수 있도록 만든 통신 프로토콜
    • 네트웍 멀티플레이에서 서버와 클라이언트간에 빠르게 행동을 명령하고 정보를 주고받는데 사용
    • 언리얼 엔진에서 클라이언트에서 서버로 통신하는 유일한 수단을 제공한다.
  • RPC 요건 및 주의사항
    1. Actor에서 호출되어야 한다.
    2. Actor는 반드시 replicated여야 한다.
    3. 서버에서 호출되고 클라이언트에서 실행되는 RPC의 경우, 해당 Actor를 실제 소유하고 있는 클라이언트에서만 함수가 실행된다.
    4. 클라이언트에서 호출되고 서버에서 실행되는 RPC의 경우, 클라이언트는 RPC가 호출되는 Actor를 소유해야 한다.
    5. Multicast RPC는 예외다.
  • Client RPC 개요
    • 서버에서 클라이언트로 호출하는 RPC
    • 이를 활용해 특정 클라이언트에게만 명령을 보낼 수 있음
    • 서버에서 명령을 보낼 클라이언트의 커넥션을 소유한 액터를 사용해야 함 (AActor::GetNetConnection)
    • 서버: UFUNCTION(Client, Unreliable) ClientRPCFunction()
    • 클라: ClientRPCFunction()_Implementation()
  • Server RPC 개요
    • 클라이언트에서 서버로 호출하는 RPC
    • 언리얼 엔진 구조에서 유일하게 클라이언트가 서버의 함수를 호출할 수 있는 기능
    • 서버쪽에서 클라이언트의 명령을 검증할 수 있는 함수를 구현할 수 있음
    • Client RPC와 동일하게 서버와의 커넥션을 소유한 액터를 사용해야 함
    • 클라: UFUNCTION(Server, Unreliable, WithValidation) ServerRPCFunction()
    • 서버: ServerRPCFunction_Validate(), ServerRPCFunction_Implementation()
  • NetMulticast RPC 개요
    • 서버를 포함해 모든 플레이어에게 명령을 보내는 RPC
    • 프로퍼티 리플리케이션과 유사하게 연관성 기반으로 동작함 (커넥션을 소유하지 않아도 동작)
    • 프로퍼티 리플리케이션과 유사하지만 다른 용도로 사용
    • 서버: UFUNCTION(NetMulticast, Unreliable) MulticastRPCFunction(), MulticastRPCFunction_Implementation()
    • 클라1, 2: MulticastRPCFunction_Implementation()
  • RPC 선언에 관련된 키워드 정리
    • Unreliable: RPC 호출을 보장하지 않는 옵션. 빠름
    • Reliable: RPC 호출을 보장해주는 추가 옵션. 정말 필요할 때만 호출
    • WithValidation: 서버에서 검증 로직을 추가로 구현할 때 추가하는 옵션
    Client Unreliable WithValidation
    Server Reliable  
    NetMulticast    
  • RPC 사용시 주의할 점 정리
    • 각 RPC 종류마다 올바르게 사용할 것
      • Client, NetMulticast는 서버에서만 호출
      • Server는 클라이언트에서 호출하지만, 플레이어로 참여하는 리슨서버의 경우 호출 가능
      • Client, Server는 오너십을 가지고 있는 액터에서 호출
        • 컨트롤러: IsLocalController 함수
        • 폰: IsLocallyControlled 함수
    • Tick 및 빈번하게 호출되는 함수에 Reliable RPC를 사용하지 말 것
    • NetMulticast RPC의 잦은 사용은 네트웍 부하를 가중시키니 신중을 가할 것
    • 게임 플레이 및 액터 상태에 영향을 미치는 경우 RPC보다 프로퍼티 리플리케이션을 사용할 것
  • RPC 종류에 따른 동작 Matrix
    • 색상에 따라 기획에 맞게 사용하고 있는지 인지하면서 개발할 것
    • HasAuthority함수를 사용해 호출 지점에 대한 파악
    • IsLocalController 또는 IsLocallyControlled 함수를 사용해 오너십을 파악
    • 서버에서 RPC를 호출한 경우NetMulticast Server Client
      클라소유 ‘서버와 모든클라’ 서버에만 ‘소유한클라’
      서버소유 ‘서버와 모든클라’ ‘소유한서버’ 서버에만
      소유없음 ‘서버와 모든클라’ 서버에만 서버에만
    • 클라이언트에서 RPC를 호출한 경우NetMulticast Server Client
      호출한 클라소유 호출한 클라에만 ‘서버’ 호출한 클라에만
      다른 클라소유 호출한 클라에만 버려짐 호출한 클라에만
      서버소유 호출한 클라에만 버려짐 호출한 클라에만
      소유없음 호출한 클라에만 버려짐  
  • Property Replication vs NetMulticast RPC
    • 유사점
      • 서버와 모든 클라이언트의 지정한 함수를 호출할 수 있음
      • 지정한 데이터 전송을 보장할 수 있음
      • 액터의 오너십과 무관하게 연관성으로 동작함
    • 차이점
      • Property Replication으로 설정한 데이터는 클라이언트에 반드시 동기화됨 (RPC 전송의 Reliability와 다른 개념)
      • NetMulticast RPC를 호출한 타이밍에 클라이언트가 없으면 해당 데이터를 받을 길이 없음
    • 정리
      • Property Replication은 게임에 영향을 미치는 데이터에 사용함 (Gameplay Property)
      • NetMulticast RPC는 게임과 무관한 휘발성 데이터에 사용함 (Cosmetic)

📌 3-2. 캐릭터 공격 구현

1. 네트웍 멀티플레이어 구현의 기본 원칙의 이해
2. 네트웍 멀티플레이어에서 동작하는 캐릭터 공격 구현
3. 액터 컴포넌트 리플리케이션의 설정과 관련 이벤트 함수의 학습
4. 캐릭터의 체력 프로퍼티 동기화 구현
  • 이번 강의에서 학습할 내용
    • RPC: 신뢰성
  • 캐릭터의 공격 플로우
    • 액터와 애님 인스턴스 간에 수행되는 캐릭터의 공격 플로우
  • 네트웍 멀티플레이의 구현을 위한 4원칙
    1. 클라이언트의 명령은 Server RPC를 사용한다.
    2. 중요한 게임 플레이 판정은 서버에서 처리한다.
    3. 게임 플레이에 영향을 주는 중요한 정보는 프로퍼티 리플리케이션을 사용한다.
    4. 클라이언트의 시각적인 효과(Cosmetic)는 Client RPC와 Multicast RPC를 사용한다.
  • 액터 컴포넌트 리플리케이션
    • 언리얼에서 리플리케이션의 주체는 액터임
    • 액터가 소유하는 언리얼 오브젝트에 대해 리플리케이션 진행이 가능
      • 이를 통틀어 서브오브젝트(Subobject)라고도 함
    • 스탯을 관리하는 액터 컴포넌트의 리플리케이션 설정
      • 리플리케이션을 지정: SetIsReplicated(true)
      • 리플리케이션이 준비되면 호출되는 이벤트 함수: ReadyForReplication

📌 3-3. 캐릭터 공격 구현 개선

1. 네트웍 멀티플레이를 클라이언트의 반응성을 높이는 구조로 설계하는 방법의 학습
2. 강화된 클라이언트 역할에 맞서 서버쪽 검증 처리를 강화하는 방법의 학습
3. 네트웍 통싱 전송량을 줄이는 여러 기법의 학습

 

  • 이번 강의에서 학습할 내용
    • RPC: 검증
  • 캐릭터의 공격 구현의 문제점
    • 클라이언트의 모든 행동은 서버를 거친 후에 수행되도록 설계되어 있음
    • 통신 부하가 발생하는 경우 사용자 경험이 나빠짐
    • 의도적으로 패킷 랙을 발생시킨 후 이의 결과를 확인
    • DefaultEngine.ini
      • [PacketSimulationSettings] PktLag=500
  • 기존에 구현한 공격 기능의 리뷰
    • 랙이 발생하는 경우 클라이언트의 반응이 많이 느려지는 문제가 발생
  • 캐릭터 공격 구현의 개선
    • 기본 원칙
      1. 클라이언트의 명령은 Server RPC를 사용한다.
      2. 중요한 게임 플레이 판정은 서버에서 처리한다.
      3. 게임 플레이에 영향을 주는 중요한 정보는 프로퍼티 리플리케이션을 사용한다.
      4. 클라이언트의 시각적인 효과(Cosmetic)는 Client RPC와 Multicast RPC를 사용한다.
    • 개선점
      • 클라이언트에서 처리할 수 있는 기능은 최대한 클라이언트에서 직접 처리하여 반응성을 높인다.
      • 최종 판정은 서버에서 진행하되 다양한 로직을 활용해 자세하게 검증한다.
      • 네트웍 데이터 전송을 최소화한다.
  • 개선된 공격 기능의 설계
    • 클라이언트의 반응성을 개선하고 서버에서는 클라이언트의 요청을 검증을 통해 구현