lsldd的专栏

技术的鞭笞中,我猥琐前进

快节奏多人在线游戏网络入门系列教程(1):简介

简介

该系列教程主要讨论快节奏多人在线游戏的网络相关的技术和算法。这是该系列教程的第一章,如果你对多人在线游戏有一定了解,可以跳过本章。
开发任何一款游戏都是一个挑战性的任务。而多人在线游戏增加了更多新的问题。有趣的是,这些问题的核心恰恰与人类的天性息息相关。

作弊问题

作弊,是一切问题的根源。
作为一个游戏开发者,单机游戏是无所谓玩家作弊的——因为玩家的行为只影响他自己。作弊玩家的行为可能会获得一些开发者预料之外的游戏体验,然而这毕竟是玩家自己的游戏,他们有权去做任何自己想做的事。
网络游戏完全不同。任何网络竞技游戏,一个作弊的玩家不仅仅提高他自己的游戏体验,而且会降低其他玩家的游戏体验。作为开发者,你必须想办法避免这种情况,否则必将会导致玩家的流失。
有很多方法来反作弊,然而最重要的(或者说最有意义的)一件事,简单说来就是:永远不要相信玩家 。永远考虑最坏的情况——玩家总是会想方设法的作弊。

权威服务器与无权客户端

看上去最简单的解决方案很容易得出——让所有事情都发生在服务器上,这样你就能把控一切,而客户端仅仅作为服务器的观众,即客户端只是发送输入(键盘鼠标,命令等)到服务器,服务器运行游戏,然后反馈游戏结果给客户端。这种做法叫做权威服务器(authoritative server),因为游戏世界中的所有一切,都是在唯一的服务器上发生的。
当然服务器可能会容易遭到攻击,然而这不是本文探讨的内容。使用权威服务器确实能够避免很大范围内的“黑客”行为。例如,你不相信玩家的生命值,一个“黑客”玩家可能会修改他本地的生命值到100倍,然而服务器知道实际上该玩家生命值只有10%——无论客户端怎么想,当玩家再次受到攻击时他该死就得死。
同理,你也不会相信玩家在游戏世界中的位置坐标信息。例如,一个“黑客”玩家会告诉服务器“我现在位置是(10,10)”,而一秒钟后他穿越了一道不可逾越的墙,或者移动的比其他玩家都快,报告服务器说“我现在位置是(20,10)”。因此,正确的做法是,服务器知道该玩家位置在(10,10),客户端告诉服务器“我要右移一个单位”,服务器更新自己的游戏状态,将该玩家移动到(11,10),然后告诉该客户端“你现在的位置是(11,10)”。该过程如下图所示。


简单的客户端-服务器交互

总而言之,游戏的状态由服务器单独管理。客户端发送交互信息给服务器,服务器周期性的更新游戏状态,然后返回游戏状态给客户端,而客户端仅仅负责渲染结果。

网络延迟

上述处理对于慢节奏的游戏——策略类、棋牌类游戏而言工作的很好。对于局域网游戏也能很好的胜任,因为局域网的延迟非常低。然而对于因特网上的快节奏多人在线游戏,会发生很多问题。
我们在物理上讨论下问题根源。假设你在旧金山,服务器在纽约,距离为4000km。即使是光速走完这么长的距离,也需要13ms。
这个时间看上去很快,然而,在实际中,数据包在路由器之间传输存在大量延迟,包括路由器本身的延迟,数据包的复制、验证、路由等等。进一步的,如果是从纽约到东京呢?再加上网络发生了拥堵呢?这些情况下,超过500ms的延迟都是有可能发生的。
回到上面的例子,客户端发送输入给服务器,如(“我按下了键盘右箭头键”)。服务器50ms后收到输入。假设服务器处理输入是瞬间完成的,那么50ms后,客户端收到服务器返回的状态(“你现在位置是(1,0)”)。
站在客户端的视角上,你按下了键盘右箭头键,0.1秒的时间中,什么都没有发生,0.1秒后你突然右移了一个单位。0.1秒的延迟可能不会造成太大的影响,然而,如果延迟超过半秒,会对整个游戏体验造成灾难。

总结

多人在线游戏是迷人而有趣的,同时也是具备挑战性的。权威服务器架构能很好的防止玩家作弊,但简单直接的实现会导致玩家产生反应迟钝的体验。
在接下来的文章中,我们就会进一步探讨基于权威服务器的解决方案,来降低玩家获得交互响应的延迟,使得玩家感觉自己在玩单机游戏一样。

================================================
原文链接:http://www.gabrielgambetta.com/fpm1.html

阅读更多
个人分类: 游戏 服务器
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭