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

摘要

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

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

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

原文发布于微信公众号 - IT大咖说(itdakashuo)

原文发表时间:2017-10-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IT 指南者专栏

五月福利,吐血整理,重磅推荐,我坚信总有你需要的

好了,废话就讲这么多,开始进入今天的主题。鉴于大家现在的需求,这个月主要分享以下几个福利:

1566
来自专栏IT 指南者专栏

五月福利,吐血整理,重磅推荐,我坚信总有你需要的

大家都知道,从上个月开始,这个公号「compassblog」每月都会至少送出一次福利,并且这些福利涵盖学习资料、工具推荐、编程资源、抽奖送钱等等,当然啦,抽奖可...

41618
来自专栏新智元

号外!谷歌宣布封停Google+,50万用户信息泄露

新智元报道 来源:blog.google,TechCrunch,The Wall Street Journal ,techxplore 编辑:三石

1114
来自专栏Crossin的编程教室

爬虫+网站开发实例:电影票比价网

时常有同学会问我类似的问题:我已经学完了 Python 基础,也照着例子写过一点爬虫代码 / 了解过 django 的入门项目 / 看过数据分析的教程……然后就...

4215
来自专栏沈唁志

总结5条对学习Linux系统有帮助的经验心得

2114
来自专栏IT技术精选文摘

解密腾讯海量服务之道

一直对腾讯做产品的能力比较敬佩的,我们组做消息推送系统,而腾讯的信鸽就是我们学习的榜样。京东很多做产品的思想是跟腾讯学的,而京东很多同事也从腾讯过来的(京东合并...

6515
来自专栏数据库

DaaS,聊聊关于数据库你可能想知道的一些事儿

作为一名程序猿,如今“大数据”, “AI”,这些词每天都会被媒体360度无死角轰炸我们,让我们很容易浮躁焦虑,但不得不承认,真是因为媒体的传播与吹捧,才推动了整...

1877
来自专栏腾讯技术工程官方号的专栏

SDCC 2017 深圳站应用架构及大数据双峰会

前言 6月10-11日,2017年SDCC峰会在深圳举行。为期两天的会议邀请业内顶尖的架构师和数据技术专家分享干货实料。来自腾讯TEG架构平台部的Jerome以...

2145
来自专栏有趣的Python和你

Django开发之简书推荐作者可视化

折腾了几天,终于完成了第一个web开发项目,其中乐趣多多,坑也是巨多,听我娓娓道来之前,按例给大家上网站链接:

792
来自专栏SDNLAB

OpenBox项目及相关介绍

知道OpenBox源于SIGCOMM 2016的会议,这个会议的影响力在计算机和通信领域的专家相信都知道,CCF推荐的A类会议,一年接收文章的数量也就在30篇左...

3443

扫码关注云+社区