ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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를 전송할 수 있다.

    이 부분은 사용하는 이유는 알았는데
    어떻게 사용하는지, 뭔소린지 이해가 잘 안간다.....

    반응형
Designed by Tistory.