MOBA作为竞技类的游戏,游戏中实时高精度同步,或者又说延迟容错率的要求还算是比较高的一种。

如何做到这种同步机制呢?

常用的同步机制有两种类型:帧同步 / 指令同步

何谓帧同步?

保证双方客户端逻辑运算结果高度一致的情况下,服务器只做消息转发的方式来驱动游戏的一种模式。

即:服务器没有具体逻辑 只做帧数据的下发 / 保存 / 检测。

  客户端持有游戏的所有战斗逻辑 / 战斗数据。根据每个客户端的逻辑结果相同的机制来保证游戏内容的一致性。

何为指令同步?

是一种以服务器逻辑为标准来驱动游戏的一种模式。大多数时候客户端只做表现 / 和发送用户指令。

即:服务端持有游戏所有逻辑,对游戏拥有绝对的权力。

  客户端主要接收用户的指令 提交到服务器,收到服务器处理结果进行表现。

这两种模式的一些比较?

帧同步:

  1.对开发的要求非常高,且测试过程非常艰难。

  2.而且对网络的消耗也要求比较高。并且对断线重连的支持非常不友好,也不支持中途加入游戏操作。

  3.帧同步确实能保证游戏的高度一致性。

  4.在架构完善后 对开发者很友好。

  5.服务端不用处理游戏的具体逻辑。

指令同步:

  1.对开发的要求不高,测试过程也比较友好。

  2.对网络的消耗也可以做到最低,把控性也高,可以给玩家做延迟补偿等,对断线重连 / 中途加入也有非常好的支持。

  3.游戏的一致性支持也很好。只是比起帧同步要处理的细节更多。

  4.从开发的线条来说,刚开始要做结构,后面就是要完成具体逻辑,双向开发,比起帧同步成本还是比较高的。

  5.服务端客户端都需要一套游戏的具体逻辑进行双向校验。

最近在做一个moba类的项目。主要负责战斗服务器这块,因为之前做过一段时间的 IO 游戏,最早也做过 RPG 游戏,对同步这块一直也没总结过,所以特开此页进行总结。

本次用到的一些技术体系和点具体内容:

  1.【语言选择】语言选择决定了开发的效率,后期维护的成本。选择一门适合当前这种应用的语言应该是开发的第一步了。本次开发我们选择了 Golang。因为 Golang 的支持库很完善,语法简洁,对并发的支持性好。开发效率可以说非常高了。

  2.【 UDP + KCP 】通讯方式的转变,最早的时候做这种同步的 RPG 基本也就是 TCP 协议了。在最近做 IO 的时候,领导提出了一种更好的方式 UDP + KCP 并且针对于 TCP 进行了测试,实际得到的性能和传输效率确实比 TCP 要高出很多,唯有一点就是会增加网络传输的数据量。事实证明这是一种拿数据流量换性能的模式,但在当下的网络环境里几乎可以忽略不计。

  3.【指令同步 + 逻辑帧】指令同步中使用逻辑帧的模式,之所以帧同步能保证游戏的高度一致,是因为它确定了消息的发送开始位置,也保证了玩家执行消息的顺序以及逻辑结果的一致性。而这里的逻辑帧概念也相差不大,服务器缓存一个逻辑时间的指令消息,也就是一次性处理一个逻辑帧的指令消息,然后下发所有结果。这样能保证客户端在基于逻辑帧消息上的执行结果相同,也提高了一致性,在忽略延迟偏差的情况下 它们的执行结果也应该是相同的。

  4.【 TCP + UDP 】连接模式组合,因为使用了 UDP + KCP 来提升网络中的传输效率,以保证客户端在相差不大的时间戳里接收到消息。但 UDP 是一种无连接协议,它以报文的方式进行传输,并且存在丢包的几率。所以考虑到以上 加入 TCP 连接来做 PING / PONG 这种校验连接正确性的操作,同时也用在一些不频繁的消息上,以减轻数据传输量以及丢包的几率。

暂时记录了这些 比较细的东西我之后会挑选一些接触到的来记录,然后形成一个服务器开发的类别吧。

MOBA战斗服务器设计思路的更多相关文章

  1. CMDB服务器管理系统【s5day87】:需求讨论-设计思路

    自动化运维平台愿景和服务器管理系统背景 服务器管理系统 管理后台示例 需求和设计 为什么开发服务器管理系统? 背景: 原来是用Excel维护服务器资产,samb服务[多个运维人员手动维护] 搭建运维自 ...

  2. Netty服务器连接池管理设计思路

    应用场景: 在RPC框架中,使用Netty作为高性能的网络通信框架时,每一次服务调用,都需要与Netty服务端建立连接的话,很容易导致Netty服务器资源耗尽.所以,想到连接池技术,将与同一个Nett ...

  3. 分享一个CQRS/ES架构中基于写文件的EventStore的设计思路

    最近打算用C#实现一个基于文件的EventStore. 什么是EventStore 关于什么是EventStore,如果还不清楚的朋友可以去了解下CQRS/Event Sourcing这种架构,我博客 ...

  4. ENode框架单台机器在处理Command时的设计思路

    设计目标 尽量快的处理命令和事件,保证吞吐量: 处理完一个命令后不需要等待命令产生的事件持久化完成就能处理下一个命令,从而保证领域内的业务逻辑处理不依赖于持久化IO,实现真正的in-memory: 保 ...

  5. Redis入门指南(第2版) Redis设计思路学习与总结

    https://www.qcloud.com/community/article/222 宋增宽,腾讯工程师,16年毕业加入腾讯,从事海量服务后台设计与研发工作,现在负责QQ群后台等项目,喜欢研究技术 ...

  6. ENode 1.0 - 消息队列的设计思路

    开源地址:https://github.com/tangxuehua/enode 上一篇文章,简单介绍了enode框架内部的整体实现思路,用到了staged event-driven architec ...

  7. Redis设计思路学习与总结

    版权声明:本文由宋增宽原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/222 来源:腾云阁 https://www.qclo ...

  8. 对RESTful Web API的理解与设计思路

    距离上一篇关于Web API的文章(如何实现RESTful Web API的身份验证)有好些时间了,在那篇文章中提到的方法是非常简单而有效的,我在实际的项目中就这么用了,代码经过一段时间的磨合,已经很 ...

  9. HTTP 协议的历史演变和设计思路

    HTTP 协议是互联网的基础协议,也是网页开发的必备知识,最新版本 HTTP/2 更是让它成为技术热点. 本文介绍 HTTP 协议的历史演变和设计思路. 一.HTTP/0.9 HTTP 是基于 TCP ...

随机推荐

  1. #if defined、#if !defined用法

    大型程序或者修改别人的程序时,当我们需要定义常量(源文件还是头文件 ),我们就必须返回检查原来此常量是否已经定义, if defined宏 就是用于检测的. 举个例子,如下: #define .... ...

  2. JAVA经典算法面试40题及答案

    现在是3月份,也是每年开年企业公司招聘的高峰期,同时有许多的朋友也出来找工作.现在的招聘他们有时会给你出一套面试题或者智力测试题,也有的直接让你上机操作,写一段程序.算法的计算不乏出现,基于这个原因我 ...

  3. Video Target Tracking Based on Online Learning—深度学习在目标跟踪中的应用

    摘要 近年来,深度学习方法在物体跟踪领域有不少成功应用,并逐渐在性能上超越传统方法.本文先对现有基于深度学习的目标跟踪算法进行了分类梳理,后续会分篇对各个算法进行详细描述. 看上方给出的3张图片,它们 ...

  4. [数据分析工具] Pandas 功能介绍(一)

    如果你在使用 Pandas(Python Data Analysis Library) 的话,下面介绍的对你一定会有帮助的. 首先我们先介绍一些简单的概念 DataFrame:行列数据,类似 Exce ...

  5. [国嵌攻略][108][Linux内核链表]

    链表简介 链表是一种常见的数据结构,它通过指针将一系列数据节点连接成一条数据链.相对于数组,链表具有更好的动态性,建立链表时无需预先知道数据总量,可以随机分配空间,可以高效地在链表中的任意位置实时插入 ...

  6. kafka producer生产数据到kafka异常:Got error produce response with correlation id 16 on topic-partition...Error: NETWORK_EXCEPTION

      kafka producer生产数据到kafka异常:Got error produce response with correlation id 16 on topic-partition... ...

  7. 虚拟主机、VPS以及云主机的区别和对比

    对于很多需要建网站的朋友来说,虚拟主机是必须要了解的基础知识.虚拟主机相对于VPS与云主机来说出现的较早,也是被大多数站长所了解的主机.很多人容易将这三者混淆,弄不清楚三者的联系与区别.那么虚拟主机. ...

  8. VUE之ECMAScript6(es6)

    es6:es:EMCAScript 6 (es2015)Emca:国际标准组织 1.常量和变量 const a = "hello" let:定义一个块级作用域的变量 需要先定义再使 ...

  9. Tomcat8配置Https协议,Tomcat配置Https安全访问,Tomcat Https配置

    Tomcat8配置Https协议,Tomcat配置Https安全访问,Tomcat Https配置 ============================== ©Copyright 蕃薯耀 2017 ...

  10. mysql插入数据后返回自增ID的方法,last_insert_id(),selectkey

    mysql插入数据后返回自增ID的方法 mysql和oracle插入的时候有一个很大的区别是,oracle支持序列做id,mysql本身有一个列可以做自增长字段,mysql在插入一条数据后,如何能获得 ...