概述
简介
该系列教程主要讨论快节奏多人在线游戏的网络相关的技术和算法。这是该系列教程的第一章,如果你对多人在线游戏有一定了解,可以跳过本章。
开发任何一款游戏都是一个挑战性的任务。而多人在线游戏增加了更多新的问题。有趣的是,这些问题的核心恰恰与人类的天性息息相关。
作弊问题
作弊,是一切问题的根源。
作为一个游戏开发者,单机游戏是无所谓玩家作弊的——因为玩家的行为只影响他自己。作弊玩家的行为可能会获得一些开发者预料之外的游戏体验,然而这毕竟是玩家自己的游戏,他们有权去做任何自己想做的事。
网络游戏完全不同。任何网络竞技游戏,一个作弊的玩家不仅仅提高他自己的游戏体验,而且会降低其他玩家的游戏体验。作为开发者,你必须想办法避免这种情况,否则必将会导致玩家的流失。
有很多方法来反作弊,然而最重要的(或者说最有意义的)一件事,简单说来就是:永远不要相信玩家 。永远考虑最坏的情况——玩家总是会想方设法的作弊。
权威服务器与无权客户端
看上去最简单的解决方案很容易得出——让所有事情都发生在服务器上,这样你就能把控一切,而客户端仅仅作为服务器的观众,即客户端只是发送输入(键盘鼠标,命令等)到服务器,服务器运行游戏,然后反馈游戏结果给客户端。这种做法叫做权威服务器(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
最后
以上就是耍酷白云为你收集整理的快节奏多人在线游戏网络入门系列教程(1):简介的全部内容,希望文章能够帮你解决快节奏多人在线游戏网络入门系列教程(1):简介所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复