Mirror网络库 | 实战

news2024/12/30 1:42:01

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

一、官方实例说明

场景名说明
AdditiveLevels场景为“关卡”,附加形式加载
AdditiveScenes加载卸载附加场景
Basic基础的连接/断开,消息发送
Benchmark服务器1000“怪物”生成性能测试
BenchmarkIdleTCP协议服务器5000“NPC”生成性能测试
CCU服务器10000“怪物“生成性能测试
Chat简单的聊天室
DiscoveryUDP广播查找并连接服务器
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)
在这里插入图片描述
NetworkManager -> MultiplexTransport -> KcpTransport(1) + SimpleWebTransport(2)
官方教程

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/878642.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Jenkins-CICD-python/Java包升级与回退

Jenkins- CICD流水线 python/Java代码升级与回退 1、执行思路 1.1、代码升级 jenkins上点击 upgrade和 代码版本号 --${tag} jenkins 推送 代码 和 执行脚本 到目标服务器/opt目录下 执行命令 sh run.sh 代码名称 版本号 upgrade 版本号 来自jenkins的 构建参数中的 标签…

自然语言处理: 第八章chatGPT的搭建

理论基础 Transformer 大模型家族可以分成三类, 至于三者的区别可以参考上一章: Encoder-only,Decoder-only, 只需要Pre_trainEncoder-decoder , 可以在一些任务上无需进行fine_tune 必须要在下游任务进行微调比如Bert , Bart 。 T5 这种无需要微调就能完成一些任…

使用Edge和chrom扩展工具(GoFullPage)实现整页面截图或生成PDF文件

插件GoFullPage下载:点击免费下载 如果在浏览网页时,有需要整个页面截图或导出PDF文件的需求,这里分享一个Edge浏览器的扩展插件:GoFullPage。 这个工具可以一键实现页面从上到下滚动并截取。 一、打开“管理扩展”(…

分类过程中的一种短程相互作用

( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有3个节点,AB训练集各由6张二值化的图片组成,让A,B中各有3个点,且不重合,统计迭代次数并排序。 其中有10组数据 差值结构 迭代次数 构造平均列A 构造平均列AB…

JavaFx基础学习【四】:UI控件的通用属性

一、介绍 Node,就是节点,在整体结构中,就是黄色那一块,红色也算 个人理解,在实际中,Node可以说是我们的UI页面上的每一个节点了,比如按钮、标签之类的控件,而这些控件,大…

解决电脑声音正常但就是某些游戏没声音问题

电脑声音正常,玩普遍游戏也正常,就有游戏不出声音 详细介绍经过,不喜欢的请直接跳 第三部分。 一、先说下起因现象。 1 大富翁11 没声音。 前段时间无聊怀旧就买了个大富翁11玩玩,近二十年前的老台式机正常无问题。后来想在性能…

网络安全 Day31-运维安全项目-容器架构下

容器架构下 6. Dockerfile6.1 Docker自动化DIY镜像之Dockerfile1) 环境准备2) 书写Dockerfile内容3) 运行Dockerfile生成镜像4) 运行容器5) 小结 6.2 案例14:Dockerfile-RUN指令1) 书写Dockerfile2) 构建镜像3) 启动容器4) 测试结果 6.3 Dockerfile指令 …

CMake教程6:调用lib、dll

之前我们学到了如何编写一个可执行程序和Library,在继续学习之前,需要解释下target,在cmake中我们可以给executable和library设置一个target名字,这样可以方便我们在后续对target进行更加详细的属性设置。 本节我们将学习如何在项…

Python学习笔记_基础篇_数据类型之字符串

一.基本数据类型 整数:int 字符串:str(注:\t等于一个tab键) 布尔值: bool 列表:list 列表用[] 元祖:tuple 元祖用() 字典:dict 注:所有的数据类型都存在想对应…

jar包的解压缩和压缩后重新运行,报错:xxx.jar中没有主清单属性

同学们可以私信我加入学习群! 正文开始 前言一、手动模拟过程定位问题二、jdk提供的jar包压缩工具总结 前言 我使用插件yauzl把jar包解压缩、修改properties、压缩后,发现新的jar包无法运行,提示:xxx.jar中没有主清单属性 然后通…

安装Linux操作系统CentOS 6详细图文步骤

为满足业务对Linux操作系统部署的要求,本文档主要提供CentOS 6操作系统的最小化安装和基本配置, 安装本系统建议最少1GB内存和2GB磁盘空间。 1、 使用光盘或者挂载ISO镜像,在出现如下图形界面时选择【Install or upgrade an existing system】并按Ent…

互联网发展历程:探究主机连接与网线的重要角色

互联网,这个如今贯穿我们日常生活的巨大网络,已经从最初的萌芽发展成为信息交流、商务、娱乐等多个领域的核心。它的发展历程却是一个漫长而精彩的故事。本文将带您回顾互联网的发展,深入探讨最基础的部分:如何将两台主机连接起来…

【Linux命令详解 | chown命令】 chown命令用于修改文件或目录的所有者,常与chmod一起使用

文章标题 简介一,参数列表二,使用介绍1. 更改文件的所有者2. 递归地更改目录及其内容的所有者3. 使用--from参数改变所有者4. 使用--reference参数参考其他文件或目录的所有者5. 获取帮助信息和版本信息 总结 简介 在Linux系统中,chown命令被…

算法与数据结构(二十四)最优子结构原理和 dp 数组遍历方向

注:此文只在个人总结 labuladong 动态规划框架,仅限于学习交流,版权归原作者所有; 本文是两年前发的 动态规划答疑篇open in new window 的修订版,根据我的不断学习总结以及读者的评论反馈,我给扩展了更多…

企业数字化转型:无形资产占比测算(2007-2021年)

在本次数据中,参考张永珅老师的做法,利用无形资产占比测算数字化转型程度。 一、数据介绍 数据名称:企业数字化转型:无形资产占比 数据年份:2007-2021年 样本数量:32960条 数据说明:包括数…

面试热题(缺失的第一个正数)

给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 输入:nums [1,2,0] 输出:3 尝试的路途是痛苦的,不断的尝试新方法,错何尝…

嵌入式Linux开发实操(八):UART串口开发

串口可以说是非常好用的一个接口,它同USB、CAN、I2C、SPI等接口一样,为SOC/MCU构建了丰富的接口功能。那么在嵌入式linux中又是如何搭建和使用UART接口的呢? 一、Console接口即ttyS0 ttyS0通常做为u-boot(bootloader的一种,像是Windows的BIOS),它需要一个交互界面,一般…

开源数据库Mysql_DBA运维实战 (DCL/日志)

SQL(Structured Query Language 即结构化查询语言) a.DDL语句 数据库定义语言: 数据库,表,视图,索引,存储过程,函数,创建删除ALTER(CREATE DROP ALTER) b.DML语句 数…

Mybatis 简单试用

1. 创建项目 IDEA创建一个基本的maven项目。 导入依赖&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xs…

测试人进阶技能:单元测试报告应用指南

为什么需要单元测试 从产品角度而言&#xff0c;常规的功能测试、系统测试都是站在产品局部或全局功能进行测试&#xff0c;能够很好地与用户的需要相结合&#xff0c;但是缺乏了对产品研发细节&#xff08;特别是代码细节的理解&#xff09;。 从测试人员角度而言&#xff0…