Mirror学习笔记(一) 简介

news2024/11/16 7:32:57

在这里插入图片描述

文章目录

  • 一、常规学习:
      • Mirror核心功能有
      • 服务器和主机
  • 二、时间戳批处理
      • 时间戳
  • 三、TCP和UDP
  • 四、CCU(同时在线人数)
  • 五、SyncDirection(同步方向)
  • 六、RTT(往返时间)
  • 七、Connection Quality(连接质量)
  • 八、Lag Compensation(滞后补偿)
      • 一、独立算法类LagCompensation.cs
      • 二、Log Compensator组件
  • 九、Client Side Prediction(客户端预测)
  • 十、History Bounds(历史边界)


一、常规学习:

Mirror是一个用于Unity多人游戏的功能系统。它允许在其中一个参与者同时承担服务器的功能,因此不需要专用的服务器进程从而减少了开发人员的工作量。

Mirror核心功能有

1.消息处理程序
2.通用高性能序列化
3.分布式对像管理
4.状态同步
5.服务器与客户端的各种链接等.

服务器和主机

1.服务器是游戏的一个实例,所有客户端与其链接。由服务器对数据进行处理并回传给各客户端展示。
2.服务器可以是“专用服务器”也可以是“主机服务器”。
“专用服务器”仅作为服务器支行游戏实例。
“主机服务器 “当没有专用服务器时,即充当服务器也充当客户端。
下图代表了三个玩家。在游戏充当了主机也就是本地客户端,并且两者在同一客户端支行。另外两个是远程客户端。
在这里插入图片描述

因为主机与本地服务器在同一进程中,因而可以使用“特殊”的通讯方便直接调用方法和消息。
远端客户端则通过常规的网络通讯与服务器交互,Mirror会自动处理这些工作。

多人游戏系统目标之一是使服务端、客户端代码相同。因而多数时候你只需要考虑一种类型的客户端,Mirror将会自动处理差异。

二、时间戳批处理

你发送的每条消息将被批处理直至当前帧结束,以最大程度的减少传输的消耗。消息中将会把大量的小消息合并为一条进行发送。
客户端和服务端都会进行批处理以最大化的减少性能消耗。

时间戳

确保远程发送消息的时序性,接收到消息后对他们之间进行插值。可以准确的知道物在服务器上,何时处于何处。
早期版本通过NetworkTransform来实现,成本巨大因为需要包含一个4字节(float),甚至8字节(double),当在大型游戏中时,宽带压力会迅速增加。
而NetworkTransform只是其中一种组件,其他的组件也可能需要时间戳,这将进一步增加宽带消耗。
为了减轻宽带压力,Mirror每个批次都包含8个字节,但并不是每条消息都包含,而是每1200个字节批出来一次,这有效减轻了宽带压力。

在客户机上,所有对象数据都以消息/批处理的形式从服务器到达。因此,在任何给定的时间,您都可以发现对象的Rpc/OnDeserialize/OnMessage处理程序何时由服务器通过NetworkClient.connection.remoteTimeStamp发送。

在服务器上,只有玩家拥有的对像才能于家连接中获得消息。因此,在任何时间,您都可以找到对像的Cmd/OnDeserialize/OnMessage处理程序,由客户端能过connectionToClient.remoteTimeStam发送

三、TCP和UDP

TPC由1970年开发,UDP由1980年引入,TCP内靠性,时序性,但延迟较高,UDP反之。

四、CCU(同时在线人数)

Mirror 可以处理多少个CCU,通常来说每个地图可以处理200CCU,但理论上是可以达到1000个。
官方尝试了一些项目480CCU时已有些卡顿,同时3D比2D的开销会更大。

五、SyncDirection(同步方向)

Mirror新增了SyncDirection功能
在这里插入图片描述

Mirror 中通常从服务器同步到客户端,但某些组件(如:NetworkTransform)需要在客户权限的情况下同步到服务器,因为OnSerialize只会从服务器到客户端,这里有几个缺点:
1.同时进行OnSerialize和手动远程调用需要大量的额外代码
2.会有额外宽带消耗,因每个命令包含一个函数哈希
3.间隔需要手动实现,因为syncInterval仅适用于OnSerialize.
因此OnSerialize提供了从客户端同步到服务器,组件提供了SyncDirection功能。

六、RTT(往返时间)

往返时间是指消息到另一端并返回的时间,由以下两个因素决定:
1.延迟:网络通过互联网传播需要时间
2.更新间隔:消息需要被处理并发送回另一端,与服务器处理时间及压力有关。
用户可以在NetworkTime.rtt查看,服务器可以在每个不同链接的NetworkServer.connection.rtt查看
如果你想在游戏中显示rtt可以使用NetworkPingDisplay

七、Connection Quality(连接质量)

Mirror的连接由三部分组成:
ConnectionQuality.cs提供了以下连接质量级别:
Public enum ConnectionQuality : byte
{
EXCELLENT, //高水平理想体验
GOOD, //非常适合所有人,高水平连接
FAIR, //非常明显卡顿,让人不愉悦
POOR, //无效的玩家
ESTIMATING, //仍在评估
}
两种发起方式:
Simple(based on Ping & Jitter)
Pragmatic( 基于快照插值)
NetworkPingDisplay
此组件可以添加到NetworkManager中,以在屏幕右下角显示ping和连接质量指示

NetworkManager回调
以覆盖CalculateConnectionQuality方式注入。可以在NetworkManager中配置。
OnConnectionQualityChanged可用于向用户显示警告,默认情况 下会发出一条日志。

八、Lag Compensation(滞后补偿)

快节奏的第一人称射击需要延迟补偿,又叫回滚。而对于MMORPG、纸牌、回合、等策略则不需要。
为什么需要回滚,假设在设计游戏中你和另一名玩家同步需要50毫秒,到达服务器需要50毫秒。这里就有100毫秒的时间差。这100毫秒里可能对方发生了位移,可能使你的设计位置不准确。
在这里插入图片描述
滞后补偿分为两部分:

一、独立算法类LagCompensation.cs

在这里插入图片描述在这里插入图片描述
该算法可以记录采样类型任何记录。
换句话说,如果你愿意,您可以根据自己的需要定制它,这是底层代码,使用高级组件会更方便。

二、Log Compensator组件

在这里插入图片描述
只需要添加下面组件,Mirror将会管理指定Collider的历史快照。
当你做为玩家在本地发射子弹时,[Command]将输入发送到服务器,这进我们不检查另一端玩家是否补击中,
而是检查另一端玩家当时的Lag Compensation(滞后补偿)
官方文档中提供了例子。

九、Client Side Prediction(客户端预测)

打开Examples/Billiards例子,选择NetworkManager -> LatencySimulation 增加一些延迟(50ms),构建选择Server Only.
在这里插入图片描述

这是一个桌球游戏,在你击打白球时,由于数据需要发送给服务器再回传我们能明显的感觉到打击感滞后。
因此我们需要要用客户端模拟预测结果,一旦服务端返回状态我们必须立马纠正它。
由于大多数物理引擎,如Unity的PhysX是不确定的。这以为着在客户端和服务端施加的力(浮点数)会有所不同,而差异会逐渐累计。

为什么不使用确定性物理引擎:
一、Unity没有
二、工作量大
三、比常规物理引擎慢

最简单回滚流程说明:
由客户端执行Rigidbody.AddForce() 同时发送给服务器端执行[Command]CmdApplyForce(force)
服务器执行wellRigidbody.AddForce(force)
服务器同步新的刚体位置到客户端,但些修正将有一定时间差,而客户端一直在进行修改。
这也以为着客户端将一直有明显的“后跳”行为。
应当如何解决因时间差带来的后跳问题呢?
由客户端执行Rigidbody.AddForce() 客户端保存刚体位置 每50ms保存一次,以便后面进去比较
在这里插入图片描述
发送给服务器端执行[Command]CmdApplyForce(force)
拿到服务端的位置后与100ms(50+50来回)前的位置进行对比矫正
这部分内容可以了解一下而已,事实上Mirror已经为我们处理完这部分内容
在客户端中使用:Predicted Rigidbody(预测刚体)插件,情况将会简单很多。
预测和修正总是很难应用在刚体上。为了固话效果组件提供了两种模式:
在这里插入图片描述
Smooth(平滑):一般开始移动,所有的物理组件(Rigidbody+Colliders)都会移动到一个不可见的Ghost对象里。
渲染器在原位置并平滑插值到Ghost对像的位置,这将提供非常平滑的结果,但创造和跟随会有更大的额外成本开销。
Fast(快速):物体保留在原来的位置上,渲染器直接移动到结果所在位置,这种方式更节约性能。

关于预测的类型可以在forecast .cs中找到它。
Mirror还可以用于其他类型的预测,但还需要了解后自行补全部分逻辑。

关于Mirror对于大型场景的预测
传统上预测算法并回滚模拟整个场景我们需要Physics.Simulate()
此方法可以最正确的模拟出结果,但性能消耗巨大,不适合用于大型场景。
Mirror经过努力兼容了大型场景的物理同及堆叠物理的同步。

十、History Bounds(历史边界)

优化延迟补偿和客户端预测,为了最小化性能开销,在我们使用的对像先对其强制使用HistoryBounds
使用方式:
将HistoryCollider添加到NetworkIdentity上
确保NetworkIdentity中有碰撞器,并拖至actualCollider中
按下播放键,启动Gizmos,注意橙色的HistoryCollider.
组件以橙色包围盒显示,这以为着您可以使用物理摄像进行物理检测。

当玩家开枪时,对所有的HistoryColliders进行射线检测,反出我们需要检测的玩家。
然后对碰撞器的父级NetworkIdentity使用延迟补偿处理,然后再检查他是否补击中。

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

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

相关文章

django档案馆集中管理系统-计算机毕业设计源码31775

目录 摘要 Abstract 第一章 绪论 1.1 选题背景及意义 1.2 国内外研究现状 1.3 研究方法 第二章 相关技术介绍 2.1 MySQL简介 2.2 Python 2.3 Django框架 2.4 Pycharm简介 第三章 档案馆集中管理系统系统分析 3.1 系统可行性分析 3.1.1 技术可行性 3.1.2 经济可行…

FFmpeg研究

1.FFmpeg介绍 FFmpeg的全称是“Fast Forward Moving Picture Expert Group”,组件由命令行应用程序和函数库两部分组成。通俗概括来说,FFmpeg 是一个免费的开源程序库,一个多媒体音视频处理分析工具软件,且提供命令行方式调用&am…

Linux(1)--VMware的安装与配置

Linux Linux是一种自由和开放源码的类Unix操作系统,由林纳斯托瓦兹(Linus Torvalds)于1991年首次发布。Linux以其高效性、灵活性和稳定性而闻名,广泛应用于各种计算机硬件设备中,包括手机、平板电脑、路由器、视频游戏…

【Win10】记一次蓝屏修复

最近电脑蓝屏了好多次,错误代码为:IRQL_NOT_LESS_OR_EQUAL 直接搜这个错误代码不太好找原因,于是按照这篇文章[1]来打开错误日志文件。 需要先在windows的应用商店中下载WinDbg 然后,打开目录 C:\Windows\Minidump ,…

React 学习——组件内通信(兄弟之间)

A组件 > B组件 核心思路&#xff1a; 1、A组件先通过子传父的方式把数据传给父组件App 2、App拿到数据后通过父传子的方式再传递给B组件 import { useState } from "react" function A({onGetMsg}){const AMsg 我是A组件的消息return (<div><button…

如何实现全国产业园数量扩展,小编带你共同探讨树莓集团产业园运营模式

在当前快速发展的经济环境中&#xff0c;产业园区作为促进经济发展和技术创新的重要平台&#xff0c;扮演着越来越重要的角色。通过精心策划的战略布局与科学严谨的发展规划&#xff0c;树莓集团依托持续的创新驱动与科技引领&#xff0c;成功实现了全国产业园数量的显著扩展与…

【HTML入门】第二十课 - 【实战】做一个侧边栏菜单

这一小节&#xff0c;我们还是继续练习纯HTML标签的内容&#xff0c;多练一些&#xff0c;把HTML标签练熟。这就像练武功前的扎马步和一些基本功&#xff0c;功底越深&#xff0c;后边才能练更高深的武功。 这一小节&#xff0c;我们用纯HTML标签做一个侧边栏菜单的功能。就像这…

仿写讯飞AI生成PPT大纲组件

效果 别的不说先上效果 难点 树的实现 &#xff1a;需要递归自身&#xff0c;有丶难度。但是对于各位应该是有手就彳亍。双亲节点样式 &#xff1a;可以观察到双亲节点在连接线左侧是有内容的&#xff0c;叶子节点则没有。连接线&#xff1a;可以观察到双亲节点是实心圆点&a…

华为交换机Telnet配置

华为交换机Telnet配置 一、Telnet概述与作用 1、Telnet简介 Telnet&#xff08;Telnet协议&#xff09;是一种用于远程登录到计算机或网络设备的协议。它允许用户在本地计算机上通过网络连接到远程计算机或设备&#xff0c;并在远程计算机上执行命令和操作。Telnet协议最初是…

SpringCloudAliababa中使用最新版的Seata实现分布式事务

SpringCloud中使用Seata实现分布式事务 Hello&#xff0c;兄弟们好&#xff0c;我是Feri&#xff0c;最近整理了最新的基于Seata-Server2.0实现分布式事务的demo&#xff0c;希望对你有所帮助&#xff0c;有任何问题&#xff0c;可以随时沟通交流&#xff0c;在成为技术大牛的路…

如何处理selenium Webdriver中的文本框?

文本框或字段在整个网页中广泛使用,本文将介绍如何在Java中使用Selenium Webdriver处理文本框。可以有各种文本字段,我们将尝试包括其中的大多数,并执行各种操作,如清除和输入文本。 我们将使用我们的Selenium游乐场网站- testkru,与各种文本框进行交互。您也可以使用同一…

昇思25天学习打卡营第27天|munger85

Vision Transformer图像分类 Vit是最新的用了transformer架构的图像模型&#xff0c;在很多比赛都获得了大奖&#xff0c;是非常优秀的架构。而且据说cnn其实只是vit的一个子集&#xff0c;cnn的卷积其实就是vit在很小的范围做了注意力机制。非常有意思 整个架构就好像这样 图…

七天打造一套量化交易系统:Day6-人工智能在量化投资中的应用

七天打造一套量化交易系统&#xff1a;Day6-人工智能在量化投资中的应用 步骤一&#xff1a;数据获取步骤二&#xff1a;对股票样本进行初步处理步骤三&#xff1a;遗传算法选股遗传算 kmeans 类的主要代码 步骤四&#xff1a;回测结果 遗传算法是一种基础的人工智能算法&#…

springboot惠农服务平台-计算机毕业设计源码50601

目录 1 绪论 1.1 研究背景 1.2研究意义 1.3论文结构与章节安排 2 惠农服务平台app 系统分析 2.1 可行性分析 2.2 系统功能分析 2.3 系统用例分析 2.4 系统流程分析 2.5本章小结 3 惠农服务平台app 总体设计 3.1 系统功能模块设计 3.2 数据库设计 表access_token (…

成品库存周转率报表(一)

文章目录 成品库存周转率报表(一)每日库存结存到表单《历史库存信息》报表逻辑报表设计过滤框简单账表界面存储过程,根据传入条件获取并计算返回数据报表服务插件简单账表绑定数据源插件绑定权限,发布,授权即可访问成品库存周转率报表(一) 每日库存结存到表单《历史库存…

基于域名的虚拟主机,基于ip的域名主机,综合项目eleme

查看nginx配置文件 不看空行&#xff0c;不看注释&#xff0c;查找 [rootstaticserver ~]# grep -Ev "#|^$" /usr/local/nginx/conf/nginx.conf 把原有的文件备份 [rootstaticserver ~]# cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.…

虚拟化数据恢复—XenServer VPS不可用如何恢复数据?

虚拟化数据恢复环境&#xff1a; 某品牌R720服务器&#xff0c;4块STAT硬盘通过H710P阵列卡组建了一组raid10磁盘阵列。服务器上部署XenServer虚拟化平台&#xff0c;虚拟机安装Windows Server系统&#xff0c;作为Web服务器使用&#xff0c;运行SQL Server数据库。共有2个虚拟…

智能巡航,守护蓝天绿水:无人机视频技术如何高效监督非法排污行为

随着工业化进程的加速和环境保护意识的日益增强&#xff0c;非法排污行为成为了威胁生态环境、影响公众健康的重大问题。传统的排污监测手段往往受限于人力成本、覆盖范围及效率等因素&#xff0c;难以实现对广袤区域和隐蔽排污点的有效监控。而无人机技术的飞速发展&#xff0…

【网络协议】HTTP协议详解

文章目录 一、概念 二、简史 三、特点 四、工作流程 五、使用Wireshark抓TCP、http包 六、头域 6.1、请求信息&#xff1a; 6.2、请求方法 6.3、响应消息 6.4、响应头域 6.5、HTTP常见的请求头 6.6、HTTP常见的响应头 七、解决HTTP无状态的问题 7.1、通过Cookies保存状态信息 7…

软件性能测试内容和方法揭秘,专业第三方软件测试公司推荐

在数字经济迅猛发展的背景下&#xff0c;软件的性能已经成为企业竞争力的重要一环。性能测试&#xff0c;作为软件测试的一个重要组成部分&#xff0c;主要用于评估应用程序在特定负载下的表现。这不仅包括响应时间、吞吐量、资源使用率等指标&#xff0c;还涉及系统在不同条件…