[开发者心得] 【RPC和Replicated】—— RPC介绍

[复制链接]
2300 |1
空伊伊 发表于 2023-3-21 11:03:52 | 显示全部楼层 |阅读模式
本帖最后由 空伊伊 于 2024-6-5 13:34 编辑

RPC和Replicated
所使用编辑器版本:Online_v0.27

目录

RPC介绍

RPC介绍

1.RPC是什么?
RPC(Remote Procedure Call)远程过程调用协议,一种通过网络从远程计算机上请求服务,而不需要了解底层网络技术的协议。对这个概念的详细解释,网上有很多相关教程,可以自行搜索了解更多
简单理解在口袋方舟编辑器中,客户端让服务端执行对应逻辑、服务端让客户端执行对应逻辑、服务端让所有客户端执行对应逻辑,这三种调用方式就能被称为RPC
Snipaste_2023-10-10_11-28-42.png

2.使用方式
2.1使用Event相关接口执行RPC
组合一:服务器监听客户端,客户端向服务器派发事件
if (SystemUtil.isServer()) {
    // EventName是事件名,通过事件名来区分对不同事件的监听
    // player是派发事件的客户端
    // params是派发事件的客户端发过来的参数
    Event.addClientListener("EventName", (player: Gameplay.Player, params) => {
        //doSomeThing~
    })
}

if (SystemUtil.isClient()) {
    // EventName是事件名,通过事件名来区分对不同事件的派发
    // params是参数,参数会发送给服务端
    Event.dispatchToServer("EventName",params)
}
组合二:客户端监听服务器,服务器向指定客户端派发事件
if (SystemUtil.isServer()) {
    // player是目标客户端,事件将会只派发给这个客户端
    // EventName是事件名,通过事件名来区分对不同事件的派发
    // params是参数,这个参数会传给player所在的客户端
    Event.dispatchToClient(player,"EventName",params)
}

if (SystemUtil.isClient()) {
    // EventName是事件名,通过事件名来区分对不同事件的监听
    Event.addServerListener("EventName", (params) => {
        //doSomeThing~
    })
}
组合三:客户端监听服务器,服务器向所有客户端派发事件
if (SystemUtil.isServer()) {
    // EventName是事件名,通过事件名来区分对不同事件的派发
    // params是参数,这个参数会传给房间内的所有客户端
    Event.dispatchToAllClient("EventName",params)
}

if (SystemUtil.isClient()) {
    // EventName是事件名,通过事件名来区分对不同事件的监听
    Event.addServerListener("EventName", (params) => {
        //doSomeThing~
    })
}

2.2使用装饰器标记一个函数,然后让函数执行RPC
知识点补充:装饰器(Decorator)
装饰器是一种设计模式的体现,可以想像成是一个wrapper,包裹在类声明、方法、属性或者参数 等目标上。它可以对包裹的目标做特定的处理。通过装饰器可以在不修改业务代码的情况下,在目标执行前后做特定操作,同时也可把重复的逻辑切分出去(AOP)。


使用装饰器执行RPC的前提:RPC方法必须声明在继承Script的脚本当中
下面展示三种装饰器的使用方式:
方式一:将函数标记为,客户端调用,服务端生效
@RemoteFunction(Server)
printOnServer() {
    console.log("run on Server")
}
方式二:将函数标记为,服务端调用,指定客户端生效
@RemoteFunction(Client)
printOnClient(player: Player) {
    console.log("run on Client")
}
方式三:将函数标记为,服务端调用,所有客户端生效
@RemoteFunction(Client, Multicast)
printOnAllClient() {
    console.log("run on all Client")
}

2.3补充:Event执行RPC与装饰器执行RPC的区别
相同点:在底层实现上都是一样的逻辑,不存在谁封装谁的关系,都是发一条rpc。
不同点:用装饰器来执行RPC,必须得保证方法是申明在继承Script的脚本里,否则不会生效

3.RPC注意事项
●单次RPC最大只支持64KB的数据进行传输RPC过程中单个数组要保证所有元素是同一类型
RPC传参只支持一维数组,二维及以上数组不支持
●参数支持类型:String Boolean Number null undefined Vector2 Vector Vector4 LinearColor Rotation Transform GameObject 和 符合Type规范的自定义类型 以及这些类型的一维数组,确定不会支持的类型有多维数组和Set&Map类型。
●RPC过程中不要有转化string的操作
●当前版本RPC单个数组数量最多1000个元素
●定时调用RPC会存在可靠栈溢出的风险,客户端切后台、播广播和息屏可能会有掉线的情况
●调用RPC频率过高,会导致断线重连!
【断线重连宝典】断线重连产生的原因以及应对措施 - 资源/心得分享 创作者论坛 (ark.online)


4.使用案例






回复

使用道具 举报

忆倾城 发表于 2023-3-28 18:17:07 | 显示全部楼层
感谢,讲的很清楚,终于等到了rpc介绍。
回复

使用道具 举报

热门版块
快速回复 返回顶部 返回列表