io&H5游戏开发用到的技术和注意的事项

内容来源:2017年6月18日,顽梦数码科技程序员大城小胖在“2017 iWeb峰会·第六届HTML5峰会”进行《Connecting People ---- 独乐乐 不如众乐乐》演讲分享。IT 大咖说(ID:itdakashuo)作为独家视频合作方,经主办方和讲者审阅授权发布。

阅读字数:2212 | 6分钟阅读

获取嘉宾演讲视频及PPT,请点击:http://t.cn/RD8OJ9k

摘要

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,可以改善拥堵的问题。

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

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

你可能感兴趣的:(io&H5游戏开发用到的技术和注意的事项)