【问题标题】:Mlapi RPC AttributesMlapi RPC 属性
【发布时间】:2021-09-26 06:16:48
【问题描述】:

我正在关注 Unity 中有关“Mlapi”的教程。在教程中,我在学习 RPC 时遇到了一个问题。

所以我的问题是

  1. 当我使用ServerRpc 属性创建方法时,'Mlapi' 如何处理该方法?根据“Mlapi”文档,调用ServerRpc 函数所需要做的只是使用参数进行直接函数调用。但是当我调用ServerRpc 标记的方法时会发生什么?我所做的只是调用ServerRpc 属性标记的方法。但是我写的ServerRpc 属性或其他Rpc 属性标记的'Mlapi' get 方法如何呢?以及“Mlapi”如何从客户端调用该方法并在另一台机器上执行?

【问题讨论】:

  • 您的目标是自己构建类似的东西吗?还是纯粹的兴趣?
  • 我最近构建了一个自定义的本地网络多用户,没有任何属性,您可以在远程设备上调用 any 方法.. 基本上使用反射。因此它有点慢。 attiebutes 基本上是两件事:一个混淆级别,让您更轻松,并且由于可用的方法预先注册了某个索引,因此调用它们会更快
  • 这只是纯粹的兴趣,但现在我想研究 RPC。如果可以的话,你能解释一下下面的评论吗?关于 RPC wrapper 是如何拦截方法调用的?
  • RPC 仅意味着“远程过程调用”.. 基本上它仅意味着“调用方法/在远程设备上执行某些代码”。有上千种方法可以做到这一点,例如通过 TCP 或 UDP 等...包装器不是 RPC 特定的,而是一般的 c# 事物;)如果您想要一个如何构建拦截器本身的好例子,请查看Transform setter interceptor,其中有人构建了一个编译后拦截器Transform 组件.. 基本上类似的事情也是由 RPC 属性完成的
  • 再次感谢您的回复!

标签: c# unity3d networking methods rpc


【解决方案1】:

RPC 是一个有据可查的概念。你应该查一些参考资料。 RPC 客户端将您的参数“编组”为可通过网络传输的格式,并将它们与告诉对方您正在调用哪个函数的信息一起发送。另一端的 RPC 服务器将这些参数“解组”回二进制结构并调用该函数。然后,它“编组”返回值并将其发送回客户端,并在客户端“解组”返回给您。

RPC 服务器知道它提供哪些服务,因此它不只是调用随机函数。

【讨论】:

  • 感谢您的回复!那么直接带参数调用函数调用RPC函数是不是真的调用了函数呢?看起来我正在调用该函数,但它不在我的本地机器上执行。那是如何工作的?他们如何在我的机器上调用该函数但不在我的机器上执行它,即使调用该函数看起来就像正常调用该函数?另外,是否有一些关于 RPC 实现的参考资料?我找不到好的参考资料。
  • 发生的情况是,作为编译后步骤,所有具有相应属性的方法都被收集(例如通过反射),并围绕它们构建一个包装器。因此,无论何时调用该方法,实际调用都会被 RPC 包装器拦截。然后基本上由于所有方法都以相同的编译顺序预存,每个设备“知道”哪个方法具有哪个索引以及哪个索引调用哪个方法..所以 RPC 基本上只发送到其他设备:“调用具有索引 X 的方法并通过在以下参数 Y 和 Z
  • 有一个“存根”库链接到您的本地可执行文件,其签名与您要调用的例程相同。您的本地函数调用会执行该存根函数,该函数会采取必要的步骤将参数传送到服务器机器。
  • @derHugo 感谢您的回复!回答您的上述评论,这只是纯粹的兴趣。但现在我想研究它。所以如果可以的话,你能向我解释一下上述评论吗?关于 RPC 包装器如何拦截方法调用,是否有一些关于 RPC 的参考资料可以帮助我?并感谢“时间罗伯茨”再次回答我!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-02
  • 1970-01-01
  • 2013-06-02
  • 1970-01-01
  • 2011-06-11
相关资源
最近更新 更多