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

一、前言

网络游戏所面临的挑战:

  • 一致性:如何在所有的主机内都保持一样的表现
  • 可靠性:网络传输有可能出现丢包
  • 安全性:反作弊,反信息泄漏。
  • 多样性:不同设备之间链接,比如手机,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…

OpenAI的ChatGPT企业版专注于安全性、可扩展性和定制化。

OpenAI的ChatGPT企业版:安全、可扩展性和定制化的重点 OpenAI的ChatGPT在商业世界引起了巨大反响,而最近推出的ChatGPT企业版更是证明了其在企业界的日益重要地位。企业版ChatGPT拥有企业级安全、无限GPT-4访问、更长的上下文窗口以及一系列定制选项等增…

蓝桥杯算法

1,枚举(买股票) 买卖股票的最佳时机 小算是一个“优秀又不甘平庸的韭菜”,想要在股票市场上大赚一笔。这天小算又看中了一只潜力股。现在已知这只股票在n天内的价格为P0,P1,....,Pn-1&#xff…

ArrayList和LinkedList的区别,以及应用场景

ArrayList和LinkedList都是Java中的集合类,用于存储和操作一组对象。它们的主要区别在于内部实现方式和对操作的影响。 内部实现方式: ArrayList使用数组作为内部的数据结构,可以随机访问元素。当需要插入或删除元素时,ArrayList需…

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…

C#学习路线指南

C#新手学习路线指南 - 简书 https://www.cnblogs.com/yunbrody/p/17534310.html 第一部分&#xff1a;面向对象C#基础知识 1.C#开发入门 认识.NET平台与C#语言、理解.NET Framework框架、编写一个简单的C#程序并理解、C#程序的编译运行原理、VS常用开发环境设置&#xff08…

【AI】机器学习是什么?

相关内容可以参考我之前的“大厂AI课笔记系列”。 一、概念与技术发展 机器学习是人工智能&#xff08;AI&#xff09;的一个子领域&#xff0c;它的核心是让计算机系统从数据中学习并提升性能&#xff0c;而无需进行明确的编程。换句话说&#xff0c;机器学习是关于开发和使…

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 允许通过标准的文件描述…

【K8s】肿么办??Kubernetes Secrets并不是Secret哟!!

【K8s】肿么办??Kubernetes Secrets并不是Secret哟!! 目录 【K8s】肿么办??Kubernetes Secrets并不是Secret哟!!Kubernetes Secrets为什么不认为 Base64 编码是密文?问题出现了以下是几种加密 K8s Secrets 的选项。Bitnami Sealed Secrets 介绍Bitnami Sealed Secrets…

十四、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账号创建项目 六…

Jenkins环境搭建与使用

Jenkins环境搭建与使用   1 Jenkins下载 https://www.jenkins.io/download/ 下载完成后 2 启动Jenkins Java -jar jenkins.war 在浏览器输入10.88.123.11:8080 指定JDK为本机JDK路径 查看jenkins版本 3 插件安装方式 3.1 在线安装 安装jenkins后&#xff0c;初次启动的时候…

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

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

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

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

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

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