网站 框架网页建设,天长哪个广告公司做网站,网站footer怎么做,wordpress4.94中文版原文链接#xff1a;游戏开发入门#xff08;九#xff09;游戏同步技术_游戏数据同步机制流程怎么开发-CSDN博客
游戏开发入门#xff08;十#xff09;游戏中的网络模块_游戏开发组网-CSDN博客
3.同步技术的基本常识#xff1a;
a.同步给谁#xff1f;某个用户游戏开发入门九游戏同步技术_游戏数据同步机制流程怎么开发-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在执行第N1帧的时候需要B的第N帧数据那么必须等到B 的第N帧数据同步过来后才能执行。
优点保证逻辑上的完全同步缺点如果一个客户端的网络环境差会导致另一个客户端也卡顿。
注视频中提到对视觉要求不是很高的游戏采用帧同步这句话有待商榷他这里可能只是针对P2P。我们所熟知的“王者荣耀”采用的就是帧同步的方法只不过他是在服务器同步架构下采用的是乐观帧以及各个细节的逐步优化来完成的后面简单讲解
9.服务器常见的同步策略——服务器时间轴同步 前面提到过服务器同步架构下所有的消息都要通过服务器验证与转发。这与P2P基于时间轴同步策略是相同的不过因为中间多了一道程序延迟还可能有所增加。视频中所指的这种同步在业界常说的状态同步差不多也就是客户端的某些同步属性要与服务器保持一致。状态同步与时间轴同步的概念侧重点与分类有点不同大家理解就好。
优点可以对客户端消息进行验证防止外挂。缺点延迟比较高所以为了表现流畅一般都是客户端在执行命令的时候立即执行操作然后发给服务器去验证如果验证不通过服务器还会对客户端进行校正。
10.服务器常见的同步策略——服务器帧同步 帧同步在服务器架构下仍然可以使用不过在处理上可能有些差异。一般来说客户端玩家在触发了某个按键操作的时候会将操作的命令注意这个命令包含的只是玩家按键的信息没有其他逻辑信息与当前帧发送给服务器。服务器收集到所有客户端当前帧的操作信息后就会广播执行给所有客户端。如果有的客户端没有发送当前帧的指令服务器就不会广播消息这时候所有客户端就会锁帧。帧同步优化为了避免客户端网络出现延迟的问题产生了“乐观锁”的处理手段。就是服务器不去等待客户端是否发送了帧操作数据每隔固定时间就广播给所有客户端。视频第二节后面的内容就是这种机制
11.同步中常见术语
主像本地玩家角色当前设备控制的角色影像本地客户端看到的其他玩家角色客户端包含本地玩家的终端设备FPS帧数
12.位置同步 区域位置同步给玩家配置一个范围玩家移动超出这个范围后立刻触发同步更新中心坐标。同时为了防止玩家总在一个很小的范围移动可以设置每隔一段固定时间就进行一次同步。
13.操作同步 客户端触发某个操作立刻执行然后发送给服务器服务器广播给其他客户端执行
14.命中同步 这个不同的游戏有不同的方式可以选择让客户端进行判定把结果传给服务器。也可以把玩家操作 发给服务器让服务器去计算判断。
15.网络同步调试手段
a.Log/断点 如果可以在开发时就定位到问题那最直接的办法就是断点。如果不好定位可以采用输出日志的方式即logb.录像/录屏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处理与传输层TCPUDP
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函数实现分布在不同主机的相关进程之间的数据交换。
几个定义
1IP地址即依照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连接的次数达到节省两端资源的目的