游戏引擎中网络游戏的基础

一、前言

网络游戏所面临的挑战:

  • 一致性:如何在所有的主机内都保持一样的表现
  • 可靠性:网络传输有可能出现丢包
  • 安全性:反作弊,反信息泄漏。
  • 多样性:不同设备之间链接,比如手机,ipad,电脑等设备,热更新逻辑。
  • 复杂性:高并发,高效率,高表现。

二、网络协议

Vint Cerf和Robert Kahn设计了TCP/IP协议用于在不同主机之间传递信息。

 2.1 OSI七层网络

需要详细了解,可以去我的计算机网络专栏查看。

2.2 Socket

通过socket接口就可以和别的主机建立链接。

 2.3 TCP与UDP

这里详细说了,去我计算机传输层看吧。

2.4 Reliable UDP

网络游戏:基于UDP的可靠网络连接。

TCP传输可靠但是太慢了,UDP很快,但是他不保证可靠传输,很容易丢包。所以我们需要在UDP上加上确认机制和重传机制等方法来保证数据的可靠传输。

2.5 FEC

在传输时传输足够数量的额外冗余信息,在一定程度上重建丢失的数据。

1. XOR-FEC

 通过异或运算求解丢失的数据。但是这个适用于丢一个包的数据,当丢多个相邻包的数据时可以用下面这个方法。

2.Reed-Solomon codes

 

三、时钟同步与RPC

在游戏开始前,需要对准所有客户端的游戏时间。

3.1 RTT

往返传输时延

3.2 NTP

与服务器对时间

NTP算法:

 

3.3 Remote Procedure call(RPC)

程序员只需要重点关注逻辑,不需要关注那么多的网络方面的。

通过在服务端定义各种方法,客户端只需要调用和传递参数即可:

 

四、网络拓扑 

4.1 P2P

4.2 Dedicatd Server

 五、游戏同步

5.1 快照同步(Snapshot Synchronization)

类似云游戏,客户端只做输入和显示,别的都交给服务器。

优化:

  • 服务端按照10fps计算,客户端按照60fps显示,多的fps进行插值。
  • 数据压缩,只发送变化的数据。

这样导致客户端的算力浪费了,并且对带宽要求很高。

5.2 帧同步(LockStep Synchronization)

类似军队中每个人步调一致的向前走,在相同的时间点,各个客户端的表现一致。

同样的输入 + 同样的处理逻辑 = 同样的表现

例如游戏中的回放并不是游戏战斗过程的录屏,而是在游戏时记录所有玩家的输入,然后将这些输入重新计算就可以得到同样的效果。

第一款使用帧同步的游戏:Doom。王者荣耀也是用帧同步做的。

帧同步的过程:每一帧所有的客户端把你输入交给服务器,服务器汇总后再发给每个客户端,每个客户端按照同样的逻辑处理这些输入。

优点:非常简单,特别公平

缺点:最慢的那个客户端会拖慢所有的客户端。

优化:不等最慢的客户端,设定一个deadline,超出deadline后就不管没有提交的输入了,而是发放已经提交的输入。 

帧同步需要让所有客户端保持一致性 :

  • 浮点数 :所有的数学运算都要符合原理。2/3在所有客户端的结果都是一样的。

  • 随机数:每个客户端生成的随机数也是一样的,使用随机种子。所以计算机生成的随机数是伪随机

  • 存储所有的数据,当游戏出现差错时可以回溯

  • 使用buffer来解决延时的问题,

  • 在逻辑帧中添加渲染帧,避免抖动。

  • 断线重连,将别人的数据存储在本地,当玩家回来后根据这些逻辑追帧。

帧同步实现反作弊面临的问题:

  • 一个客户端修改时数据后,服务端根据别的大多数客户端的数据判断,然后剔除作弊的客户端。
  • 如果只有两个客户端的话,服务器就不能判断谁在作弊了。
  • 帧同步是把所有客户端的数据都传到一个客户端进行计算,所以对于单个客户端来说很容易做一个插件让玩家知道所有人当前的状态。

优点:带宽要求小,只需要同步所有的指令。对于即时性的游戏很合适。

缺点:保持一致性面临很多挑战,难以避免全图挂。

5.3 状态同步(State Synchronization)

每个客户端提交自己的输入信息,server端会根据所有客户端输入模拟整个世界,然后将对应玩家的结果状态返回给对应玩家。注意并不是所有的状态,这里要和快照同步区分。

 玩家A的客户端状态玩家A说了算,但是在别的客户端玩家A的状态是由服务器说了算。在玩家B的客户端看到的玩家A只是玩家A的复制品,他的行为逻辑是由服务器计算反馈的。

注意哦,所有玩家对场景还是别的玩家造成的影响,无论在哪个客户端,结果都是由服务端说的算。

存在的问题:dump client problem,由于客户端的表现要受到服务端的控制,所以玩家输入后由于网络问题可能会看到延时反应的效果。

解决方法:

1.Client-side Prediction  

2.Server Reconciliation

 

 

 

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

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

相关文章

C到C++的敲门砖-2

文章目录 引用内联函数auto关键字基于范围的for循环指针空值nullptr后记 引用 引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空 间,它和它引用的变量共用同一块内存空间。 所谓引用就是给变量起别名&am…

RUST egui体验

egui官方提供了web版的demo&#xff0c;效果还是很不错的&#xff0c;就是用的时候有点一头雾水&#xff0c;没有找到明确的指导怎么把这些组件插入到自己的application或者web。花了一天时间撸了一遍流程&#xff0c;记录一下&#xff0c;说不定以后能用到呢 >_< efram…

asp.net 作业星软件系统

asp.net 作业星软件系统 用户功能:分教师和家长&#xff08;学生) 注册登录:登录部分是用户名密码&#xff0c;以及教师和家长&#xff08;学生&#xff09;的勾选; 注册包括用户名密码确认密码再次确认密码(与上方输入的密码比对&#xff09;身份班级设置找回账号的问题和答案…

【人工智能】英文学习材料01(每日一句)

&#x1f33b;个人主页&#xff1a;相洋同学 &#x1f947;学习在于行动、总结和坚持&#xff0c;共勉&#xff01; 目录 1.Natural Language Processing&#xff0c;NLP&#xff08;自然语言处理&#xff09; 2.Machine Learing&#xff0c;ML&#xff08;机器学习&#xf…

FFplay使用滤镜添加字幕到现有视频显示

1.创建字幕文件4k.srt 4k.srt内容: 1 00:00:01.000 --> 00:00:30.000 日照香炉生紫烟2 00:00:31.000 --> 00:00:60.000 遥看瀑布挂前川3 00:01:01.000 --> 00:01:30.000 飞流直下三千尺4 00:01:31.000 --> 00:02:00.000 疑是银河落九天2.通过使用滤镜显示字幕在视…

【GPT-SOVITS-03】SOVITS 模块-生成模型解析

说明&#xff1a;该系列文章从本人知乎账号迁入&#xff0c;主要原因是知乎图片附件过于模糊。 知乎专栏地址&#xff1a; 语音生成专栏 系列文章地址&#xff1a; 【GPT-SOVITS-01】源码梳理 【GPT-SOVITS-02】GPT模块解析 【GPT-SOVITS-03】SOVITS 模块-生成模型解析 【G…

llama笔记:官方示例解析 example_chat_completion.py

1 导入库 from typing import List, Optional从typing模块中导入List和Optional。typing模块用于提供类型注解的支持&#xff0c;以帮助明确函数预期接收和返回的数据类型。List用于指定列表类型Optional用于指定一个变量可能是某个类型&#xff0c;也可能是None。 import fir…

Linux 下使用 socket 实现 TCP 客户端

目录 示例代码板级验证更多内容 套接字&#xff08;socket&#xff09;是 Linux 下的一种进程间通信机制&#xff08;socket IPC&#xff09;&#xff0c;它不仅支持同一主机的不同进程间通信&#xff0c;还支持跨网络的不同主机的进程间通信。 socket 允许通过标准的文件描述…

十四、GPT

在GPT-1之前&#xff0c;传统的 NLP 模型往往使用大量的数据对有监督的模型进行任务相关的模型训练&#xff0c;但是这种有监督学习的任务存在两个缺点&#xff1a;预训练语言模型之GPT 需要大量的标注数据&#xff0c;高质量的标注数据往往很难获得&#xff0c;因为在很多任务…

Android学习使用GitLab(保姆级)

实习生入职第一课 学习使用GitLab&#xff0c;熟悉Git版本控制工具 下面是我的学习笔记&#xff0c;希望能帮助到需要的人&#xff01; 目录 一、注册你的GitLab账号 二、安装Git 三、在Android studio中配置Git 四、GitLab账户配置SSH Keys 五、GitLab账号创建项目 六…

深度学习-基于机器学习的垃圾邮件过滤系统

概要 当今社会发展迅速&#xff0c;网络邮件也愈加普及。但是随之产生的垃圾邮件问题&#xff0c;也是的我们的邮件用户不堪其扰。对企业的工作以及个人用户的生活也造成了很大的影响。针对一些由于垃圾邮件导致的网络吞吐量异常和邮件系统无法正常使用的情况。建立一个机器学习…

html5黑色大气的个人博客全屏滚动个人主页源码HTML+JS+CSS

html5黑色大气的个人博客全屏滚动个人主页源码HTMLJSCSS

基于背景差法的运动目标检测(车辆检测),Matlab实现

博主简介&#xff1a; 专注、专一于Matlab图像处理学习、交流&#xff0c;matlab图像代码代做/项目合作可以联系&#xff08;QQ:3249726188&#xff09; 个人主页&#xff1a;Matlab_ImagePro-CSDN博客 原则&#xff1a;代码均由本人编写完成&#xff0c;非中介&#xff0c;提供…

【计算机视觉】二、图像形成——实验:2D变换编辑器2.0(Pygame)

文章目录 一、向量和矩阵的基本运算二、几何基元和变换1、几何基元(Geometric Primitives)2、几何变换(Geometric Transformations)2D变换编辑器0. 项目结构1. Package: guibutton.pywindow.py1. __init__(self, width, height, title)2. add_buttons(self)3. clear(self)4. dr…

Docker 安装 Skywalking以及UI界面

关于Skywalking 在现代分布式系统架构中&#xff0c;应用性能监控&#xff08;Application Performance Monitoring, APM&#xff09;扮演着至关重要的角色。本文将聚焦于一款备受瞩目的开源APM工具——Apache Skywalking&#xff0c;通过对其功能特性和工作原理的详细介绍&am…

【C++ leetcode 】双指针问题

1. 183. 移动零 题目 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 题目链接 . - 力扣&#xff08;LeetCode&#xff09; 画图 和 文字 分…

基于深度学习LSTM+NLP情感分析电影数据爬虫可视化分析推荐系统(深度学习LSTM+机器学习双推荐算法+scrapy爬虫+NLP情感分析+数据分析可视化)

文章目录 基于深度学习LSTMNLP情感分析电影数据爬虫可视化分析推荐系统&#xff08;深度学习LSTM机器学习双推荐算法scrapy爬虫NLP情感分析数据分析可视化&#xff09;项目概述深度学习长短时记忆网络&#xff08;Long Short-Term Memory&#xff0c;LSTM&#xff09;机器学习协…

golang常用库之-golang常用库之-ladon包 | 基于策略的访问控制

文章目录 golang常用库之-ladon包 | 基于策略的访问控制概念使用策略 条件 Conditions自定义conditionLadon Condition使用示例 持久化访问控制(Warden) 结合 Gin 开发一个简易 ACL 接口参考 golang常用库之-ladon包 | 基于策略的访问控制 https://github.com/ory/ladon Lado…

NPM 仓库的超集 JSR 来了!

引言 今天在 Deno 博客中看到了一篇文章&#xff0c;介绍了一个叫 JSR 的包管理注册中心&#xff0c;简单尝试了一下觉得还不错&#xff0c;本文将结合原文章和个人体验对 JSR 进行一个详细的介绍。 在现如今的前端开发中&#xff0c;包管理注册中心 (如 npmjs.com) 扮演着至…

Javaweb学习记录(一)Maven

Maven是一款Java项目管理工具&#xff0c;下面将介绍Maven的实际作用和相关的操作 Maven项目依赖的添加 在Maven项目中添加依赖&#xff0c;通过dependencies标签添加所有依赖&#xff0c;所有依赖都添加在里面&#xff0c;而单个依赖就使用dependency标签添加进项目&#xf…