-
RPC(원격 프로시저 호출 / Remote Procedure Calls) 란 무엇인가?TIL 2023. 10. 25. 21:35반응형
1#RPC(원격 프로시저 호출 / Remote Procedure Calls) 란 무엇인가
원격 컴퓨터(서버)에서 메서드를 호출하기 위해 사용하는 것이다.
2#RPC의 특징
1.RPC 호출에는 파라미터가 원하는 수만큼 포함될 수 있지만,
관련된 네트워크 대역폭이 파라미터 수와 크기에 따라 증가한다.
==>
즉, 호출 시에 데이터의 크기에 유의하여야 한다
2.RPC에는 일반 함수 호출과 달리 RPC 요청 수신자를 나타내는 추가 파라미터가 필요하다.
일반적인 RPC호출 모두를 예로 들자면
==>
연결된 모든 컴퓨터에서,
서버에서만,
RPC 호출을 전송하는 클라이언트를 제외한 모든 클라이언트에서
또는 특정 클라이언트에서
RPC 함수를 쉽게 호출할 수 있다.
3#RPC의 사용
함수를 원격 호출할 수 있으려면 먼저 RPC로 표시해야 한다.
이 작업은 스크립트의 함수 앞에 RPC 속성을 추가하여 수행한다.
C#에서의 예시를 들자면
==>
public class ExampleScript : MonoBehaviour {
[RPC]
void PrintText (string text)
{
Debug.Log(text);
}
*유의 사항으로 모든 네트워크 통신은 NetworkView 컴포넌트로 처리되므로,
RPC 함수를 선언하는 스크립트의 '오브젝트' 에 컴포넌트를 연결한 후에만
호출 할 수 있다.
4#RPC 파라미터 사용
1.파라미터(1)
다음 변수 타입을 RPC 파라미터로 사용할 수 있다.
int, float, string, NetworkPlayer, NetworkViewID, Vector3, Quaternion
예를들어, 단일 문자열 파라미터가 있는 RPC함수를 호출한다면
==>
using UnityEngine.Network;
using System.Collections;
public class ExampleScript : MonoBehaviour {
NetworkView networkView;
void Start() {
networkView = new NetworkView ();
networkView.RPC ("PrintText", RPCMode.All, "Hello world");
}
}
*위 예시 RPC()의
첫 번째 파라미터는 호출할 함수의 이름,
두 번째 파라미터는 함수가 호출될 타겟//각 사용자의 월드
이후의 파라미터는 RPC 함수에 전달되고, 네트워크를 통해 전송된다.
★두 번째 파라미터인 호출은 나중에 연결하는 클라이언트를 기다리기 위해서 버퍼링 되지 않는다.
이 경우는 아래에서 다룬다.(지금 뭔 내용인지 모름)
2.파라미터(2)
또한 추가 내부 파라미터인 NetworkMessageInfo 구조체에도 엑세스 할 수 있다.
구조체에는 RPC 호출의 발신 위치 같은 추가 정보가 있다.
이 정보는 자동으로 전달되므로 위의 PrintText 함수는 다음과 같이 선언될 수 있다.
예를들어
==>
using UnityEngine;
using System.Collections;
public class ExampleScript : MonoBehaviour {
[RPC]
void PrintText (string text, NetworkMessageInfo info)
{
Debug.Log(text + " from " + info.sender);
}
}
여기서 궁금한 부분이 생겼다. NetworkMessageInfo 구조체는 뭔가?
이 데이터 구조는 네트워크에서 방금 받은 메시지에 대한 정보를 포함하고 있다.
변수 구성으로는
networkView : 이 메시지를 보낸 NetworkView
sender : 이 네트워크 메시지를 보낸 플레이어(소유자)
timestamp : 메시지가 전송된 타임스탬프(초) // 즉 보내진 시간
가 존재하며 NetworkMessageInfo.networkView 로 사용할 수 있다.
결론적으로 위 예시에서
==>
info.sende 를 통해서 RPC 호출의 발신 위치 == 해당 메서드를 호출한 플레이어를 특정할 수 있게 된다
호출 방법은 이전과 같다.
*앞선 #3 RPC의 사용에서도 언급했듯이,
RPC 함수가 포함된 스크립트가 있는 게임 오브젝트에 NetworkView를 연결해야 한다.
★상태 동기화 없이 RPC만 사용하는 경우?(무슨 경우일까?)
네트워크 뷰에서 State Synchronization 을 Off 로 설정할 수 있다.
#번외-★에서 언급했던 버퍼링
RPC 버퍼
RPC 호출을 버퍼링할 수도 있다.
버퍼링한 RPC 호출은 연결하는 새 클라이언트에 각각 제공된 순서대로 저장 및 실행한다.
이 방법은 늦게 들어오는 플레이어가 시작하는 데 필요한 모든 정보를 얻도록 하는 데 유용하다.
일반적인 시나리오에서 게임에 참여하는 모든 플레이어가 특정 레벨을 먼저 로드해야 한다.
해당 레벨의 세부 사항을 연결된 모든 플레이어에게 보내면서, 미래에 참여할 누군가를 위해 버퍼링할 수 있다.
그러면 새로 참가한 플레이어가 처음부터 게임에 참여했던 것 처럼 레벨 정보를 수신하도록 할 수 있다.
필요한 경우 RPC 버퍼에서 호출을 제거할 수도 있다.
위의 글로 쓰여진 예제를 보면
==>
새로운 플레이어가 참여하는 시점에는 게임이 시작 레벨의 다음 레벨까지 진행했을 수 있다.
그러므로 버퍼링된 원래 RPC를 제거하고, 새로운 레벨을 요청하는 새 RPC를 전송할 수 있다.
이 부분은 사용하는 이유는 알았는데
어떻게 사용하는지, 뭔소린지 이해가 잘 안간다.....반응형'TIL' 카테고리의 다른 글
강의 - 디자인 패턴 - 빌더(빌드) 패턴 (0) 2023.10.27 유니티 - 비헤이비어 트리 : BT(Behavior Tree) 개념잡기 와 예시 (0) 2023.10.27 네트워크 게임을 개발하는데 필요한 이론적 배경-2 (0) 2023.10.24 네트워크 게임 개발 이론-1 (1) 2023.10.24 PUN2 - 네트워크 공부(강의 정리) (1) 2023.10.24