8. RPC 기초
RPC란?
- RPC (Remote Procedure Call) 는 로컬에서 호출되지만 (호출하는 머신과는) 다른 머신에서 원격 실행되는 함수
- 원격 컴퓨터에 있는 함수를 호출할 수 있는 통신 프로토콜
- 네트웍 멀티플레이에서 서버-클라이언트 간 빠르게 행동을 명령하고 정보를 주고받는데 사용
- 언리얼 엔진에서 클라이언트→서버 통신하는 유일한 수단.
RPC의 주요 용도:
- 장식이나 휘발성인 비신뢰성 게임플레이 이벤트를 위한 기능
- 사운드 재생, 파티클 스폰, 일시적 효과를 포함
- 휘발적이지 않은 것들은 프로퍼티 리플리케이션을 써야함
종류:
UFUNCTION(Client)void ClientRPC();UFUNCTION(Server)void ServerRPC();UFUNCTION(NetMulticast)void MulticastRPC();RPC 의 정상 작동을 위해 충족시켜야 하는 요건:
- Actor 에서 호출되어야 합니다.
- Actor 는 빈드시 replicated 여야 합니다.
- 서버에서 호출되고 클라이언트에서 실행되는 RPC 의 경우, 해당 Actor 를 실제 소유하고 있는 클라이언트에서만 함수가 실행됩니다.
- 클라이언트에서 호출되고 서버에서 실행되는 RPC 의 경우, 클라이언트는 RPC 가 호출되는 Actor 를 소유해야 합니다.
- Multicast RPC 는 예외입니다:
- 서버에서 호출되는 경우, 서버에서는 로컬에서 실행될 뿐만 아니라 현재 연결된 모든 클라이언트에서도 실행됩니다.
- 클라이언트에서 호출되는 경우, 로컬에서만 실행되며, 서버에서는 실행되지 않습니다.
- 현재 멀티캐스트 이벤트에 대해 단순한 스로틀 조절 메카니즘이 있습니다. 멀티캐스트 함수는 주어진 액터의 네트워크 업데이트 기간동안 두 번 이상 리플리케이트되지 않습니다. 장기적으로 크로스 채널 트래픽 관리 및 스로틀 조절 지원을 개선시킬 계획입니다.

RPC의 신뢰성
| Metadata Specifier | Description | Order of Execution |
|---|---|---|
Reliable | This RPC is re-sent until it is acknowledged by the receiver. All subsequent RPC executions are suspended until this RPC is acknowledged. | Guaranteed in order. |
Unreliable | This RPC is not executed if the packet is dropped. | No order guarantee. |
| Reliable이어도 TCP인건 아님. 대부분 UDP로 구현돼있음. Reliable은 무거우므로(수신했는지 확인해야하기 때문) 남용하면 안됨 |
Client RPC 개요
- 서버에서 클라이언트로 호출하는 RPC
- 특정 클라이언트에만 명령을 보낼 수 있음
- 서버에서 명령을 보낼 클라이언트의 커넥션을 소유한 액터를 사용해야함(
AActor::GetNetConnection)
Server RPC 개요
- 클라이언트에서 서버로 호출하는 RPC
- 언리얼에서 유일하게 클라이언트가 서버로 요청할 수 있는 통로
- 서버쪽에서 클라이언트의 명령을 '검증'할 함수를 구현해야 함
- Client RPC와 동일하게 서버와의 커넥션을 소유한 액터를 사용해야함
NetMulticast RPC 개요
- 서버를 포함해 모든 플레이어에게 명령을 보내는 RPC
- 프로퍼티 리플리케이션과 유사하게 연관성 기반으로 동작함(커넥션 소유하지 않아도 동작)
- 프로퍼티 리플리케이션과는 다른 용도로 사용함
RPC 사용 주의점
- Client, NetMulticast는 서버에서만 호출
- Server는 클라이언트에서 호출하지만 플레이어로 참여하는 리슨서버면 서버에서도 호출 가능(리슨서버 호스트도 서버이자 동시에 클라이언트이므로)
- Client, Server는 오너십을 가지고 있는 액터에서 호출
- Controller 오너십 확인 =
IsLocalController() - Pawn 오너십 확인 =
IsLocallyControlled()
- Controller 오너십 확인 =
- Tick 및 빈번하게 호출되는 함수에 Reliable RPC 사용 자제
- NetMulticast RPC의 잦은 사용은 네트웍 부하를 가중시키므로 신중할 것
- 게임 플레이 및 액터 상태에 영향을 미칠 경우 RPC보단 프로퍼티 리플리케이션이 더 나음
Property Replication vs. NetMulticast RPC 유사점
- 서버와 모든 클라이언트의 지정된 함수 호출 가능
- 지정한 데이터 '전송' 보장 가능
- 액터의 오너십과 무관하게 연관성만 있으면 동작함
차이점
- Property Replication으로 설정한 데이터는 반드시 클라이언트에 동기화됨(나중에 접속하더라도)
- NetMulticast RPC는 호출한 타이밍에 클라이언트가 없으면 데이터를 받을 길이 없음(수신 보장 x)
- 네트웍 상태에 따라 RPC는 유실될 수 있음