游戏同步+游戏中的网络模块

原文链接:游戏开发入门(九)游戏同步技术_游戏数据同步机制流程怎么开发-CSDN博客

游戏开发入门(十)游戏中的网络模块_游戏开发组网-CSDN博客

3.同步技术的基本常识:

a.同步给谁?
某个用户:如私聊的聊天信息
同屏内的所有玩家:发给同一个区域内的所有玩家
同一个服务器的所有玩家:遍历整个服务器所有玩家,然后逐个通知,如全服喇叭
b.同步的数据是?
命令数据:发送一个消息,通知另一端去执行某个操作,一般通过RPC实现
状态数据:针对某一个数值,按照一定频率不断的发送给另一端,来让不同端的该数值保持一致
c.同步的周期? 在特定逻辑触发时执行 一定频率不间断的发送

4.网络游戏面临的问题与解决思路
网络延迟:由于网络延迟无法避免,所有优化的核心就是如何根据当前环境减少延迟以及如何优化
客户端的视觉感受。一般对同步数据的暴力校正效果是非常差的,需要用各种手段去平滑的处理。
网络带宽:手游玩家可能会对流量的消耗比较在意,所以要尽可能的减小同步的数据量。减少方式有

  • a.在对象第一次同步的时候将完整的对象信息同步过去,后续只同步那些发生改变的数据
  • b.对协议内容进行优化,比如不需要可靠的同步消息可以使用UDP,减少一些校验等
  • c.某些复杂的数据内容可以只传递简单的数据信息,然后不同的客户端以及服务器通过算法在本地计算出结果

反外挂:

  • a.关键的游戏逻辑要放在服务器上面
  • b.协议需要加密,密钥需要频繁的改变
  • c.服务器对客户端发送的消息要验证,不合理的及时校正

5.常见的外挂类型

  • 修改客户端内存数据
  • 截取并修改客户端发送到服务器的消息
  • 调整网络延迟,让其他客户端不能正确获到玩家位置

外挂的核心思路:不断去检测本地数据的变化并尝试去修改,很有可能就找到游戏逻辑的漏洞。理论上,完全避免外挂也是不可能的,不过可以尽量避免同时增加外挂实现的难度

6.关于P2P同步与服务器同步
有过计算机基础的朋友应该了解P2P,即点对点,就是说两个游戏端直接相连,消息不需要发给其他人。服务器同步的架构里面,所有的客户端都需要链接到一个服务器上面,然后所有的消息都需要服务器先验证,然后在发送给其他客户端。我们常见的网络游戏都是基于服务器同步的。

7.P2P同步常见的同步策略——时间轴同步:

a.常规同步 A产生命令发给B的同时,立刻执行。B收到消息后再去执行。这个过程有延迟
b.约定同步
为了克服上面的执行不同步,A在产生命令的同时将消息与当前时间戳都发送给B。B收到命令后,根据
网络情况在预测时间与A“同时”执行。或者A在产生命令的同时告诉B,应该在哪个时间戳开始执行,B收到 消息后在与A商量好的时间去执行。
注:该方法肯定也可能会有延迟的,不过一定范围内可以接收,效果也比常规同步的好一些

8.P2P同步常见的同步策略——帧同步:
帧同步的核心是保证各个端的逻辑帧保持一致。如果A在执行第N+1帧的时候需要B的第N帧数据,那么必须等到B
的第N帧数据同步过来后才能执行。

  • 优点:保证逻辑上的完全同步
  • 缺点:如果一个客户端的网络环境差,会导致另一个客户端也卡顿。

注:视频中提到对视觉要求不是很高的游戏采用帧同步,这句话有待商榷,他这里可能只是针对P2P。我们所熟知的“王者荣耀”采用的就是帧同步的方法,只不过他是在服务器同步架构下,采用的是乐观帧以及各个细节的逐步优化来完成的,后面简单讲解

9.服务器常见的同步策略——服务器时间轴同步:
前面提到过,服务器同步架构下,所有的消息都要通过服务器验证与转发。这与P2P基于时间轴同步策略是相同的,不过因为中间多了一道程序,延迟还可能有所增加。视频中所指的这种同步,在业界常说的状态同步差不多,也就是客户端的某些同步属性要与服务器保持一致。状态同步与时间轴同步的概念侧重点与分类有点不同,大家理解就好。

  • 优点:可以对客户端消息进行验证,防止外挂。
  • 缺点:延迟比较高,所以为了表现流畅,一般都是客户端在执行命令的时候立即执行操作,然后发给服务器去验证,如果验证不通过,服务器还会对客户端进行校正。

10.服务器常见的同步策略——服务器帧同步:
帧同步在服务器架构下仍然可以使用,不过在处理上可能有些差异。一般来说,客户端玩家在触发了某个按键操作的时候,会将操作的命令(注意:这个命令包含的只是玩家按键的信息,没有其他逻辑信息)与当前帧发送给服务器。服务器收集到所有客户端当前帧的操作信息后,就会广播执行给所有客户端。如果有的客户端没有发送当前帧的指令,服务器就不会广播消息,这时候所有客户端就会锁帧。
帧同步优化:为了避免客户端网络出现延迟的问题,产生了“乐观锁”的处理手段。就是服务器不去等待客户端是否发送了帧操作数据,每隔固定时间就广播给所有客户端。(视频第二节后面的内容就是这种机制)

11.同步中常见术语

  • 主像:本地玩家角色,当前设备控制的角色
  • 影像:本地客户端看到的其他玩家角色
  • 客户端:包含本地玩家的终端设备
  • FPS:帧数

12.位置同步
区域位置同步:给玩家配置一个范围,玩家移动超出这个范围后立刻触发同步更新中心坐标。同时为了防止玩家总在一个很小的范围移动,可以设置每隔一段固定时间就进行一次同步。

13.操作同步
客户端触发某个操作立刻执行,然后发送给服务器,服务器广播给其他客户端执行

14.命中同步
这个不同的游戏有不同的方式,可以选择让客户端进行判定,把结果传给服务器。也可以把玩家操作
发给服务器,让服务器去计算判断。

15.网络同步调试手段

a.Log/断点 如果可以在开发时就定位到问题,那最直接的办法就是断点。如果不好定位,可以采用输出日志的方式,即log
b.录像/录屏(Fraps)
录像与我们常说的视频录像不太一样,而是我们记录玩家在各个时间点的操作,从游戏开始到结束完全的模拟一遍。这其实也是游戏回放的基本思路,很明显这样很容易重现我们之前出现的问题,这个录像一般需要游戏项目提供相关的功能才可以。
如果游戏本身不支持录像功能,那可以借助工具来调试,如Fraps可以按特定帧数截屏
c.网络模拟软件(Network-Emulator-Toolkit)
开发者的游戏环境与玩家一般是不同的,为了测试在外网环境下玩家的游戏情况,我们可以借助一些网络模拟软件来调整当前开发环境下的网络延迟

---------------------------------------------------------------------------------------------------------------------------------

1.服务器在整个游戏过程中是一直运行的
一旦服务器宕,所有的玩家都会掉线,一旦服务器出现卡顿,所有的玩家也会出现卡顿,所以服务器的性能与表现必须非常严格。很多情况下,有一些并非非常重要的逻辑最好放到客户端执行,可以减小服务器压力,而且服务器的内存,CPU性能都要比一般的玩家机器要强的多。

为了减小硬件设施开销,一台服务器机器可能同时运行多个游戏服务器。MMO游戏,局域网游戏以及房间匹配游戏等,各自的服务器网络架构也是不同的,这个需要读者去查阅更多的资料。
推荐链接:游戏服务器架构 - 卫长青 - 博客园 (cnblogs.com)
http://gcloud.qq.com/forum/topic/56a0bac3a90d8b775e8f3c1b

2.计算机网络基础——网络模型
这属于计算机基础知识方面的内容,如果不熟悉这一模块,建议先去看一看计算机网络相关书籍,如计算机网络自顶向下方法 计算机网络(第4版) (豆瓣) (douban.com)。想进一步深入的话可能需要看TCP/IP详解 卷一卷二卷三,如果对服务器兴趣不是很大或只是想有个大概理解可以先不看这个系列。

3.网络游戏开发中我们通常接触的是应用层(游戏逻辑,Socket处理)与传输层(TCP,UDP)

4.TCP与UDP

TCP特点: 传输可靠—保证顺序(滑动窗口),
不丢包(重传机制RDT),有拥塞控制
三次握手,建立链接
数据包没有限制
可以依靠网络层去分帧
UDP特点:
传输不可靠—不保证顺序,可能丢包,
实现机制比较简单
无连接,随时发送
UDP协议一般要求包小于64K

5.关于TCP与UDP的选择
二者在不同的游戏里面都有广泛的应用,没有绝对好坏之分。TCP相比UDP数据安全可靠,但是需要建立链接,机制复杂带来额外的开销,在网络环境不好的情况下效果非常差。
TCP应用场景:网络条件较好,对安全可靠性有要求的
UDP应用场景:网络环境较差,要求响应速度比较高,安全性其次的

6.进程通信
在同一个机器上,两个不同的进程之间有多种通信方式。如管道,消息队列,信号量
,信号,共享内存等。(这属于操作系统基础知识)
如果想在两个不同机器的进程之间通信,就需要用到Socket套接字。(当然他也可以用于同一个机器不同进程通信)

7.socket
从宏观概念上理解,socket是一套基于TCP/IP协议封装的API。他处于网络应用层,给开发者提供方便的接口来快速的实现网络通信。网上有的朋友把他比喻成插座,处于两个机器上的两个进程想要通信,就需要各自创建一个插座,然后把自己插在这个插座上,这样你只要把信息通过这个插座传输过去就好了而不需要管插座里面有什么特殊的机制与技巧。当然,理论上你不用插座直接用手把线路焊接到一起也是没问题的,不过里面的电流过大断电机制什么的需要你自己想办法处理了。
从编程的角度来讲,socket是一个无符号整型变量,用来标识一个通信进程。两个进程想要通信必须要知道双方的ip地址和端口号,以及通信所采用的协议栈。socket就是和这些东西绑定的,socket编程可以使用unix接口,也可以使用windows的接口winSock。
参考链接:
socket编程到底是什么?(socket编程到底是什么? - 知乎 (zhihu.com))
谈谈socket 套接字(谈谈socket 套接字_华清远见linux的socket套接字-CSDN博客)
TCP/IP、Http、Socket的区别? TCP/IP、Http、Socket的区别? - 知乎 (zhihu.com)

7.游戏开发中的基本网络架构
理解了socket之后,所谓游戏中的网络框架也不难理解。其实就是在socket的基础上进一步封装一套更方便游戏内部的消息传输机制,同时将消息解析细节与逻辑层代码进行分离,使逻辑层代码更清晰可读。低配版:比如客户端想给服务器发送一个比较复杂的数据结构(比如一个包含字符串和数字的结构体),那这个数据需要在客户端转换成二进制,通过socket发送到服务器。服务器的网络机制通过其socket监听到该数据包,然后解析二进制数据并还原到逻辑上层。
高配版:只简单的发送与解析一般数据还不够,游戏中我们希望直接能将一个对象直接从客户端发到服务器,或者直接将某个函数发到服务器去执行,更甚者想要在逻辑层实现UDP的可靠数据传输。这些较为复杂的机制都包含在网络框架里面,有时候我们可以借用一些开源的库来帮我们实现,如protobuf。

8.protobuf
Google Protocol Buffer(Protobuf)是一种轻便高效的结构化数据存储格式,平台无关、语言无关、可扩展,通常用于通讯协议和数据存储等领域。通俗一点讲,就是用来按照二进制格式保存与读取的开源库,我们在进行网络传输的时候需要把数据转换成二进制通过网络层发送过去,但是如何把复杂数据(一个类对象)准确地转换成二进制发送并在接收端快速准确解析就是个问题。protobuf就可以做这个工作,他可以把一个对象序列化成二进制,然后在接收端再反序列化成原来的对象内容,这样我们就成功的传输了一个类对象!
这个过程我们是在应用层来实现的,所以本质上游戏网络层的实现对应的就是计算机网络模型中的应用层(和Http,ftp是类似的)

9.GUID
该课程中没有涉及,但是有必要提出来。前面提到我们可以在网络中传递一个对象,但是客户端上的A对象(如玩家A)与服务器上的A对象(也是玩家A)在内存地址上肯定是不一样的,我们怎么知道客户端传递过来的A对象就是服务器上的?
答案就是GUID,服务器在同步一个对象引用(指针)的时候,会给其分配专门的GUID并通过网络进行发送。客户端上通过识别这个ID,就可以找到对应的类对象。具体的细节可以参考虚幻引擎里面的实现机制,博主也写了一篇文档,里面有提到该机制的相关细节UE4网络同步(二)——深入同步细节_ue4 网络同步 csdn-CSDN博客

10.事件与代理
游戏中常用的模块之间通信方式,可以极大的降低模块耦合性。实现原理是函数指针,比如A模块执行了某个操作后,通过广播向所有模块发消息,这些模块如果事先绑定了对应消息的函数指针,就会收到该消息并处理。这个过程中A并不知道发给了谁,也不知道其他模块又做了什么。

---------------------------------------------------------------------------------------------------------------------------------

Socket简介

Socket是进程通讯的一种方式,即调用这个网络库的一些API函数实现分布在不同主机的相关进程之间的数据交换。

几个定义:

(1)IP地址:即依照TCP/IP协议分配给本地主机的网络地址,两个进程要通讯,任一进程首先要知道通讯对方的位置,即对方的IP。

(2)端口号:用来辨别本地通讯进程,一个本地的进程在通讯时均会占用一个端口号,不同的进程端口号不同,因此在通讯前必须要分配一个没有被访问的端口号。

(3)连接:指两个进程间的通讯链路。

(4)半相关:网络中用一个三元组可以在全局唯一标志一个进程:

(协议,本地地址,本地端口号)

这样一个三元组,叫做一个半相关,它指定连接的每半部分。

(4)全相关:一个完整的网间进程通信需要由两个进程组成,并且只能使用同一种高层协议。也就是说,不可能通信的一端用TCP协议,而另一端用UDP协议。因此一个完整的网间通信需要一个五元组来标识:

(协议,本地地址,本地端口号,远地地址,远地端口号)

这样一个五元组,叫做一个相关(association),即两个协议相同的半相关才能组合成一个合适的相关,或完全指定组成一连接。

二、客户/服务器模式

在TCP/IP网络应用中,通信的两个进程间相互作用的主要模式是客户/服务器(Client/Server,
C/S)模式,即客户向服务器发出服务请求,服务器接收到请求后,提供相应的服务。客户/服务器模式的建立基于以下两点:

(1)首先,建立网络的起因是网络中软硬件资源、运算能力和信息不均等,需要共享,从而造就拥有众多资源的主机提供服务,资源较少的客户请求服务这一非对等作用。

(2)其次,网间进程通信完全是异步的,相互通信的进程间既不存在父子关系,又不共享内存缓冲区,因此需要一种机制为希望通信的进程间建立联系,为二者的数据交换提供同步,这就是基于客户/服务器模式的TCP/IP。

服务器端:

其过程是首先服务器方要先启动,并根据请求提供相应服务:

(1)打开一通信通道并告知本地主机,它愿意在某一公认地址上的某端口(如FTP的端口可能为21)接收客户请求;

(2)等待客户请求到达该端口;

(3)接收到客户端的服务请求时,处理该请求并发送应答信号。接收到并发服务请求,要激活一新进程来处理这个客户请求(如UNIX系统中用fork、exec)。新进程处理此客户请求,并不需要对其它请求作出应答。服务完成后,关闭此新进程与客户的通信链路,并终止。

(4)返回第(2)步,等待另一客户请求。

(5)关闭服务器

客户端:

(1)打开一通信通道,并连接到服务器所在主机的特定端口;

(2)向服务器发服务请求报文,等待并接收应答;继续提出请求......

(3)请求结束后关闭通信通道并终止。

从上面所描述过程可知:

(1)客户与服务器进程的作用是非对称的,因此代码不同。

(2)服务器进程一般是先启动的。只要系统运行,该服务进程一直存在,直到正常或强迫终止。
作者:wuxinliulei
链接:https://www.zhihu.com/question/29637351/answer/67610424
来源:知乎
 

http连接=以http协议为通信协议的tcp连接

http短连接=以http协议为通信协议的,请求一次就断开的tcp连接

http长连接=以http协议为通信协议的,请求多次才断开的tcp连接(这个是为了通过减少建立tcp连接的次数达到节省两端资源的目的)

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

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

相关文章

基于ZYNQ的PCIE高速数据采集卡的设计(二)总体设计与上位机

采集卡总体设计及相关技术 2.1 引言 本课题是来源于雷达辐射源识别项目,需要对雷达辐射源中频信号进行采集传输 和存储。本章基于项目需求,介绍采集卡的总体设计方案。采集卡设计包括硬件设计 和软件设计。首先对采集卡的性能和指标进行分析&#x…

Nginx使用

Nginx 常用命令: nginx -s stop 快速关闭Nginx,可能不保存相关信息,并迅速终止web服务。 nginx -s quit 平稳关闭Nginx,保存相关信息,有安排的结束web服务。 nginx -s reload 因改变了Nginx相关配置…

华清远见作业第三十九天——Qt(第一天)

思维导图&#xff1a; 登录界面&#xff1a; 代码&#xff1a; #include "mainwindow.h" #include<QToolBar> #include<QPushButton> MainWindow::MainWindow(QWidget *parent): QMainWindow(parent) {this->resize(600,400);this->setFixedSize…

32单片机基础:对射式红外传感器计次

接线如下图&#xff1a; 在HardWare建立两个文件&#xff1a;如图 COuntSensor.c 如何配置外部中断,根据下面图&#xff0c;我们需要把外部中断从GPIO到NVIC这一路出现的外设模块都配置好。把这条信号打通就OK了。 1.配置RCC:把我们这里涉及的外设时钟都打开&#xff0c;不打…

算法沉淀——动态规划之简单多状态 dp 问题(上)(leetcode真题剖析)

算法沉淀——动态规划之简单多状态 dp 问题上 01.按摩师02.打家劫舍 II03.删除并获得点数04.粉刷房子 01.按摩师 题目链接&#xff1a;https://leetcode.cn/problems/the-masseuse-lcci/ 一个有名的按摩师会收到源源不断的预约请求&#xff0c;每个预约都可以选择接或不接。在…

【数据结构(顺序表)】

一、什么是数据结构? 数据结构是由“数据”和“结构”两词组合而来。 什么是数据&#xff1f;常见的数值1、2、3、4.....、教务系统里保存的用户信息&#xff08;姓名、性别、年龄、学历等等&#xff09;、网页里肉眼可以看到的信息&#xff08;文字、图片、视频等等&#xff…

二分算法(c++版)

二分的本质是什么&#xff1f; 很多人会认为单调性是二分的本质&#xff0c;但其实其本质并非单调性&#xff0c;只是说&#xff0c;有单调性的可以进行二分&#xff0c;但是有些题目没有单调性我们也可以进行二分。其本质其实是一个边界问题&#xff0c;给定一个条件&#xf…

第九届大数据与计算国际会议 (ICBDC 2024) 即将召开!

2024年第九届大数据与计算国际会议&#xff08;ICBDC 2024&#xff09;将于2024年5月24至26日在泰国曼谷举行。本次会议由朱拉隆功大学工程学院工业工程系主办。ICBDC 2024的宗旨是展示大数据和计算主题相关科学家的最新研究和成果&#xff0c;为来自不同地区的专家代表们提供一…

【MySQL】连接查询和自连接的学习和总结

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-x4sPmqTXA4yupW1n {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

从零开始学IO_FILE的堆利用:理解IO_FILE之fwrite

​ 要学习基于IO_FILE的堆利用就得了解它的本质&#xff0c;以下会介绍几个主要的IO函数&#xff0c;结合源码和动态调试去学习。 调试环境搭建可参考环境从零开始配置pwn环境&#xff1a;从零开始配置pwn环境&#xff1a;优化pwn虚拟机配置支持libc等指令-CSDN博客 1.在开始上…

【嵌入式实践】【芝麻】【目录】从0到1给电动车添加指纹锁

0. 前言 该项目是基于stm32F103和指纹模块做了一个通过指纹锁控制电动车的小工具。支持添加指纹、删除指纹&#xff0c;电动车进入P档等待时计时&#xff0c;计时超过5min则自动锁车&#xff0c;计时过程中按刹车可中断P档状态&#xff0c;同时中断锁车计时。改项目我称之为“芝…

FlinkCDC详解

1、FlinkCDC是什么 1.1 CDC是什么 CDC是Chanage Data Capture&#xff08;数据变更捕获&#xff09;的简称。其核心原理就是监测并捕获数据库的变动&#xff08;例如增删改&#xff09;&#xff0c;将这些变更按照发生顺序捕获&#xff0c;将捕获到的数据&#xff0c;写入数据…

ThreeJS 几何体顶点position、法向量normal及uv坐标 | UV映射 - 法向量 - 包围盒

文章目录 几何体的顶点position、法向量normal及uv坐标UV映射UV坐标系UV坐标与顶点坐标设置UV坐标案例1&#xff1a;使用PlaneGeometry创建平面缓存几何体案例2&#xff1a;使用BufferGeometry创建平面缓存几何体 法向量 - 顶点法向量光照计算案例1&#xff1a;不设置顶点法向量…

从故宫修建看「软件物料清单」的重要性 @安全历史01

故宫&#xff0c;这座中国传统文化的重要代表和象征性建筑已屹立近600年&#xff0c;是世界上现存规模最大、保存最为完整的木质结构古建筑之一。 故宫之所以能至今保存完好&#xff0c;除持续保护和修缮外&#xff0c;其使用的木材和砖石等材料也经过了精挑细选&#xff0c;保…

数据库增删改查

DDL: 数据定义语言&#xff0c;用来定义数据库对象&#xff08;数据库、表、字段&#xff09;DML: 数据操作语言&#xff0c;用来对数据库表中的数据进行增删改DQL: 数据查询语言&#xff0c;用来查询数据库中表的记录DCL: 数据控制语言&#xff0c;用来创建数据库用户、控制数…

c语言字符函数和字符串函数

目录 1. 字符分类函数2. 字符转换函数3. strlen的使用和模拟实现4. strcpy的使用和模拟实现5. strcat的使用和模拟实现6. strcmp的使用和模拟实现7. strncpy函数的使用8. strncat函数的使用9. strncmp函数的使用10. strstr的使用和模拟实现11. strtok函数的使用12. strerror函数…

设计模式-创建型模式-建造者模式

建造者模式&#xff08;Builder Pattern&#xff09;&#xff1a;将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。建造者模式是一种对象创建型模式。 建造者模式一步一步地创建一个复杂的对象&#xff0c;它允许用户只通过指定复杂对象…

Linux-基础知识(黑马学习笔记)

硬件和软件 我们所熟知的计算机是由&#xff1a;硬件和软件组成。 硬件&#xff1a;计算机系统中电子&#xff0c;机械和光电元件等组成的各种物理装置的总称。 软件&#xff1a;是用户和计算机硬件之间的接口和桥梁&#xff0c;用户通过软件与计算机进行交流。 而操作系统…

gensim 实现 TF-IDF

目录 介绍 代码 介绍 TF-IDF&#xff08;Term Frequency-Inverse Document Frequency&#xff09; 含义&#xff1a; TF (Term Frequency): 词频&#xff0c;是指一个词语在当前文档中出现的次数。它衡量的是词语在文档内部的重要性&#xff0c;直观上讲&#xff0c;一个词…

【机器学习科学库】全md文档笔记:Jupyter Notebook和Matplotlib使用(已分享,附代码)

本系列文章md笔记&#xff08;已分享&#xff09;主要讨论人工智能相关知识。主要内容包括&#xff0c;了解机器学习定义以及应用场景&#xff0c;掌握机器学习基础环境的安装和使用&#xff0c;掌握利用常用的科学计算库对数据进行展示、分析&#xff0c;学会使用jupyter note…