Mirror网络库 | 实战

此篇为下文,上篇:Mirror网络库 | 说明

一、官方实例说明

场景名 说明
AdditiveLevels 场景为“关卡”,附加形式加载
AdditiveScenes 加载卸载附加场景
Basic 基础的连接/断开,消息发送
Benchmark 服务器1000“怪物”生成性能测试
BenchmarkIdle TCP协议服务器5000“NPC”生成性能测试
CCU 服务器10000“怪物“生成性能测试
Chat 简单的聊天室
Discovery UDP广播查找并连接服务器
LagCompensation 延迟补偿
MultipleAdditiveScenes 多场景附加加载
MultipleMatches 多端匹配内置井字棋
Pong 乒乓球游戏
RigidbodyBenchmark 服务器2000”Server Ball"生成性能测试
RigidbodyPhysics 刚体物理模拟
Room 模拟大厅游戏的房间
Snapshot Interpolation 快照插值
SyncDirection 同步方向
Tanks / TanksCoop 坦克大战
VR 官方示例地址

以HostMode进行测试
多端测试工具

  • AdditiveLevels:以Offline作为启动场景,AdditiveLevelsNetworkManager的SceneManagement的OfflineScene和OnlineScene对应上示例的Offline和Online;选择附加(Additive Scenes)的场景为SubLevel1和SubLevel2。SubLevel1和SubLevel2中的Portal的DestinationScene选择对方。整体流程:Offline场景运行 -> 附加加载OnlineScene为“游戏环境”,SubLevel1和SubLevel2为“关卡”场景,默认显示SubLevel1(First is start scene) -> 移动到标有SubLevel1字样的物体,则切换到SubLevel2(关卡2),同理,移动到标有SubLevel2字样的物体,则切换到SubLevel1(关卡1)。
  • AdditiveScenes:以MainScene为启动场景,不需要设置OfflineScene和OnlineScene的默认“环境”,SubScenes中添加SubScene作为附加场景。整体流程:MainScene场景运行 -> 附加加载SubScene -> 移动到一定范围内重新LoadScene并且使用InterestManagement的距离类型过滤掉其他Observers。
  • Basic:BasicNetManager的OnServerAddPlayer和OnServerDisconnect监听Player.ResetPlayerNumbers方法,此方法标记了[ServerCallback]且为internal static,记录Player类的playerNumber从0递增,表示加入的“玩家编号”。Player类的OnStartServer中存储自身到容器,且设置color和data。至此,服务器改变了playerNumber、playerColor、playerData三者的值,通过SyncVar属性及hook钩子这些变量值变化时会触发对应的Method,而Method中包含了对应的事件调用。Player类中的OnStartClient中,对这些事件进行了PlayUI中的实际方法绑定及Invoke。整体流程:开启主机模式 -> 服务器为Player00,其Data每隔1秒在[100, 1000)之间切换 -> 加入一台客户端(玩家) -> 玩家为Player01,Data同样在1秒内切换一次。Stop则断开连接,对应的PlayerUI消失。
  • Benchmark:运行之后,Snapshot Interp这一块的参数值来自于NetworkClient的OnGUI,在NetworkManager(抽象类)的OnGUI中调用;timeline(经过快照插值处理后的远程服务器的时间)、buffer(时间快照数量)、DriftEMA(ExponentialMovingAverage:指数移动平均线。平均最后一秒的快照时间差)、DelTimeEMA(传输时间的指数移动平均线)、timescale(每个update中调整本地时间标尺)、BTM(存储的快照插值运行数据缓冲时间乘数)、RTT(消息从client->server->client的时间,单位:秒)、SendRate(消息发送间隔,单位:Hz,1/sendrate=ms,针对时间和值快照插值。这个是博主自己添加的一个参数打印) 。底部的Radius滑条是SpatialHashingInterestManagement的OnGUI,影响visRange,其CheckMode分为2D和3D两种模式。
  • BenchmarkIdle:TCP协议服务器生成完毕,编辑模式花费35秒;客户端加入花费2秒;传输数据方面客户端send大概在320-580B/s,recv大概在712KB/s-1.04MB/s;服务器send大概在1.04MB/s,recv大概在385B/s-704B/s。替换为KCPTransport后,数据基本没有倍数变化。
  • CCU:Client/Server Statistics这个是NetworkStatistics的OnGUI绘制的。这个生成好快!把BenchmarkIdle的Interleave从2改为10,结果生成花费的时间基本不变,因为这个参数只是改变了间隔距离,生成数量没变;换成KCP + DistanceInterestManagement花费时间没咋变化,fps有很大提升。这里生成时间能否节省?如果不能节省就提前生成?
  • Chat:有一个ChatAuthenticator,验证消息传递,用户登录,可以像Basic那样扩展离线通知。对于需要身份验证、保证消息可靠传递可以参考这个示例。
  • Discovery:WebGL不支持。开启udp循环广播,进行监听,查找可连接的服务器,请求连接。**扩展:服务器断开,那么客户端的Find Servers列表要响应清楚该Server。**这个可以应用在app查找可用服务?
  • LagCompensation:Fps games非常有用,避免明明瞄准了打的枪,结果敌方没死掉。通过存储player的快照,在不同的网络情况下,预测不同客户端的时间,算出对应时刻的玩家位置,再进行判定。
  • MultipleAdditiveScenes:这个和AdditiveScenes很像。设置MultiSceneNetManager的Instances(场景实例个数)和GameScene(场景),运行,会附加加载指定个数的指定场景。
  • MultipleMatches:这个有点像腾讯游戏大厅之类的下象棋游戏,任何一端可以创建一个房间,建房的端可以等进入房间的人都处于Ready状态时,就开始游戏。示例实现了一个简单的回合制井字棋游戏。
  • Pong:看到这里的时候,可以发现基本上就是NetworkBehaviour、NetworkManager、NetworkTransform这些东西整来整去,整个框架的使用应该时不难的,但是想看核心的东西也比较难吭,比如:如何做到双端一个工程,发布后逻辑自动划分的?为什么要带一个Mono.Cecil?Weaver是干嘛的?能不能快速替换Transoport以适应不同的网络、平台等情况?组件和常用核心代码的应用场景?
  • RigidbodyBenchmark:虽然只有2000个,相对前面的几万个来说比较少,但是这个好快!用了延迟模拟+SpatialHashingInterestManagement。这个才是正确使用方式么…
  • RigidbodyPhysics:案例没得ReadMe,咋一看NetworkManager也没有业务子类,上面也没啥可疑参数,ok,看Scripts找到按空格键施加一个向上的力这么一段代码。模拟的力有点假,特别是小球向上的力和重力抵消,快要消失的时候,太生硬了。
  • Room:这个和Lobby还是有点区别的,应该说默认就在房间,然后再ready->play,没有在大厅创建房间这一步。上面的MultipleMatches有建房间,且任意一端均可以。
  • Snapshot Interpolation:延迟补偿的原理因素之一。
  • SyncDirection:谁给谁做同步。HostMode把Player上的SyncDirection改为ServerToClient,然后空格改值,该值的变化会同步到Client端。示例用了SyncVar和SyncList这两个来做同步测试。这个案例虽然比较简单,但是可以解决**如何做到双端一个工程,发布后逻辑自动划分的?**这个问题。可以看看代码,路径还是挺清晰的。
  • Tanks / TanksCoop:坦克大战小游戏,就是不能后退有点蠢…可以看看ClientRpc的使用。

二、多路复用器测试(PC + Android + Webgl)

  • Tanks的sendRate = 120之后,PC发布包测试,RTT并没有到1,是我的工作电脑cpu不行么?哈哈
  • 本来想做个KCP+RPC+Lantency Simulation的功能测试,但是实例看完,这些都包含了,不做了。
  • 最后,整一个Multiplex测试~

MultiplexTransport:KcpTransport(PC + Android) + SimpleWebTransport(Webgl)
Mirror网络库 | 实战_第1张图片
NetworkManager -> MultiplexTransport -> KcpTransport(1) + SimpleWebTransport(2)
官方教程

  • PC + Android,借用官方示例的Chat示例,没有问题
  • webgl没有服务器测试…还要配置ssl(后面有机会补齐哈 …)
  • 如果想单纯的使unity和webgl交互,协议采用websocket,推荐用这个库:UnityWebSocket

你可能感兴趣的:(Frameworks,网络,Unity)