RPC, Property Replication

김혁·2025년 8월 25일

RPC ( Remote Procedure Call )

개념

  • 일반적으로 클라이언트와 서버는 서로 다른 메모리 공간과 실행 환경을 가지고 있음
  • RPC는 네트워크 환경에서 서버와 클라이언트가 함수 호출을 동기화하는 메커니즘
  • 즉, 호출하는 PC와 실행하는 PC가 달라도 되게끔 해주는 통신 기법

동작 원리

  1. RPC는 패킷 단위로 직렬화되어 네트워크를 통해 전송됨
  2. 서버나 클라이언트가 해당 객체의 NetDriver와 Channel을 통해 호출 정보를 받음
  3. 언리얼 네트워크 레이어가 함수 시그니처를 확인하고 해당 객체에 함수를 실행시킴

RPC 종류

1. NetMulticast

  • 서버 -> 모든 클라이언트에게 브로드캐스트 호출
  • 예 : 서버가 "폭발 발생" 처리 -> 모든 클라이언트가 같은 이펙트 재생

2. Server

  • 클라이언트 -> 서버로 요청을 보낼 때 사용
  • 예 : 클라이언트가 "총을 발사했다" 입력 -> 서버에서 총알 스폰 처리

3. Client

  • 서버 -> 특정 클라이언트에게 호출
  • 예 : 서버가 "보스가 공격한다" -> 해당 클라이언트 화면에 이펙트 보여주기

RPC의 다양한 케이스

Call vs Invoke

  • Call
    • 정적인 의미를 가짐
    • 컴파일 타임에 어떤 함수인지, 호출하는 곳과 실행하는 곳이 정해져야 함
    • 직접적으로 함수를 호출하고 실행해야 함 (Direct)
  • Invoke
    • 동적인 의미를 가짐
    • 런타임에 어떤 함수인지, 호출하는 곳과 실행하는 곳이 어딘지 정해짐
    • 함수 포인터, 동적 바인딩, RPC 같은 개념들이 해당됨
    • 간접적으로 함수를 호출하고 실행해야 함 (Indirect)

다양한 케이스들

  • Actor ownership
    • 네트워크 멀티플레이가 적용되려면, 액터는 서버에서 스폰되고, bReplicatedtrue여야 함
    • Client-owned actor : PlayerControllerLocal PlayerController와 같은 경우
      • 서버에서 스폰된 후 SetOwner(PlayerController) 함수를 호출해야 Client-Owned-Actor가 됨
    • Owned by different client : PlayerControllerLocal PlayerController와 다른 경우
    • Server-owned actor : 서버에서 스폰되었지만 SetOwner() 함수 호출이 없는 경우
  • NetMulticast, Server, Client : 해당 PC에서 스폰해달라는 키워드
  • 자주 쓰이는 케이스들
    • RPC가 클라이언트에서 호출되고 서버에서 실행되어야 하는 경우 (Server 키워드)
      • ClientConnection이 소유하고 있는 액터에서 RPC가 호출되어야 함
      • _Validate() 함수에서 RPC를 실행할지 말지 결정
    • RPC가 서버와 모든 클라이언트에서 실행되어야 하는 경우 (NetMulticast 키워드)
      • 서버에서 호출해야 함
      • 부하가 심하기 때문에, 빈번하게 호출되게 하는 코드는 안 됨
    • RPC가 서버에서 호출되고 클라이언트에서 실행되어야 하는 경우 (Client 키워드)
      • 서버에서 호출해야 함

WithValidation

  • 클라이언트 -> 서버로 보내는 Server RPC는 보안상 신뢰할 수 없음
  • UE4 초반에 사용한 방법으로 서버에서 유효성 검증 함수를 자동으로 강제할 수 있음
  • _Implementation()_Validate() 함수 시그니처를 요구
  • _Validate()에서 클라이언트 요청이 정상인지 검사, _Implementation()에서 실제 RPC 동작
  • 현재는 Deprecated되었고, 함수 안에서 직접 권한 확인과 유효성 체크를 함

Reliable vs Unreliable

  • Reliable
    • 신뢰성 무조건 보장 : RPC 호출이 반드시 도착하도록 엔진이 보장
    • 순서 보장 : 먼저 보낸 것이 나중에 보낸 것보다 먼저 실행됨
    • 사용하는 예시 : 중요한 동작 (무기 발사 요청, 캐릭터 스폰 등)
    • 단점 : 패킷 손실이 발생하면, 다시 전송 -> 지연 발생 가능
  • Unreliable
    • 최대한 보냄 : 패킷이 손실되면 그냥 무시됨
    • 순서 보장 X
    • 장점 : 성능 효율적, 딜레이 누적 방지
    • 사용하는 예시 : 자주 보내지만 중요하지 않은 동작 (캐릭터의 위치 업데이트, 총알 궤적 이펙트)


Property Replication

개념

  • 멀티플레이 환경에서 서버의 변수 값을 클라이언트와 동기화하는 기능
  • 서버가 Authority 상태에서 변수 값을 바꾸면, 엔진이 알아서 클라이언트로 전파함

동작 원리

  • UPROPERTY에 Replication 옵션을 주면, 서버에서 값이 바뀔 때마다 클라이언트에게 자동 동기화
  • 복제는 패킷 최적화를 거쳐, 바뀐 값만 전송됨 (Delta Serialization)

설정 방법

  1. 액터의 bReplicates 속성을 true로 설정
  2. 네트워크로 복제할 액터의 속성에 Replicated 키워드 추가
  3. GetLifetimeReplicatedProps() 함수에 네트워크로 복제할 속성 추가
    • DOREPLIFETIME 매크로를 사용해 복제할 속성을 명시
  • 클라이언트에서 값이 갱신될 때 실행되는 콜백을 붙일 수도 있음 (ReplicatedUsing 키워드)
  • 특정 조건에서만 값이 복제되도록 할 수 있음 (Cond 키워드)


출처 : 팀스파르타 내일배움캠프, 언리얼엔진 공식문서
profile
게임 개발자를 향해..

0개의 댓글