《王者荣耀》技术测试版本出台的时候,延迟非常大,而且还是卡顿,现在看一下帧同步里面比较特别的地方。帧同步有点像在看电影,它传统的帧同步需要有buffer,每个玩家输入会转发给所有客户端,互相会有编号,按顺序输入帧。

比如我现在已经收到第N帧,只有当我收到第N+1帧的时候,第N这一帧我才可以执行。服务器会按照一定的频率,不同的给大家同步帧编号,包括这一帧的输入带给客户端,如果带一帧给你的数据你拿到之后就执行,下一帧数据没来就不能执行,它的结果就是卡顿。

网络绝对理想的情况下还好,但现实的网络环境不是这样的。帧同步要解决问题就是调试buffer,以前有动态的buffer,它有1到n这样的缓冲区,根据网络抖动的情况,收入然后放到队列里面。

这个buffer的大小,会影响到延迟和卡顿。如果你的buffer越小,你的延迟就越低,你拿到以后你不需要缓冲等待,马上就可以执行。但是如果下一帧没来,buffer很小,你就不能执行,最终导致的结果你的延迟还好,但是卡顿很明显。

如果调到帧同步的buffer,假如我们认为网络延迟是1秒,你抖动调到1秒,那得到的结果虽然你画面不抖动了,但是你的延迟极其高。如果连最坏的网络情况都考虑进去,buffer足够大,那么记过就跟看视频是一样的,平行的东西,看你调大条小。一些局部的措施我们都做过,都是一样的问题。


具体我们怎么优化卡顿的问题呢?

刚才提到该帧同步与buffer,这个buffer可以是1也可以到n,我们要解决我们的延迟问题,我们就让buffer足够小。事实上《王者荣耀》最后做到的buffer是零,它不需要buffer,服务器给了我n,马上知道是n,我收到n,我知道下一次肯定是n+1,所以我收到n之后马上就把n这一帧的输入执行了。


那么为什么不卡顿了,画面不抖动了?

最后一个关键点,是本地插值平滑加逻辑与表现分离。客户端只负责一些模型、动画、它的位置,它会根据绑定的逻辑对象状态、速度、方向来进行一个插值,这样可以做到我们的逻辑帧率和渲染帧率不一样,但是做了插值平滑和逻辑表现分离,画面不抖了,延迟感也是很好的。


做了这些后,我们还把TCP换成UDP,在手机环境下,弱网的情况下,TCP很难恢复重连,所以最后用了UDP来做。整体来说,在网络好的情况下,它延迟也是很好的,在网络比较差的情况下做插值,也是传统CS的表现。


我们经常见到角色A和B,有些客户端A在左B在右,有些是A在右B在左,帧同步逻辑上面AB之间的距离和坐标都是完全一样,但是画面上看到他们可能会不重合,那就是你把它们分离之后的表现。网络极其好的情况下,它应该是重合的,但是在网络差的情况下,可能会有些偏差。这里面是最重要的一块优化。


参考:

实时网络游戏-网络延迟时客户端显示问题

网络游戏客户端延迟处理

《王者荣耀》技术总监复盘回炉历程


Moba类游戏中如何处理网络延迟与卡顿相关推荐

  1. MOBA类和“吃鸡”游戏为什么对网络延迟要求高?

    作者:腾讯云技术社区 链接:https://zhuanlan.zhihu.com/p/54468154 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 我们知道,不同 ...

  2. 大白话总结类《王者荣耀》等MOBA游戏中的网络同步机制

    案例游戏: <英雄联盟> <王者荣耀>等PVP游戏 实际解决方案: 同步机制:不锁步的帧同步 网络:传输层的UDP配合应用层的可靠性检验 以下从问题出发讨论解决方案. 主要问题 ...

  3. 游戏中的网络同步机制(二) 王者荣耀对帧同步的应用

    转载自:https://www.jianshu.com/p/81050871cce7 参考 解密:腾讯如何打造一款实时对战手游 从<王者荣耀>来聊聊游戏的帧同步 <王者荣耀>技 ...

  4. MOBA类游戏解决方案

    一.行业综述 MOBA是英文Multiplayer Online Battle Arena Games的缩写,意为多人联机在线游戏竞技.2003年,暴雪发布发布实时RTS游戏<魔兽争霸>, ...

  5. 谈一款MOBA类游戏的服务端架构设计

    一.前言 <码神联盟>是一款为技术人做的开源情怀游戏,每一种编程语言都是一位英雄.客户端和服务端均使用C#开发,客户端使用Unity3D引擎,数据库使用MySQL.这个MOBA类游戏是笔者 ...

  6. 谈一款MOBA类游戏《码神联盟》的服务端架构设计与实现(更新优化思路)

    一.前言 <码神联盟>是一款为技术人做的开源情怀游戏,每一种编程语言都是一位英雄.客户端和服务端均使用C#开发,客户端使用Unity3D引擎,数据库使用MySQL.这个MOBA类游戏是笔者 ...

  7. 谈一款MOBA类游戏《码神联盟》的服务端架构设计与实现 (转载)

    原文链接 一.前言 <码神联盟>是一款为技术人做的开源情怀游戏,每一种编程语言都是一位英雄.客户端和服务端均使用C#开发,客户端使用,数据库使用MySQL.这个MOBA类游戏是笔者在学习时 ...

  8. 游戏中的网络同步机制(一)帧同步Lockstep

    转载自:https://www.jianshu.com/p/64b3f162dcf4 参考游戏中的网络同步机制--Lockstep 一.前言 每个人或多或少都接触过网游,那个虚拟的世界给予了我们无穷的 ...

  9. 基于springboot和vue的MOBA类游戏攻略分享平台【附项目源码】

    基于springboot和vue的MOBA类游戏攻略分享平台 开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7 数据库工具: ...

最新文章

  1. 《Javascript入门学习全集》 Javascript学习第二季(实战4)
  2. Go 语言——Tensorflow
  3. 预发布环境,Tag发布机制和可重复的部署过程
  4. java: String的==与equals
  5. 2017寒假第一篇随笔(寒假作业一)
  6. python json.dumps慢_python json.dumps中文乱码问题解决
  7. TensorFlow学习笔记01:TensorFlow入门
  8. 008_MAC 终端使用技巧
  9. 老师,对不起,我古诗背串了...
  10. np.unique 的实现
  11. XML数据库与db4o的简要对比
  12. kaios好用吗_如何评价Kai Os?
  13. SRS:软件需求规格说明书
  14. win10键盘失效问题
  15. matlab mallat算法,小波分解与重构1Mallat算法.PDF
  16. 亚马逊跨境电商如何运营模式?
  17. h5自动播放视频且有声音的办法
  18. nb服务器协议,nb-iot协议详解
  19. C#中绘制三维模型的方法——面面拉伸
  20. Ernie-SimCSE对比学习在内容反作弊上应用

热门文章

  1. JavaC++题解与拓展——leetcode728.自除数【跳出多层循环,vector at】
  2. 安装esxi6.X系统过程
  3. iOS 如何连接打印机
  4. Winrar制作自解压安装程序
  5. 怎样写一个拼写检查器-贝叶斯-python
  6. 手机闪存速度排行_手机闪存性能排行
  7. 某计算机系统20位地址线 8位数据线,同济大学2009-2010(1)微机原理期终试题(A B卷)含答案.doc...
  8. 成成你好呀笔记整理(知识点合集二)
  9. csgo国服文件转国际服务器,CSGO国服怎样转国际服 1个打开项搞定
  10. 【Flutter从入门到实战】⑪、豆瓣案例-1、星星评分Widget、虚线Widget、TabbarWidget、BottomNavigationBarItem的封装、初始化配置抽取