前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Connecting People ---- 独乐乐 不如众乐乐

Connecting People ---- 独乐乐 不如众乐乐

作者头像
IT大咖说
发布2018-04-03 17:28:00
7000
发布2018-04-03 17:28:00
举报
文章被收录于专栏:IT大咖说IT大咖说
摘要

io游戏大致是指具有多人对抗+地图限制+死后即刻复活等为特点的休闲moba类竞技游戏,在近几年内发展迅速。

视频内容

io&HTML5

HTML5这个领域在过去的一年多并不平静,大家都在跃跃欲试。

从去年开始有一种以“.io”为结尾的游戏闯入人们视野,今年发展更加壮大。http://iogames.space是一个io游戏的聚合网站,在上面可以试玩体验很多io游戏。

我今天想要分享的是我们在io游戏在开发时要用到的技术和注意的事项。

在此之前我先了解一下所有网游的基本原理。就是客户端输入一些东西传到服务器,服务器做一些处理,把最新坐标计算出来,再返回给客户端。客户端根据最新的坐标渲染去渲染这个角色的最新坐标。无论什么网络游戏,其核心原理都是这样。

TCP vs UDP

我们在做网游的时候都会涉及到底层协议的选择,对TCP和UDP进行全面的比较,而有些人还会尝试综合使用。

在HTML5领域里我们没有太多的选择。Ajax无法实时响应;WebRTC现在不够普及,即使将来普及了,在做联机游戏的时候会有一些天生的瓶颈。所以我们唯一的选择就是Websocket,协议也就只能使用TCP。

现在越来越多的游戏在尝试使用TCP,它是现在很流行的一种技术。用Websocket做网络游戏是完全可行的。

优化

Websocket在网络上有一些天生的缺点,还是要尝试优化。

我们尽量采用二进制数据。

在存数据包的传输时,已经有很成熟的一些协议和技术来帮助我们做技术压缩。Protobuf是谷歌领先创立的一个协议,有很多实现,我们可以用它来做数据压缩。Protobuf非常强大,不仅可以用于做数据压缩,还有协议的一些定义等等,使用起来比较复杂。

Msgpack是一个更简单的协议,网上有各种各样的实现,它们之间的性能或者API接口都会有一些细微的差别,大家可以根据自己的需求选择。

避免使用“纳格算法”,现在浏览器里的Websocket都已经关闭了纳格算法。选服务端模型的时候需要注意这一点。

还有一个优化方式就是使用多路Websocket解决TCP拥堵问题。一个服务端跟服务器之间并不仅仅建立一个Websocket链接,会建立若干个链接,同时传输数据。来解决TCP协议天生的缺陷。

影响体验的网络因素

常见的因素有带宽、Ping值、丢包、往返传输时间和命令等候队列。其中最重要的是带宽、Ping值和丢包,这三条是无解的问题。

性能优化的本质

性能优化的本质是用户体验的优化,而用户体验优化中最后的救命稻草是“欺骗”。

比如进度条就是对用户最好的欺骗,以及很多UI层面的动画都是一种“欺骗”,让用户觉得自己没有在干等,或者让用户产生错觉,觉得性能并不差。

在网络游戏中也是同样的道理,我们永远无法解决网络的带宽、Ping值和丢包这些问题的时候,我们能做的就是“欺骗用户”,让用户觉得网络很流畅,游戏不卡顿。

“骗术”

客户端有两种常见的“骗术”,一种是客户端加入插值延迟,用户看到的移动的角色并不是真实的自己,而是一个插值计算后的结果。

另一个是预测。用户按了一个键后,把这个发给服务端的红石,客户端自己先进行预测,然后根据服务端返回的结果来修正客户端预测的结果。客户端预测降低服务端的推送频率。

当游戏并不是强竞技类的时候,可以不再强求一致性,服务器不再权威,可以放弃一些东西,采用新的技术来处理问题。

将错就错

选项一:A打到了B,但是B没有死。

选项二:A没有打B,但是B突然死了。

这两种情况中,选项一是更好的做法。选项一满足了攻击方的视觉体验,也满足了被攻击方的结果预期。

修正

像守望先锋这种大型的比较复杂的游戏,或者是对竞技性、公平性要求高的游戏,服务端会缓存历史状态,当发生争议的时候可以倒带,根据过去某个时间点的情况来进行判断,然后再重播,达到同步。

本质

联机游戏的本质就是要处理三个问题:你眼中的你、服务器眼中的你和别人眼中的你。

每一个游戏玩家都有三个这样的克隆体,而这三者间总会有各种各样的差异。我们在技术允许的条件下可以用各种手段去更精确地判断。

核心原则就是把这三者处理好,让它们尽可能一致、尽可能的自然。

NPC

NPC是非玩家控制角色,通常由服务端进行管理,但在游戏架构上来讲,会把这部分隔离开。有很多网游会设计一个专门的机器来跑NPC,而对于真正的游戏客户端来说,NPC也是一个玩家,这种架构能让游戏服务端很多逻辑变得非常简单。

NPC伪客户端可以放在服务端,也可以放在独立的一台服务器上,甚至还可以用一些技术把它委托给玩家。

这其中很多细节还是要结合游戏的玩法、类型以及自己真实网络的情况等等来做选择,没有完美的标准答案。

定性AI

在算法上保证NPC行为的“可确定性”,客户端各自处理NPC,无需同步NPC数据,尽量避免“混沌理论”。

混沌理论

混沌理论是关于非线性系统在一定参数条件下展现分岔、周期运动与非周期运动相互纠缠,以至于通向某种非周期有序运动的理论。

定性AI与NPC

做好关键元素的网络同步,使用可控的随机因子,客户端缓存NPC历史数据,客户端对NPC行为进行修正。

单路TCP

客户端通过一个Websocket往服务端传送四个数据。

TCP拥堵

数据包①传过去了,在传数据包②的时候发生了拥堵。因为TCP是一个可靠的传输协议,它会保证数据包的顺序。所以②堵住了,后面的③、④都会拥堵。TCP底层发现拥堵的时候会等待、尝试重试等等。这也是TCP不如UDP很重要的一点。

多路TCP

多路TCP就是客户端连服务端的时候会起多个Websocket,可以改善拥堵的问题。

在过去的十几年,服务端相关的技术变化并不大,变化的主要是我们的网络环境、部署情况、运维策略等等。但是在游戏逻辑层,在处理延迟这个问题上,逻辑是差不多的。

我今天的分享就到这里,谢谢大家!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-10-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT大咖说 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档