Reliable과 Unreliable RPC 선택 기준
18강. Reliable과 Unreliable RPC 선택 기준
1. 이번 강의에서 해결할 문제
모든 RPC에 Reliable을 붙이면 안전해 보이지만 입력 반복이 신뢰 큐를 채워 이후 중요한 호출까지 지연시키거나 연결을 불안정하게 만들 수 있습니다. 반대로 매치 참가 승인처럼 한 번 빠지면 진행할 수 없는 요청을 Unreliable로 보내고 복구 경로도 없으면 사용자가 멈춥니다.
2. 학습 목표
3. 핵심 개념
Reliable RPC는 연결이 유지되는 동안 순서 있는 전달을 위해 재전송되지만 무제한 용량이 아닙니다. “확실히 중요”하다는 이유로 매 프레임 호출하면 앞선 패킷을 기다리는 동안 큐와 지연이 커집니다. Unreliable RPC는 손실될 수 있으므로 다음 업데이트나 Replicated 상태로 회복 가능한 고빈도·순간 사건에 적합합니다.
| 사례 | 기본 선택 | 이유·복구 |
|---|---|---|
| 준비 버튼 1회 | Reliable Server RPC | 사용자가 명시적으로 상태 전환 요청 |
| 상호작용 1회 | Reliable + 서버 중복 방지 | 놓치면 UX가 멈춤 |
| 자동 무기 발사 샘플 | Unreliable | 다음 입력·서버 상태로 회복, Rate Limit 필수 |
| 총구 효과 Multicast | Unreliable | 손실돼도 게임 상태 유지 |
| 체력·점수 | RPC가 아니라 Property | 최신 상태 수렴이 목적 |
4. 단계별 실습
UFUNCTION(Server, Reliable)
void Server_SetReady(bool bNewReady, uint32 RequestId);
UFUNCTION(Server, Unreliable)
void Server_UpdateAim(FVector_NetQuantizeNormal AimDirection, uint16 Sequence);
void ACaptureArenaPlayerController::Server_SetReady_Implementation(
bool bNewReady, uint32 RequestId)
{
ACaptureArenaPlayerState* PS = GetPlayerState<ACaptureArenaPlayerState>();
if (!PS || RequestId <= PS->GetLastReadyRequestId()) return;
PS->SetReadyOnServer(bNewReady, RequestId);
}
void ACaptureArenaPlayerController::Server_UpdateAim_Implementation(
FVector_NetQuantizeNormal AimDirection, uint16 Sequence)
{
if (!AimDirection.IsNormalized()) return;
if (!IsNewerAimSequence(Sequence)) return;
LatestServerAim = AimDirection;
}
Reliable도 UI 중복 클릭이나 재시도 구조 때문에 서버에서 RequestId를 기준으로 멱등성을 확보합니다. Unreliable Aim은 오래된 Sequence를 버리고 최신 방향만 보관합니다. 실제 CharacterMovement 입력을 이 RPC로 대체하지 않습니다.
5. 코드가 동작하는 이유
Ready는 낮은 빈도의 중요한 상태 전환이지만 최종 상태는 PlayerState에도 복제해 늦은 참가와 UI 재생성을 복구합니다. Aim 샘플은 최신 값만 의미 있으므로 손실된 과거 샘플을 기다리는 것보다 새 Sequence를 받아 갱신하는 편이 낫습니다. 신뢰도와 권위 검증은 별개라 두 RPC 모두 서버 검사를 거칩니다.
6. 자주 하는 실수와 해결법
7. 직접 실습
8. 이해 점검 질문 3개
9. 핵심 요약
Reliable과 Unreliable RPC 선택 기준 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.