帧同步
简单来说,就是相同的状态+相同的指令+ 按帧顺序执行=相同的结果。
状态:所有客户端确保逻辑一致,接收一样的随机种子(randomseed),一样的房间信息;
指令:服务器只负责收集接收每个客户端操作指令(cmd),转发指令,服务器以恒定帧率(30帧1秒)派发指令,没有指令或指令没有变化也需要派发;
执行:真正游戏逻辑由各个客户端单独计算 ,客户端需要收到服务器派发的指令才能推进逻辑,没有收到指令时不能推进逻辑(LockStep)
顺序执行
帧同步会必定按到从第一帧开始一帧一帧的执行,才能保证运行结果一样,跳帧会导致逻辑不一样,如果玩家网络不好,则会在当前帧等待至下一帧的接受,如果丢包超时,则会再次发出需要帧的请求。
追帧
什么是追帧:当前玩家播放到帧比服务器的帧落后时,服务器下发多个帧,玩家便要开始快进到服务器当前帧
为什么要追帧:如果网络波动,服务器会有最晚的接受帧时间,
做法:超过则下次发送多个帧,然后快进播放(多次DoAction),快进期间,不播放特效音效等不影响运行结果的逻辑
重连
做法:接受从0开始所有帧重新快速播放到当前帧,如果帧列表count大于规定速度则按照最大速度播放,否则按照剩余的count播放相应次数的帧。
优点
第一,它的开发效率比较高。如果你开发思路的整体框架是验证可行的,如果你把它的缺点解决了,那么你的开发思路完全就跟写单机一样,你只需要遵从这样的思路,尽量保证性能,程序该怎么写就怎么写,服务端逻辑简单,只需要负责转发指令,压力也小。
资料来源于网络若侵权联系删除
提到王者荣耀这款游戏相信大家更不会陌生,说不定刚才你就和好友一起开了一把黑。游戏的开发是非常有经验和熟练的程序员的工作。它可能花费数亿美元。这是一项非常有创意的工作,也需要技术水平。他们需要具有特定需求的编程语言。但是对于学习编程的你们来说有好奇过游戏的来历吗?今天我们一起看看王者荣耀它究竟是由什么编程语言开的!
王者荣耀 属于moba游戏和英雄联盟属于同一级的类型,今天我们一起来分析一下moba游戏如何开发,首先是moba称为多人在线战术型游戏,又称动作即时战的游戏,这个游戏最重要的是为了获得更好的游戏同步,一般moba类的游戏采用的是帧同步,王者荣耀就是帧同步。帧同步能在玩家做出技能指令的时候英雄可以以最快的时间同步技能指令。
游戏服务器,每隔一段时间,逻辑端采集各个客户端的网站操作,然后把采集到的软件操作发往每个客户端,客户端就是来计算游戏逻辑,根据同样的玩家出一家同样的代理得到同样的游戏,这样每个客户端就能获得服务器,每隔一段时间,这个段时间当然是越短越好。王者荣耀在有自己的项目情况下,c++做服务器性能非常的好,同时技术也非常的成熟。
王者荣耀项目组也是之前做的一个项目转变而来,技术也积累了一下,服务端也有自己的一个框架。游戏美术分为游戏原画,角色建模,场景建模,动作立体特效,游戏UI的部分组成。原画负责设计每个英雄的美术风格,外形,平面,地图等角色建模,根据原画把每个角色模型都建好,模型建好后。动作美术搞好动画特效,游戏场景也类似原画设计后,场景建模人员见3D场景模型打上光照,最后烘焙场景出来。持续使用王者荣耀的策划者,各职业的平衡也设计的非常好,这也是它受广大玩家喜欢的原因之一。
首先要知道游戏类型是什么,然后知道承载人数是多少,以及开发周期多少。需要根据这些来决定游戏架构和技术选型。
对于gameplay来说,本身就是个大循环,一定频率进行tick,接收来客户端或者其他服务器的rpc,处理逻辑,然后数据落地以及发送数据给客户端或者其他服务器,一般gameplay来说在同一个进程里都是同步的方式去编写,同步的实现大多数是单线程的,或者使用coroutine来实现actor这种模式。大部分游戏交互都是比较多,所以不论service和service之间的交互还是玩家和玩家之间的交互,如果考虑多线程的同步的问题,会非常复杂以及很容易做错,所以一个service内同一个时刻都是在一个线程中执行的。
针对mmo或者一些竞技类游戏往往有场景管理的概念,就是游戏AOI,比如一个玩家移动,需要告诉周围所有的玩家,复杂度在n*n,如果减少这个n,就有了AOI算法,比如九宫格,十字链表等,如果刚开服的时候很多人挤到一个主城中,就算采用九宫格和十字链表等AOI等算法,往往同屏内玩家数量还是很大,客户端渲染的单位数量比服务器少一个数量级的,所以场景管理这里还可以有个分线的做法,玩家多的时候,不同线不可见,玩家少的时候进行合并。
如果做帧同步一些关键点为表现要和逻辑分离,随机算法和随机种子的一致性,数学库浮点换定点,三角函数采用泰勒展开或者查表法,需要保序的容器,timer不能基于钟表时间而需要帧timer,以及防作弊(一般都是投票法,或者服务器跑个验证端)
现在很多游戏在线更新bug甚至不停服更新慢慢变成一种强需求了,实现这种方式主要使用脚本热更新,热重启+逻辑内存以及ab服切换来实现。
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)