帧同步和状态同步(二)案例分析

转自:http://www.gameres.com/489361.html

腾讯一下出了两款MOBA游戏,全民超神,王者荣耀,玩了一下,效果不错,就分析了一下它底层的一些技术,发现一个是采用的状态同步,TCP协议,另一个是采用的帧同步,UDP协议。自从去年了解到即时游戏帧同步这门技术,我就一直关注使用这个技术的游戏,一直没有发现,虽然我们自己的游戏也是采用的帧同步,毕竟还没有上线,现在线上有帧同步的游戏,效果还挺好,有点小激动。所以就写了这篇文章,分享出来大家一块研究。

  先说一些题外话,感慨一下,没兴趣的直接略过。

  做了这么多年游戏了,深深知道一个游戏的成功需要多方面的因素,不仅需要人和,有的时候也需要天时地利,但作为一个游戏开发者而言能决定就是人和,而这也是游戏能成功的基础,有一帮人能够全身心的投入去开发一款游戏,不断的打磨甚至调整方向,面对问题能够及时反馈,不断迭代,就像做一个互联网产品一样,在这个过程中团队里的所有人都能够互相信任,不厌其烦的对产品进行改动,每一次的信任来源不是为大家打鸡血画饼,而是实实在在的数据分析以及努力总结原因后的理性决策。如果以上能够坚持的话,先不说创新,最起码游戏可以做到某一品类的极致,我想在任何的市场环境下,只要这个品类还没死,总有你的一席之地,在我看来很多游戏死了,很多原因是做的还不到位,向当年抄COC的游戏很多,最后缺没有一款成功的,而截至到目前COC的利润还在不断上升,如果国内抄袭者真能做到COC的一样的体验,我想一定会有成功的。

  那又有人要说了,怎样才能做的比别人还好呢,这个问题确实比较复杂,我感觉首先一定要有合适的人,什么是合适的人呢,从3个方面考察:责任心积极性、学习能力、能力,我把能力放在最后是因为如果前面两个条件满足的情况下,这个人一定会变得有能力,然后就是需要有个高的要求,目标就是精品,这个不是光说说就行了,从策划设计,程序实现,美术都要向着最高的标准要求,要比市面上的都要优秀,绝对不会为了各种其他因素(时间点,实现复杂)有任何妥协。最后是需要有点耐心,合理安排计划时间,高效率完成,其实这点事最难的,团队里的人很多,游戏制作有的时候经常需要反复,经常就是初期很有激情,中期不断磨灭,到了后期(尤其是项目遇到困难时候)就比较松懈了,如果是没有耐心的人估计在一起继续工作都是问题了,还怎么谈之前的事情。团队是需要打磨的,如果你有一支这样的团队,那真的要好好的珍惜。

  好了,这是我对于游戏开发的一些感慨,还是回归正题吧,对于一个游戏来讲,战斗就是灵魂,如果战斗做不到极致,其他方面做的再好也是徒劳,这几年,也参与了很多游戏的开发,其中有很多游戏是从决策到死掉全程参与,深有感慨。从端游到页游 从页游再到手游 每一个新市场机会出现的时候,都是从闭着眼睛就能赚钱到大部分赚不到钱过度,对游戏的开发技术都要求也是越来越高,只不过每个市场到成熟的时间都被大大缩短了。对于战斗来讲很多都是策划脑补的跟实际做出来的完全不是一回事,很多原因都是战斗方案选型就是错误的。

  从程序角度来讲,我把战斗从两个维度分类:

  1、从操作方式上分为回合操作、即时操作。

  2、从交互方式上分为 离线战斗 联网战斗,这个地方需要说明一下,有些游戏虽然也能进攻别人,例如COC 但是因为战斗的时候,另外一个人是不可以操作的,类似于这样的战斗也可以称为离线战斗。

  基本上所有的战斗都是以上两种方式在某种程度的组合而已,例如梦幻西游可以认为是联网战斗、回合操作类型。

  最近比较火的全民超神,王者荣耀,属于 (联网战斗|离线战斗)即时操作类型。

  最新网易出的功夫熊猫 属于 (联网战斗|离线战斗)即时操作类型,相对于dota类的全民超神、王者荣耀,他对延迟要求的更高了。

  如果在立项初期,项目计划时候不确定游戏的操作类型,以及网络要求,做得后期要想调整的话,改动是致命的,假设按照之前时空猎人的方式实现的纯离线战斗及时游戏,最多也只能做做离线PVP,如果想增加联网PVP的功能的话,对于程序来讲几乎需要重写战斗。

  随着移动游戏市场越来越成熟,对于战斗的要求也在提高,原来做一款ARPG,只有单机玩法就足够了,不需要开发实时PVP,但是现在市面上的ARPG不仅可以联网PVP,甚至可以联网组队PVE了,所以我感觉如果现在再去做游戏的话,只是一个单机玩法,或者是离线PVP玩法已经远远不能满足现代玩家的口味了。

  我认为现在战斗系统需要满足一下几点。

  1、一定要有离线PVE玩法,或者离线PVP玩法,可以在让玩家在网络不好的时候消遣,节省流量。(全民超神、王者荣耀在5V5匹配时候都有一定几率匹配到离线战斗,这个时候是不耗流量的,其他人全是AI控制的)

  2、一定要有在线PVP,在线PVE,能够让玩家在网络比较好的时候,实时竞技。增加可玩性。

  3、战斗中,尽最大程度节省玩家的流量,例如全民超神这款游戏,一场30分钟的战斗基本上要消耗掉20M的流量,而且此类游戏大部分是玩的联网战斗,基本上在非wifi情况下没法玩。

  4、需要有战斗回放机制,可以让策划设计离线玩法的时候更自由,例如COC,战斗回放基本变成了它游戏的一部分。

  5、防作弊,如果有离线玩法的话,一定有机制对离线玩法的结果进行验证,要不然等你游戏真火了,你就知道错了。

  6、实现难度相对较低。

  对于联网游戏来讲,同步的方式主要分为两种,状态同步、帧同步。

  1、状态同步:顾名思义,是指的将其他玩家的状态行为同步的方式,一帮情况下AI逻辑,技能逻辑,战斗计算都由服务器运算,只是将运算的结果同步给客户端,客户端只需要接受服务器传过来的状态变化,然后更新自己本地的动作状态、Buff状态,位置等就可以了,但是为了给玩家好的体验,减少同步的数据量,客户端也会做很多的本地运算,减少服务器同步的频率以及数据量。

  2、 帧同步:RTS游戏常采用的一种同步技术 ,上一种状态同步方式数据量会随着需要同步的单位数量增长,对于RTS游戏来讲动不动就是几百个的单位可以被操作,如果这些都需要同步的话,数据量是不能被接受的,所以帧同步不同步状态,只同步操作,每个客户端接受到操作以后,通过运算可以达到一致的状态(通过随机种子保证所有客户端随机序列一致),这样的情况下就算单位再多,他的同步量也不会随之增加。

  下面我们从以上的5个方面对各自实现方式进行描述:
id="iframe_0.9020318946303958" src="data:text/html;charset=utf8,%3Cstyle%3Ebody%7Bmargin:0;padding:0%7D%3C/style%3E%3Cimg%20id=%22img%22%20src=%22http://www.gameres.com/data/attachment/forum/201602/29/1021578dxy22edkkaeeew5.jpg?_=5283265%22%20style=%22border:none;max-width:1569px%22%3E%3Cscript%3Ewindow.onload%20=%20function%20()%20%7Bvar%20img%20=%20document.getElementById('img');%20window.parent.postMessage(%7BiframeId:'iframe_0.9020318946303958',width:img.width,height:img.height%7D,%20'http://www.cnblogs.com');%7D%3C/script%3E" frameborder="0" scrolling="no" style="border-width: initial; border-style: none; width: 1569px; height: 276px;">

  总结一下:

  1、对于回合制战斗来讲,其实选用哪种方式实现不是特别重要了,因为本身实现难度不是很高,采用状态同步也能实现离线战斗验证。所以采用帧同步的必要性不是很大。

  2、对于单位比较多的RTS游戏一定是帧同步,对于COC来讲,他虽然是离线游戏,但是他在一样输入的情况下是能得到一样结果的,所以也可以认为他是用帧同步方式实现的战斗系统。

  3、对于对操作要求比较高的,例如MOBA类游戏有碰撞(玩家、怪物可以互相卡位)、物理逻辑,纯物理类即时可玩休闲游戏,帧同步实现起来比较顺畅,(有开源的Dphysics 2D物理系统可用 它是Determisti的)。

  4、对于战斗时大地图MMORPG的,一个地图内会有成千上百的玩家,不是小房间性质的游戏,只能使用状态同步,只同步自己视野的状态。    

  5、帧同步有个缺点,不能避免玩家采用作弊工具开图。

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

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

相关文章

leetcode279 完全平方数

给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。 示例 1: 输入: n 12 输出: 3 解释: 12 4 4 4. 示例 2: 输入: n 13 输出: 2 解释: 13 4 9. 思路&#xf…

推荐系统(1)-概述

推荐系统概述1.数据部分2.模型部分2.1模型的组成2.2模型的训练2.3模型评估《深度学习/推荐系统》读书笔记推荐系统要处理的问题:对于用户U(user),在特定的场景C(context),针对海量的“物品信息”,构建一个模型f(U,I,C)f(U,I,C)f(U…

(十七)深入浅出TCPIP之UDP打洞原理

专栏其他文章: 理论篇: (一)深入浅出TCPIP之理解TCP报文格式和交互流程 (二)深入浅出TCPIP之再识TCP,理解TCP三次握手(上) (三)深入浅出TCPIP之再识TCP,理解TCP四次挥手(上) (四)深入浅出TCPIP之TCP三次握手和四次挥手(下)的抓包分析 (五)深入浅出TCPIP之TCP流…

leetcode240. 搜索二维矩阵 II

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性: 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 示例: 现有矩阵 matrix 如下: [ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6…

NAT原理

网络地址转换(NAT,Network Address Translation)属接入广域网(WAN)技术,是一种将私有(保留)地址转化为合法IP地址的转换技术。下面介绍两类不同方式实现的NAT:NAT(Network Address Translators):称为基本的NAT在客户机…

推荐系统(2)-协同过滤1-UserCF、ItemCF

协同过滤1.CF概述2.数据表示3.衡量相似度4.共现矩阵5.UserCF6.ItemCF7.UserCF 与ItemCF 应用场景、主要缺陷8.基于UserCF 电影推荐demo《深度学习/推荐系统》读书笔记推荐系统的发展一日千里 传统的推荐模型(2010年前后):协同过滤、罗辑回归、因子分解、梯度提升树 …

sql查询实例1(学生表_课程表_成绩表_教师表)

表架构 Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 SC(S#,C#,score) 成绩表 Teacher(T#,Tname) 教师表 建表语句 CREATE TABLE student ( s# INT, sname nvarchar(32), sage INT, ssex nvarchar(8) ) CREATE TABLE course ( c# INT, cname…

android 存储方式以及路径简介

存储分成了内部存储和外部存储。注意内部存储又叫做机身内存,而且内存又包含了两个部分RAM(运行时内存,这个和运行速度有关系,是手机运行时存储数据和指令的地方)、ROM(这个才算是真正存储东西的内部存储范围,是应用配置和其他数据的地方);而外部存储就很明确了,用户的外部挂…

MachineLearning(11)-关联规则分析

关联规则分析1.简单来说-关联规则2.经典关联规则挖掘-Apriori1.简单来说-关联规则 关联规则–通过量化的数字描述物品甲的出现 对 物品乙的出现 有多大影响。 最早是为了发现超市销售数据库中不同的商品之间的关联关系:哪组商品可能会在一次购物中同时购买。 广泛…

APK 安卓反编译

在学习Android开发的过程你,你往往会去借鉴别人的应用是怎么开发的,那些漂亮的动画和精致的布局可能会让你爱不释手,作为一个开发者,你可能会很想知道这些效果界面是怎么去实现的,这时,你便可以对改应用的A…

sql查询实例2(借书卡、图书、借书记录)

问题描述: 本题用到下面三个关系表: CARD 借书卡。 CNO 卡号,NAME 姓名,CLASS 班级 BOOKS 图书。 BNO 书号,BNAME 书名,AUTHOR 作者,PRICE 单价,QUANTITY 库存册数 BORROW 借书记录。 CNO 借…

开始学习Unity3D(一)

本人最近转行开始做海外独立游戏的发行,主要是负责服务器,开会注意到海外的服务越来越丰富越来越细分,对国内将会造成很大的冲击,比如AWS,Google,GameSparks等,这导致国内的所谓服务器开发将越来越简单,国内对服务器开发的需求越来越少,反而客户端的需求越来越多,所以…

List 流的使用

摘要 本文将介绍在 Java 1.8 中对 List 进行流操作的使用方法。引入的 java.util.stream 包为开发者提供了一种更为便捷和强大的方式来处理集合数据。通过使用流,我们能够以声明性的方式进行集合操作,减少了样板代码,提高了代码的可读性和可…

推荐系统(3)-协同过滤2-矩阵分解算法

协同过滤-矩阵分解算法1.奇异值分解2.梯度下降3.矩阵分解方法的优缺点《深度学习/推荐系统》读书笔记(其实矩阵分解和协同过滤已经没有特别大的联系了) 2006年,在Netfilx举办的推荐算法竞赛中Netflix Prize Challenge中,以矩阵分解…

leetcode141 环形链表

给定一个链表,判断链表中是否有环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。 示例 1: 输入:head …

iPhoneX适配

目录(?)[-]核心代码自动化修改代码参考资料iPhoneX适配,比较搓的一种方式,在不修改分辨率(720 x 1280)的情况下适配iphone X 主屏尺寸: 5.8英寸 主屏分辨率: 2436 x 1125核心代码修改 工程目录/Classes/Un…

centos安装nginx,配置负载均衡

1、安装nginx安装教程,参照:http://mp.weixin.qq.com/s/RVaRlRpHqZRjCaXGmOlfKw 2、反向代理的配置修改部署目录下conf子目录的nginx.conf文件的内容[html]view plaincopylocation / { #设置主机头和客户端真实地…

leetcode142 环形链表II

给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有…

PaperNotes(18)-VectorNet- Encoding HD Maps and Agent Dynamics from Vectorized Representation

自动驾驶论文阅读笔记11. Ployline Garph2. Global Graph3. 模型目标函数4.Related work5.Experiment5.1 实验设置5.2 消融实验5.3 模型资源消耗5.4 与其他模型的对比实验VectorNet- Encoding HD Maps and Agent Dynamics from Vectorized RepresentationVectorNet: 通过矢量化…

ubuntu的apache配置https

一、配置Apache 1、开启SSL模块a2enmod ssl 2、启用SSL站点a2ensite default-ssl 3、加入监听端口vi /etc/apache2/ports.conf #编辑Apache端口配置,加入443端口 Listen 443注:Ubuntu启用SSL站点后,缺省已经加入了 (…