找回密码
 立即注册
查看: 5320|回复: 75

[学术/精华文章] RPC函数的原理

[复制链接]
发表于 2012-11-25 14:49 | 显示全部楼层 |阅读模式
Remote Procedure Calls(RPC)
也叫RPCs,远程过程调用通过网络在不同的机器上调用函数。这也包括玩家本地游戏实例。Client可以传送RPCsServer,Server也可以把RPCs传到一个或者多个Client上。最普遍的情况是,RPCs用于不是很频繁发生的动作。比如客户端开了一个开关想要开门,它可以传送一个RPCsServer告诉Server门已经打开了。然后Server可以传送另一个RPCs给所有Client,执行它们本地的函数将同一扇门打开。RPCs用于管理和执行独立的事件。
调用RPCs几乎和调用普通函数一样简单,但是仍然有一些重要的区别需要理解。
1.
一个RPC调用可以有任意多的参数。所有的参数当然都会被通过网络传送。越多的参数会让带宽使用越多。所以应该尽量减少参数。
2.
需要指定谁将要接收正在被送出的RPC。有几种RPC调用模式,概括了所有常见的情况。你可以在以下这些模式执行RPC函数:everyone,仅在server,除了自己外的everyone,一个指定的Client或玩家。
状态同步(State Synchronization)
状态同步用于共享不断变化的数据。最好的例子就是在一个动作游戏里一个玩家的位置信息。这个玩家总是移动,来回跑、跳跃、等等。即使是不需要控制他的网络中的其他玩家,也需要知道他在哪,在做什么。通过不断的传送关于这个玩家的位置信息,其他玩家就可以精确的表示这个玩家的位置。
这种数据通常定期的、频繁的通过网络传送。因为这种数据是时间敏感的,而且需要通过互联网管道从一个机器传到另一个机器上,所以尽可能的减少这种数据的传送量是非常重要的事情。简单的说,状态同步一般需要很多带宽,所以你应该做一切可能的尽可能减少带宽的使用量。
状态同步目前支持两种类型的传输的可靠性保证(reliability)。可靠的差值压缩(ReliableDelta Compressed)和非可靠(Unreliable)的方式。
可靠的基于差值压缩的方式(ReliableDelta Compressed)
可靠的差值压缩(Reliable Delta Compressed)模式会自动比较上次客户端接收到的消息。如果相对上次消息没有数据发生变化,就不传输数据。但是在它之上数据将在每个属性的基础上进行比较。举例来说就是,如果你的位置发生了变化但是方向没有变化。只有位置会被传送过来。
在这种模式下,Unity内部打包时在每个属性前增加1位决定是否发生了改变。如果没有改变,这个属性并不会包含在序列化的数据中从而节省了很多带宽。
Unity也会保证每个被送出的封包都会到达,在UDP丢包的情况下,它会重发这个封包,直到封包被接收到。这意味着如果一个包丢了,之后送出的封包在丢包重发并且收到之前不会被应用。在那以前,所有之后送出的封包将会放到一个缓冲中等待。
非可靠(Unreliable)
在非可靠的模式下,Unity不管当前的状态是否改变都会将其送出。状态不会被差值压缩传送,因为并不会知道送出的数据是否会实际到达接受者。
决定使用哪种方式
Unity的网络层使用UDP非可靠无序协议,但是却可以像TCP一样发送有序的可靠的封包。它内部使用ACKsNACKs控制封包的传输,确保没有丢包。但使用有序可靠的封包的缺点是如果一个封包丢了或者延误,所有东西都会停下等待直到那个封包安全到达。这在延时敏感的网络中传输时,会导致明显的延时。
非可靠的传输一般用于,你明确知道无论怎样每帧都会改变的数据。举例来说,在一个赛车游戏中,你可以认为玩家的车一直在运动。这种情况下,基于差值压缩的可靠传输除了增加了消耗并没有带来什么实质性的利益。
一般而言,当你知道数据一直在改变并且减小延时是至关重要的事情时,你应该使用非可靠的传输。如果被被Network View跟踪的数据并没有每帧都在改变,并且带宽对你来说很重要时,基于差值压缩的可靠传输更好。
明白延时和带宽不是同一件事情是十分重要的。它们是你在不同情况下想要优化的不同的属性。
使用C#Socket
因为Unity支持C#语言,所以可以在一个脚本对象中使用C#提供的套接字类,实现自定义的数据传输。这样做提供了很高的灵活性和控制能力,可以用Unity的客户端连接非Unity的服务器程序,反之亦然。
其他相关知识Master Server
Master Server是一个当前正在寻找客户端的活动的游戏
正在想要连接到游戏中的玩家客户端 见面的场所。它的另一个目的是隐藏IP地址、端口等细节信息,进行一系列的技术性操作工作,配置网络连接,有时候也可以在一些不太可能进行连接的情况下配置连接,比如说处理防火墙,或者NAT洞穿。
每个单独运行的游戏服务器为Master Server提供一个游戏类型(Game Type)所有具有相同游戏类型的游戏服务器被收集到一起,使得与他们兼容的客户端可以很方便的看见它们。当一个玩家连接并且请求Master Server一个匹配的游戏类型时,一些服务器上有用的信息就显示给这个玩家看。这就帮助玩家决定连接到哪个服务器。这些有用的信息包括:游戏名称(Game Name),玩家数量和是否需要密码。有两个传输这些信息的函数:Server的是[url=]MasterServer.RegisterHost()[/url],Client端的是[url=]MasterServer.RequestHostList()[/url].
示意图:

Network Views
Network Views是通过网络共享数据的组件。它们允许两种网络交互类型:状态同步(State Synchronization) 远程过程调用(Remote Procedure Calls)

当 你有很多客户端运行同一个游戏的时候,每个客户端有一组组成整个游戏的物体。为了让两个或更多的客户端看起来一样,这些物体需要通过共享数据来同步。这就 叫状态同步。同步每个物体的状态需要海量的数据,太多的需要通过网络传输的数据,让你的游戏无法运行。为了解决这个问题,Network Views通常指定什么数据需要被共享,什么物体需要同步。每一个Network Views监视一个物体的指定的一部分,保证它用其他客户端相同的物体同步。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2017-2-28 10:36 | 显示全部楼层
很不错
发表于 2017-2-28 10:06 | 显示全部楼层
真心顶
发表于 2017-2-28 10:53 | 显示全部楼层
难得一见的好帖
发表于 2017-2-28 10:07 | 显示全部楼层
很好哦
发表于 2017-2-28 10:30 | 显示全部楼层
LZ真是人才
发表于 2017-3-16 18:21 | 显示全部楼层
好帖就是要顶
发表于 2017-3-16 18:20 | 显示全部楼层
说的非常好
发表于 2017-3-16 18:06 | 显示全部楼层
很好哦
发表于 2017-3-16 17:52 | 显示全部楼层
不错不错
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-4-29 20:35 , Processed in 0.077583 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表