-
Notifications
You must be signed in to change notification settings - Fork 11
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
多人在线游戏的开发与部署:第1卷 development-and-deployment-of-multiplayer-online-games-vol1 #223
Comments
对《多人在线游戏的开发与部署》的早期评价 “迄今为止,关于多人游戏具体内容最全面的书籍。” “终于来了!” “期待书籍完成后阅读。” “期待最终成书。这本书很有前景。终于有一本关于这个主题的书,既不过时也不模糊。” “TCP是一只复杂的‘野兽’,而你对它的了解远胜于我。感谢上帝!” “你正在编写的这本巨著,看起来非常有前途和令人振奋。” “非常实用且极具实际价值的书籍。它将成为任何游戏开发人员书库中的重要补充。” “我已经找这样的书籍找了十年。这本书对教学游戏开发中的多人游戏开发细节将是无价的。” “即便尚未完成,它已经是我见过的最全面的网络与多人游戏开发参考资料,并不断让我学到新东西。对于严肃的开发者而言,绝对不可或缺。” “无虫”兔子 讽刺的开发者 G20 股市交易所的联合架构师 一款拥有 40 万同时在线玩家游戏的独立架构师 在《CUJ》、《C++ 报告》和《Overload》上发表文章的作者 多玩家在线游戏的开发与部署 第一部分 ARCH. 架构与前期开发
在本部分 ARCH 中,我们将探讨在编码开始之前需要进行的一系列活动。内容涵盖从制定业务需求到设置源码控制和问题跟踪系统等多个方面,期间还涉及许多关键的架构决策。 第一卷
多玩家在线游戏的开发与部署 多人在线游戏的开发与部署第一卷:游戏设计文档(GDD)、权威服务器、通信 目录
|
引言本书背后的故事从前有一只兔子……
——加菲猫 很久很久以前,在兔子王国 Bunnylore,有一只年轻的软件开发兔子。 他对编写无错误的软件有着极大的执着,很快他就得到了“无错误”(No Bugs)的绰号。 他迅速成长为一名架构师,并参与了不少项目,包括以下几类截然不同的项目:
在职业生涯的某个阶段,他开始为行业期刊撰写文章,并开设了一个软件开发博客。一切都进展顺利,直到有一天——无论是阳光明媚还是阴雨连绵,你可以自行选择——他拿起一本关于多人游戏开发的书,发现仅在两页上就有十六种不同的错误和三十九个这些错误的实例[Hare]。 从那时起,他开始研究关于多人游戏开发的其他书籍,发现只有两本相关书籍值得一读。 于是,“无错误”开始考虑撰写一本关于多人在线游戏开发与部署的书。 不过,他自己会更好地描述这一切。 作者及幕后团队关于作者:本书的作者是一只来自 Bunnylore 王国的“无错误兔”。他以 Overload 期刊(ISSN 1354-3172)的专栏作家身份闻名,并对软件开发博客 ithare.com 做出了重要贡献。作为一只母语为“兔语”的兔子,他需要有人将本书翻译成“人类语言”。而且由于本书内容高度技术化,作者还需要一位具有丰富软件开发经验的译者来确保技术细节的精准性。 关于译者:本书的翻译由 Sergey Ignatchenko 完成,他自1996年起便是一名软件架构师,1998年起开始为行业期刊撰稿,其文章刊登于 CUJ、Overload、C++ Report 和 (IN)SECURE 杂志。他精通“兔语”,经常翻译“无错误”在 Overload 上的专栏。Sergey 的架构师生涯中主导过多个项目,包括作为某 G20 国家证券交易所的联合架构师(该软件还被多个国家的证券交易所采用),以及作为一个大型游戏平台的独立首席架构师(该平台支持数十万玩家同时在线,每年处理数十亿次数据库事务,并带来数亿美元的收入)。作为一种带薪的爱好,他还发明了若干专利(不幸的是,所有专利都归属他的雇主)。 关于插画师:本书的插图由 Sergey Gordeev 绘制,现隶属 gagltd.eu。他是一位专业的动画师,曾在各大动画节中获得十余项奖项,以执导《憨豆先生》的几集动画剧集最为著名。 关于编辑:本书的编辑 Erin McKnight 是一位屡获国际奖项的独立出版人,曾编辑多部小说和非虚构作品。她出生于苏格兰,在南非长大,现居于达拉斯——这是她第一次与“兔语”合作。 关于现实经验“幸福的家庭都是相似的,不幸的家庭各有各的不幸。” ——列夫·托尔斯泰,《安娜·卡列尼娜》 如上所述,促使本书写作的契机是意识到当前市面上有关多人在线游戏(MOG)的书籍质量堪忧。不过,还有另一个经历也激发了写作的动机。 我多次与某些游戏开发公司的资深开发者、架构师或CTO交谈(或者更广泛地说,是与开发高度交互式分布式系统的公司交流),常常会有这样的对话:
(停顿)
这实际上说明了两点:
然而,这些实践大多未被记录下来(更不用说集中记录在一个地方),以致每个多人游戏开发团队都需要自己重新发明这些方法。<痛苦!> 而本书《多人在线游戏的开发与部署》正试图填补这一空白。总体而言,本书旨在总结行业内已知却很少发表的知识体系,试图将其集中于一体。 换句话说,本书(作为完整的九卷集)希望涵盖架构设计、开发和部署多人在线游戏的绝大多数问题(以下将列出一些例外)。 当然,鉴于任务的广度(可能过于雄心勃勃),我几乎可以肯定会遗漏一些内容。不过,我会尽力而为。 本书的主题是什么?当你第一次拿起一本书,通常会有两个问题:“这本书的内容是什么?”以及“这本书适合我吗?”我们先来回答第一个问题。 游戏类型:从社交游戏到大型多人在线第一人称射击游戏(MMOFPS),以及中间的股票交易所首先,我们来看看本书中涉及的游戏类型范围。令人惊讶的是,从一端的社交游戏到另一端的MMOFPS,这些多玩家游戏有许多共通之处。因此,本书旨在覆盖这些不同类型的游戏。 从宏观视角来看,所有多人在线游戏都依赖于互联网,而互联网的核心在于数据包的传输(每个数据包都存在丢失的风险)。即使从更高层次的抽象(从ISO/OSI网络模型的L3层的IP数据包到L4层)来看,用于游戏的L4协议实际上只有两种——UDP和TCP。并且,正如我们将在第四卷的“网络编程”章节中看到的,即使在交互目的中使用TCP,也需要考虑底层的IP数据包及其可能的丢失。 在服务器端,不同游戏类型也有很多相似之处。正如我们将在第三卷“服务器端架构”章节中看到的,即使是社交游戏常用的基于网页的架构,与“经典”模拟型服务器相比,也并没有那么大的区别。而在数据持久化方面(第三卷和第六卷的数据库章节将详细讨论),所有的多人在线游戏都需要数据库,这些数据库在不同游戏中也往往相似。此外,还未提及在大多数游戏中常见的话题,比如权威服务器、支付系统、随机数生成、客户关系管理(CRM)、数据中心的服务器管理、DDoS防护等。 当然,不同类型的游戏仍然会存在差异。特别是在客户端方面,各类游戏的客户端会有所不同,但某些概念会保持一致;并且,延迟要求也会大不相同,导致适用于MMOFPS的一些复杂操作对社交游戏来说完全不适用。我会尽量指出这些差异;不过,请务必“自带盐分”(BYOS,详见下文的“自带盐分”章节)在将本书的建议应用到你特定的游戏时保持批判性态度。通常,通用但不适用于特定情况的建议在软件开发中是一个“大问题™”(而游戏开发也不例外)。 股票交易所也是游戏,甚至更甚,它们是博彩游戏“任何非内部人士参与股票市场的人,就如同在月光下买牛。” ——丹尼尔·德鲁 到这里,我希望已经成功地让你明白,所有的多人在线游戏有许多共同之处。然而,你可能仍会疑惑,为什么股票交易所也被视为一种游戏。 游戏(特别是与投注和奖励有关的游戏)往往带有一定的社会污名。换句话说,如果你告诉别人你靠玩扑克或投注体育赛事来支付生活开支,很可能不会被邀请参加重要的邻居烧烤聚会。如果你说你靠电子竞技为生可能会被接受,但前提是他们不知道你实际上是在“打游戏为生”(“你靠什么为生?”)。 另一方面,股票交易则通常被视为“非常体面的职业™”。不过我想说—— 股票交易和游戏之间没有本质区别。甚至股票交易和博彩也没有本质区别。 当然,那些参与股票交易(尤其是通过其他方式赚钱的)的人会讲述许多有趣的故事来解释股票市场的不同之处。 然而,悲哀的事实是,赌博、体育博彩和股票交易都包括以下内容:
写到这里,我希望这已经能让你看到,所有的{二十一点 | 扑克 | 博彩 | 股票交易}都符合上述描述。如果你仍然有疑问,可以查阅[31 U.S. Code § 5362 – Definitions],这是一个非常官方的定义;在该定义中,为了排除股票交易所(作为“任何受证券法监管的活动”)特意(!)将其从“赌注或投注”的定义中剔除。 如果没有这项明确排除,任何股票交易所都可以被视为“赌注或投注”。我的论点到此结束。 从技术角度而言(这是本书的重点),股票交易所和其他类型的游戏在本质上几乎没有差别。作为一个曾在股票交易所和大型游戏平台上工作的开发者,我可以亲自证明这种相似性。 因此,一本好的MOG书籍会顺带涵盖大部分适用于股票交易所的技术内容。而我希望这本书能达到这样的标准,所以也会包含这些内容。 关于互动式分布式系统的一般性讨论如果将视角扩展到游戏和股票交易之外,鉴于我所见过的系统的数量和范围,我可以大胆地将我的经验推广到自己实践过的领域之外,得出以下结论—— 几乎所有的交互式分布式系统(至少那些需要使用内存状态的系统)都与游戏类似。 换句话说:如果你的系统可以只依赖数据库状态,就可以使用传统的无状态中间件;然而,一旦需要超越缓存的内存状态,你就进入了本书所覆盖的领域。 此外,即使对于某些当前仅使用数据库存储状态的交互式分布式系统,本书中描述的某些技术(特别是第三卷的“服务器端架构”章节和第六卷的“数据库”章节)也被证实在性能和可扩展性上优于传统的将所有内容扔进数据库并期望其应对的方式。我们将看到,利用单台标准的4插槽/4机架单元(4S/4U)服务器也完全能够处理每年1000亿次的实际在线事务处理(OLTP)交易(每年写入约1万亿行数据)! 涉及的主题:除去玩法/人工智能/物理/盈利/3D游戏的开发和部署是一项巨大的任务,因此我们需要明确讨论的具体内容。本书的野心很大:到第九卷结束时,目标是覆盖多人游戏开发与部署的方方面面,尽管有两个非常重要的例外。 首先,本书不会试图回答诸如“你的游戏应该是什么?”、“游戏应该呈现什么样子?”、“游戏机制应该如何设计?”或“如何从游戏中赚钱?”等问题;这些是你需要自己回答的重要商业问题。 在开始开发之前,你应该明确知道自己希望游戏如何呈现、玩法如何、人工智能或物理效果如何运作(如果适用),以及如何实现盈利。因此,这些问题完全不在本书的讨论范围之内。 第二个非常重要但并未深入探讨的主题是3D图形。尽管在第五卷中有一个关于图形的章节,但我可以提前告诉你,它仅是20,000字的简要概述,特别是关于3D图形的内容。遗憾的是,现代3D技术实在过于复杂(且篇幅巨大),无法涵盖于本书之中。幸运的是,已有大量优秀的书籍深入详尽地介绍了3D内容(参见下方推荐阅读部分的文献列表)。 好消息是,只要你已解决上述所有商业问题并掌握了图形内容,本书九卷内容基本上能满足你的需求。我们将探讨从总体架构到部署及部署后问题的几乎所有内容,以支持游戏发布和持续运营。 换句话说,尽管我无法回答“你想做什么”的问题,我将尽力回答“如何实现你想要做的事情”的问题,并尽量在九卷之中提供尽可能多的细节。 游戏引擎:自制 vs. 重用 vs. 第三方从目前的宏观视角来看,无论你如何开发你的多人在线游戏,基本都能归入以下几种模式之一: 第一个选项(我们称之为DIY选项)是自己动手做整个引擎,实际上创建一个自制的游戏引擎。我个人更倾向于这种方式,但不可否认的是,这种方式并不总是可行的。特别是如果涉及3D,则需要在开发引擎上投入巨大的精力——不仅是引擎本身,还包括供游戏设计师和3D艺术家使用的工具链,而后者工作量极大。 第二个选项(称之为重用选项)无疑对AAA开发 团队有很大吸引力。它指的是使用已有的数百万行代码的3D/游戏引擎(包括所有工具等)并在其基础上构建一个多人游戏引擎。即保留所有现有的图形、脚本、关卡编辑器等,但我们将自行设计整个网络层,对现有引擎的更改最小。 第三个选项(称之为第三方选项)传统上更吸引独立开发者。这是指采用现有的带网络支持的第三方游戏引擎(如Unity或UE)并使用其开发游戏。从技术上看,与重用选项的不同在于,不仅3D/游戏逻辑引擎是重用的,所有的网络层也是第三方的。 在本书中,我们将讨论所有这些开发场景。尽管大部分讨论将围绕DIY选项和重用选项(均假设我们自行处理网络相关内容),但在第二卷中将有一个专门章节讨论“如何使用Unity 5、虚幻引擎4或Lumberyard进行多人游戏开发”(是的,在使用引擎之前仍需了解它在网络方面的工作原理)。 这些就是当前重要的内容;关于自制与重用的优缺点(以及更重要的:什么部分需要DIY,什么部分可以重用),将在第二卷中进一步探讨。 这本书适合你吗?在解答了“这本书的内容是什么”之后,让我们来探讨第二个重要问题,“这本书适合你吗?” 本书不附带光盘首先,要向某些可能会失望的读者稍作提醒。 我必须坦言,这本书并不是那种“教你如何快速致富”的书。更不是那种“教你复制粘贴一个游戏引擎来致富”的书。要以一种可扩展的方式推出自己的多人在线游戏(顺便可能因此赚到钱)的过程绝非易事,在开始开发你的MOG之前,你需要清楚认识到这一点。 由于本书并不是一本让你从中复制粘贴游戏引擎的书,因此没有附带光盘,也没有提供任何可直接使用的MOG引擎代码。书中确实会出现一些代码片段,但这些代码只是用于说明书中的观点,完全与可用作起点并供你稍后修改的游戏引擎无关。 没有提供这种“现成的游戏引擎”还有几个原因,但主要原因是,这种方式会将讨论限制在非常有限的、容易说明的内容上,进而大大缩小了本书的范围。 “关于一切的一无所有”从某个角度来看,所有编程书籍都可以分为“告诉你关于某个特定问题的所有细节”的书籍,和“试图讲述各方面内容,但不深入细节”的书籍。前者内容非常具体,但通常也只能解决一个非常具体的问题,而超出该问题范围的内容则一概不谈。这类书籍通常对初学者学习某一项目有帮助,但其应用往往也仅限于学习项目。 而后一类书籍,即那种“关于一切的一无所有”的书籍,尝试尽可能地概括内容,代价是不会在每一个细节上深入。这类书籍通常不适合通过实例学习,但可以帮助经验丰富的开发者更深入地理解——不再是告诉你“如何完成低层次的操作”,而是“如何将这些低层次的操作整合成更大的整体,以及如何在这个整体中进行平衡以实现预期结果”。在试图进行这种平衡时,通常最好(也许是唯一可行)的方式是通过相关的真实经验来解释。 当然,这两类书籍的界限并不总是那么清晰,有些书介于两者之间;但本书坚定地属于“关于一切的一无所有”类型。这种特性也很好地契合了没有光盘(如上所述)以及面向中级及以上开发者(如下文所述)的定位。 先修知识:中级以上本书面向的是具有一定经验的开发者(换句话说,这不是一本包含IDE截图和复制粘贴示例的“如何开发你的第一个程序”类型的书)。如果你的游戏项目是你的第一个编程项目,那么理解本书的内容可能会有困难。 我甚至会进一步指出—— 本书的目标读者是那些希望从中级开发者成长为高级开发者的群体,范围一直延伸到CTO和架构师。 具体来说,本书不会解释事件驱动编程的原理、乐观锁和悲观锁的区别、为何需要源代码控制系统等基本概念。相反,本书会讨论诸如未来模式如何与事件驱动编程配合、在何种情况下游戏适合使用乐观锁,以及如何在不可合并文件存在的情况下使用源代码控制等话题。 另一方面,本书并不依赖于某一特定领域的深入知识。你不需要成为一位网络专家,对RFC 793的每个细节了如指掌;也不需要有着对着色器和/或CUDA的实践经验;甚至不需要成为一位C++大师,可以用模板编写任意的图灵完备程序,或是一位DB/2专家,可以预测在WHERE子句中加入“1=0”会如何影响执行计划,或是可以不用参考任何文档就配置基于BGP的DDoS防护的系统管理员(顺便说一句,老实说,这些事情我自己也做不到)。 当然,3D图形经验对于3D MOG游戏开发可能有帮助,网络基础和套接字知识也会有益。但当讨论超出“每个中级开发者理应掌握的内容”时,我会尽量提供指向相关材料的推荐,以便读者可以进一步学习。 最后,且同样重要的是——即使你是一位经验丰富的开发者,但如果你从未开发过单人3D游戏或多人游戏,那么直接开始一个多人3D游戏并不明智。 无论是3D游戏还是多人游戏,哪怕单独来看都是庞大的学科,因此尝试在同一个开发项目中学习两者的基础知识,可能导致灾难性的结果。 话虽如此,我相信可以通过单人3D游戏的开发或非3D的多人游戏(包括社交游戏和股票交易)逐步迈入多人3D游戏的开发。 关于基于局域网的游戏和点对点游戏历史上,很多多人游戏开发(特别是独立游戏开发者)集中在基于局域网和点对点(P2P)的游戏上。 我必须坦白,我并不热衷于点对点游戏架构(即使是选出其中一个节点充当临时权威服务器的形式)。其中一个原因是,这种架构本质上极易被作弊者利用,一旦你的游戏足够流行,吸引了成千上万彼此不相识的玩家,游戏很可能会被黑客入侵(关于作弊的讨论请见第二章)。 因此,本书大多在权威服务器的上下文中讨论相关问题(顺便说一句,业界大致也认为这是未来的方向);此外,本书假定服务器是由你的公司控制的(而不是在某个玩家家中,通过ADSL连接并坐在NAT后面)。不过,本书中描述的许多概念也适用于点对点游戏,甚至是基于局域网的游戏。但是,如果你的游戏是基于局域网的,请谨慎,不要依赖于我所写的所有内容;局域网游戏中的决策因素与广域网游戏有显著差异,结果是,针对局域网开发的某些内容可以显著简化。 推荐阅读通用编程
游戏编程(非网络相关)
3D 编程
网络编程(非游戏相关)
游戏网络编程
C++ 编程对于 C++ 初学者
对于已有 C++ 经验、需要升级至 C++11/C++14 的开发者
安全性
如何阅读本书约定本书采用了较为传统的写作约定,但有一些地方可能需要进一步说明。 首先,书页边缘会有带有作者头像的小提示。它们只是书中已有句子的重复,但反映了作者对这些内容的情感态度。当我描述某些内容时,坦诚地说,我确实相信这些内容是准确的;然而,我是否喜欢这些内容是另一回事,我希望能够表达我的感受,而不影响正文的流畅性。 其次,书中还有“维基引用”,用于介绍一些在某些行业中较为人所知,但对部分读者而言可能全新的术语。我不会深入讨论这些术语(本书已经足够冗长),而是建议读者在其他地方查阅这些术语(通常推荐的资源是维基百科和谷歌)。 代码示例作为一本开发相关的书籍,书中会包含一些代码示例。大部分代码示例使用C++编写;但这并不意味着这些概念只能适用于C++。恰恰相反,除第五卷中一章专门针对C++的内容外,其他大多数示例都适用于几乎所有编程语言,C++只是作为最常用于游戏开发的语言出现。 另外,请注意,这些示例只是用来说明某些概念。除非明确讨论,我并不试图教授C++或C++的最佳实践。因此,遇到“是遵循最佳实践,还是让主要思想更直观”的两难选择时,我更可能在保证思想易于理解的前提下牺牲一些最佳实践。 我的“显而易见”帽子本书的目标受众相对广泛,因此不可避免地要解释某些对特定读者而言“显而易见”的内容(但对其他群体可能并不明确)。此外,书中每一部分的内容都可能早已为某些人所知。因此,请不要抱怨“书中的大部分内容都是众所周知的”,这本书的主要目标就是“总结业内已知但很少发表的知识体系”。 因此,如果我在书中提到你已熟知的内容,请不要责怪我。可以确信,书中的某些信息对其他开发者而言是新知(也不要急于称呼这些人为“白痴”,因为他们可能掌握着你尚未了解的其他知识)。 我会尽量在我已知某部分内容不适合特定人群时标明(例如,我关于图形的想法对3D专业人士来说可能显得过于基础)。尽管如此,难免会有疏漏之处,对此带来的不便我表示歉意。 术语由于多人在线游戏(MOG)开发是一个宽泛但尚未完全标准化的领域,术语混乱时有发生(更糟的是,同一术语在不同子领域含义不同)。我不会讨论“哪些术语是‘正确’的”(这很主观,讨论术语本身也毫无意义)。因此,在使用这些术语时,我会简单定义我在本书中如何使用这些术语。 MMO与MOG“多人在线游戏”(Massively Multiplayer Online Games, MMOG 或 MMO)这一术语容易引起混淆。 争议的焦点在于那些拥有大量玩家,但并非所有玩家都在同一个游戏世界的游戏。例如《反恐精英》(CS)或《英雄联盟》(LoL),尽管拥有大量在线玩家,但他们并不处于同一虚拟世界。有一种观点认为“嘿,这是多人游戏,它在线上,且拥有大量玩家,所以它是MMO。”而另一种观点(已占据维基百科的MMOG词条)则认为,若要称为MMOG,必须运行在单一的游戏世界实例中。 如前所述,我不会详细讨论术语问题,只是提及,为了避免混淆,我会尽量避免使用“MMO”一词(除非提到定义明确的MMORPG或MMOFPS)。这意味着—— 本书讨论的内容会统称为多人在线游戏(MOG),即便它们拥有大量玩家。 事实上,大部分情况下我假设我们讨论的游戏能够支持数十万同时在线的玩家;这是唯一真正重要的事情(是称之为MMOG还是MOG并无太大区别)。 服务器在多人在线游戏的世界中,“服务器”这一术语被广泛使用,可能指代多个不同的事物。 一个含义是“服务器”,即“物理服务器设备”;另一个含义是“玩家可以连接的场所”(例如“西欧服务器”)。尽管名称如此,后者实际上几乎都是由多个物理服务器组成(通常位于同一数据中心)。更令人困惑的是,术语“服务器”还常用于表示不同的游戏世界实例(可以是战斗竞技场的一个实例,也可以是复杂MMORPG的整个游戏世界实例)。 为了避免不必要的混淆,本书中将物理服务器设备称为“服务器”(Server),位于同一数据中心的多个物理服务器称为“数据中心”(Datacenter)。至于“游戏世界实例”,我们将每个运行在物理服务器上的逻辑分离实体称为“游戏服务器”(Game Server);而在讨论具体的游戏服务器类型时,我们将其称为“游戏世界服务器”(Game World Server)或“匹配服务器”(Matchmaking Server)等。需要再次强调的是,这些定义并不“正确”,只是我在本书中选择的约定。 专用服务器另一个关于多人在线游戏的混淆来源是“专用服务器”的定义。在托管行业中,“专用服务器”通常指你拥有root/管理员访问权限的物理服务器设备;这种服务器通常可租用,术语用来区分“专用服务器”(物理设备)与“虚拟服务器”(即物理设备的一部分,在某些情况下,如云服务中,这些虚拟服务器还会随时间从一个物理设备迁移到另一个设备)。 然而,在多人在线游戏开发中,“专用服务器”通常指的是“没有图形直接连接的游戏实例”(此定义在独立游戏开发者中较为常见,源自以客户端为中心的开发流程,我们将在第一章讨论该流程)。 为避免混淆,我将尽量避免使用“专用服务器”一词;若偶然提到(或讨论从ISP租用服务器时),我指的是第一个定义(即通常从托管ISP处租用的物理服务器设备)。 自带盐分(BYOS)在进入更实际的讨论之前,还有最后一点需要提及。没有一本书(包括本书)中的任何一句话应被视为“绝对真理”。在实际操作中(尤其在游戏开发中),几乎每一个“这样做”的建议都有相反的示例表明,有时这个操作可以(甚至应该)用不同甚至相反的方式进行。 所有的建议都有其适用限制,本书的任何建议也不例外。当我已知某些与游戏相关的场景可能超出这些限制(使建议不再适用)时,我会尽量提到。然而,在一个庞大的行业如游戏开发中,难以预测所有使用场景,因此你应做好准备,本书中的一些建议(或其他书中的建议)可能不适用于你的游戏,且未标明其适用范围。 因此,请带着适当的怀疑阅读任何书籍(包括本书)。盐分不随书附赠,你需要“自带盐分”(BYOS)。更具体地说—— 对于每一个基于本书建议所做的决策,请问自己:
参考文献
这就涵盖了阅读本书的基本指导。随着接下来的章节展开,您将更深入地了解多人在线游戏开发中的具体实践和应用。 |
第2章. 关于作弊、P2P与[非]权威服务器在开发多人在线游戏(MOG)时,有一个极其重要的现象必须牢记:玩家作弊问题。这是在非多人游戏中几乎不存在的情况,即便是在局域网(LAN)上的多人游戏中也不太重要,但在互联网游戏中却至关重要。 玩家作弊对所有成功的MOG而言都是一个大问题。可以毫不夸张地说:
在本章中,我们将简要介绍主要的作弊方式,并集中讨论那些对游戏架构决策至关重要的作弊手段。关于“如何处理作弊”的详细讨论将在第八卷(章节涉及自动化打击与其他玩家滥用行为)中进行。 如果你的游戏足够受欢迎,玩家总能找到理由作弊
你可能认为,在你的游戏中玩家没有理由作弊。比如,如果你的游戏中没有任何可以兑换金钱的内容,或许你会觉得自己不会遇到作弊问题。然而,实际情况往往相反:只要你的游戏足够受欢迎,玩家总会找到作弊的理由,无论这种作弊行为是否有直接的金钱回报。 举个真实的例子:曾经有一个免费扑克网站,玩家可以获得“玩筹码”,并用这些筹码进行游戏。这些筹码无法兑换任何实物或现实价值,仅仅用于游戏。当时,团队认为在这个网站上没有作弊的动机。但现实证明了这种假设是错误的。 情况是这样的:玩家可以将所有的“玩筹码”押上桌。虽然从扑克角度来看这样做毫无意义,但他们用筹码数量来炫耀“我是多么优秀的玩家”。一位玩家于是想到:“我可以在eBay上卖这些筹码,其他玩家愿意付钱——只为了让自己看起来更厉害!”于是,eBay上的筹码销售出现了,随之而来的便是大量的作弊行为(通过创建多个账号获取免费筹码,或通过“筹码转移”向特定账号输送筹码)。 尽管我们可能无法理解花20美元买价值全无的“玩筹码”只是为了在游戏中炫耀自己的行为,但确实有一部分玩家会这么做。作弊的可能性就像是一个概率问题,只要玩家数量足够大,这类事情就会发生。 同样的玩家心理目前被许多现代游戏(特别是社交游戏)成功地利用来进行货币化。当然,此处我们关注的不是如何利用玩家的心理弱点来盈利(那是货币化团队的任务,超出了本书的范围),而是从技术角度来预防作弊。
当你的游戏达到1,000名同时在线玩家时,作弊行为可能开始出现;而当玩家人数达到100,000时,可以完全确定作弊者的存在(如果你没有察觉到他们的存在,说明你还没有深入调查)。尽管作弊玩家的数量会根据游戏中提供的奖励类型而有所变化,但我可以肯定地说,任何拥有10万同时在线玩家的游戏几乎肯定会有作弊者存在,无论游戏的具体类型如何。 本章后续将继续深入探讨MOG作弊防范的重要性,解释在设计架构时为什么要优先考虑防作弊机制。同时,本章还将引入对等网络(P2P)与权威服务器的概念,并分析它们在防作弊和游戏安全性方面的应用与局限。 游戏与电商欺诈的根本区别在应对游戏作弊和电子商务欺诈时,有一个显著的区别需要特别注意。在电商领域,想绕过系统的人要么是利用促销漏洞,要么就是彻头彻尾的诈骗者。然而,对于游戏玩家来说,作弊的动机远比电商复杂多样。 例如,正如上文提到的“玩筹码”的情况(见“足够受欢迎时,玩家总能找到理由作弊”部分),玩家可能只是为了展示自己的实力而作弊,或因为他们觉得游戏规则对自己不公平而作弊,甚至只是因为认为“大家都在作弊”而决定作弊来“公平竞争”。此外,有些玩家会使用“机器人”来节省时间,而不是自己在游戏中“打怪练级”。这些行为将“作弊”与“诚实玩家”之间的界限变得模糊不清。 再加上电商欺诈属于法律定义的犯罪行为,而在游戏中,使用“机器人”来逃避枯燥的游戏内容顶多导致账号被封禁(通常很容易绕过,特别是对免费游戏而言),因此我们得出一个结论:
尽管在线游戏中的“诚实玩家”数量远多于“作弊者”,但不同于电商的经验(如“只有0.3%的顾客是欺诈者”),在网络游戏中我们不能依赖同样的统计经验。 第二个关键区别:游戏作弊的破坏性由于游戏中的玩家互动远比电商更加密切——
举个例子:如果足够多的玩家使用机器人获取不公平的优势(比如对威胁快速反应的能力),你的游戏体验会迅速恶化,甚至可能会变得完全不可玩。因此,处理作弊不仅是为了保护收入,更是为了保护游戏本身的核心体验。 应对作弊的方法正如前文所述,作弊现象几乎是所有大型游戏的必然现象。问题不在于是否存在作弊,而在于如何应对作弊,就像下雨时我们会选择带伞——伞不能完全防雨,但在一定条件下可以提供有效的保护。处理作弊同样如此,虽然不可能实现100%的防作弊效果,但通常可以达到一个较为可接受的防护水平。 游戏玩法调整首先需要考虑的是,游戏玩法本身是否鼓励了作弊行为。这一点可能会引起争议(毕竟技术细节本不该影响玩法设计),但必须分析玩家可能采取的作弊方式。试着站在作弊者的角度思考:“如果我被雇来作弊,我会怎么做?”有时,这种分析会揭示某些简单的作弊途径,这些作弊途径如果不加阻止,将会严重破坏游戏体验,尤其是在电竞类游戏中。 许多开发者(尤其是非游戏开发背景的人)主张“如果玩法设计本身无法杜绝作弊,那游戏就不该发布”。我并不认同这种极端的观点,因为几乎没有一个游戏是完全防作弊的。重要的是寻找适度调整玩法的方法,使其不易被利用(而且通常这样的调整会让游戏规则更加简单明了)。 架构设计下一步是确保游戏架构没有在无意中帮助作弊者。如果架构上存在漏洞,一旦游戏流行起来就会出现大问题。例如,如果你的射击游戏依赖于“权威客户端”(Authoritative Client)架构,玩家可能会利用各种漏洞实现“瞬间传送”等作弊手段,严重影响游戏体验。这样的漏洞可能迫使你进行痛苦的架构重构(如[Harton]所述),甚至在最坏的情况下可能导致游戏失败。因此,对于大多数游戏来说,通常需要依赖“权威服务器”(Authoritative Server)架构来防止作弊(我们将在后文详细讨论这一点)。 打击机器人最后一个防作弊措施是直接的作弊者打击。通常情况下(除非你运营的是一个类似于证券交易所的系统),这一步可以等到游戏正式上线后再进行。游戏一经发布并稳定运行,便可以开始主动寻找作弊者(有关细节见第八卷关于机器人打击与其他玩家滥用行为的章节),并在发现作弊者后迅速处理。 目前,我们的目标是确保游戏架构能够支持后续的作弊打击,而不需要在应对作弊时推翻重做整个系统。 攻击:在“主场”的巨大优势在应对作弊者时(在经典安全领域,通常称之为“攻击者”),了解攻击情境的两大类根本区别非常重要。 主场攻击第一类作弊或攻击场景中,攻击者试图影响你直接控制的内容。对于游戏而言,这通常指的是你的服务器。在这种情况下,从一开始你就具备内在的优势;虽然攻击总是存在的可能性,但对于这种“主场”类攻击,基本上都与实现中的漏洞有关。换句话说:
虽然确实可能会有许多漏洞被利用,但你仍然有机会去防范。每修复一个漏洞,攻击者就需要重新找到新的漏洞,这对于一个构建完善的系统来说并不容易。 一个典型的“主场攻击”例子是针对你的服务器的攻击,目的是获取例如“战争迷雾”下的隐秘信息,甚至试图改变游戏玩法。虽然这样的攻击可能性存在,但你一般有机会抵御这种攻击。 客场攻击第二类攻击场景涉及攻击者完全控制你的软件(例如客户端),能够随意对其进行操作。在这种情况下,对你而言,情况要糟糕得多。事实上,不论你在客户端上做了什么,攻击者通常都可以通过逆向工程破解,从而完全控制游戏。 典型的此类攻击包括“透视墙” (wallhack)(即“穿墙查看”)或者相关的“战争迷雾破解”(maphack)——如果你的客户端存储了这些信息的话,攻击者还可以随意更改数据包时间戳(滥用延迟补偿),以及运行在客户端之上的各种机器人程序。 当然,你可以尝试对客户端进行混淆处理,但实际上任何混淆方法在足够的时间和努力下都可以被破解。在经典安全领域,第二类攻击场景下,你唯一能依赖的是所谓的“安全性依赖于隐藏性”(Security by Obscurity),这在传统的安全模型中并不被视为真正的安全性;虽然在某些情况下我们不得不依赖“隐藏性安全”,但需要明白:
总结在面对作弊者时,“主场优势”(控制软件或设备)会带来巨大的差异。基本上,对于交给攻击者的任何东西,实际上你很难做到彻底保护。 情况的严重性在于,即便你给每位玩家一个硬件设备,这些设备也可能被破解(硬件攻击手段的范围可参考[Skorobogatov])。通常,只要是交到玩家手中的东西都应视为可以被破解的;我们唯一能做的是增加破解的难度,但要完全阻止破解是不可能的。 另一方面,总体上,安全并非关于“完全无法被攻破”,而是提高破解的成本。理想情况下,安全系统的目标是将破解成本提升到超过数据本身的价值,使得攻击不具备经济效益,但实际上每一层安全措施都很重要。因此,我主张这样的观点:
公开攻击与非公开攻击接下来要考虑的是作弊和攻击是否被公开发布的问题。虽然[Pritchard]的规则#3指出“作弊者会主动避免开发者发现他们的作弊手段”,但这种情况并非总是如此。 有时,作弊者会选择将攻击方法公开,动机各不相同。我见过一些攻击方法被公开的原因包括打击某个网站、炫耀自己是“真正的黑客”、出于“公平”的心态,或者(最常见的情况)为了售卖攻击工具或脚本赚钱。 公开攻击:影响更大,但重获“主场”优势无论公开攻击的原因是什么,都会对游戏产生诸多影响。一方面,它会使攻击的影响显著加剧。任何对作弊感兴趣的人都可以获取攻击工具(有时甚至是免费或象征性的费用),这样会导致相当数量的玩家使用它。这将对其他玩家的游戏体验造成严重的破坏(这是你在应对作弊时最不愿看到的情况)。更糟糕的是,一旦人们知道仅需几美元就能在你的游戏中作弊,玩家的信任感会大大下降,甚至可能开始怀疑每一个正常的游戏互动。 另一方面,公开攻击也让你重新获得一定的“主场”优势。尽管对于某些攻击类型而言,可能无法完全封堵整个攻击途径,但一旦攻击被公开发布,你便有机会在半数情况下拥有“主场”优势。 在这种情况下,通常战斗进程如下:
总体来说,一旦你掌握了作弊方法,就可以使用作弊者通常会用来对付你的工具和技术,包括使用IDA Pro和内核级调试等。此时,这往往演变成“谁更持久”的较量。由于你对自己的游戏充满热情(而且别无选择,只能战斗到底),通常是游戏开发者比各个攻击团队更持久(虽然这并不能阻止新的攻击者出现)。 非公开攻击非公开攻击尽管更难应对,但其引发“末日情境”(即“整个游戏因所有人作弊而崩溃”)的风险较低。当然,这并不是说你不应该关注非公开攻击;这里的意思是,通常情况下,非公开攻击的优先级应该排在公开攻击之后。 还有一种介于公开和非公开攻击之间的变体,即“在封闭论坛内发布的攻击”。这种情况通常是为了防止开发者获取该作弊工具,无法在“主场”进行防御。这样的攻击虽然令人恼火,但如果该封闭社区规模较小,影响也相对有限;而如果该社区规模较大,通常可以(而且应当)渗透其中并获取作弊工具。只要反作弊团队工作到位,这种攻击的威胁通常也不至于太严重。 攻击类型概述在讨论作弊和攻击的典型类型以及其成功后的影响之前,有几点需要提前了解。 法律问题与封禁挑战在讨论与作弊相关的技术问题前,首先要考虑的是你的游戏条款和条件(T&C)。我曾与一位来自知名公司的从业者讨论过,他们在封禁作弊者时遇到了重大法律问题,因为他们需要在法庭上证明这些玩家确实存在作弊行为。因此,如果条款和条件编写不当,或法律倾向于保护作弊者,再先进的技术保护措施也无法真正有效。 游戏作弊接下来,我们将讨论游戏环境中特有的作弊行为,并将其归纳为两大类:游戏特定作弊和经典攻击手段。 1. 游戏规则违规如果你的游戏规则允许玩家在某种情形下“违规得分”或超出合理游戏逻辑的优势,整个游戏的平衡将被打破。例如,在足球游戏中,有玩家能不借助球员直接改变球的轨迹得分,或在格斗游戏中,玩家能在毫无可能击中的方向完成攻击,这些都是严重的规则违规。
2. 信息泄露攻击另一类常见的攻击是利用客户端知道比玩家应知道的更多信息。例如,“透视墙”(wallhacks)、“解除战争迷雾”(maphacks)、或“显示隐藏属性”(ESP hacks)等。
3. 反应增强对于依赖快速反应的游戏(如射击类游戏),作弊者往往希望表现出超出人类反应极限的速度。这包括**自动瞄准(aimbots)和自动触发(triggerbots)**等作弊工具。
4. 断线处理滥用若游戏逻辑在断线情况下给予玩家某种优势,该优势往往会被滥用。例如,断线可避免失败或负面结果。
5. 挂机刷取**挂机刷取(Grinding Bots)**指的是通过自动化工具帮助玩家重复性地完成“刷经验”等任务,常见于MMORPG和其他任何带有等级或经验系统的游戏。
6. 多账户无论游戏内容如何,玩家通常有足够动机创建多个账户。通常,为了防止游戏内的作弊,游戏条款往往会禁止多账户操作。
这些常见攻击类型总结了作弊者在多人在线游戏(MOG)中常用的手段。了解每种类型的影响和攻击途径,有助于在设计游戏架构时提前采取相应的防范措施。 经典攻击类型除了游戏特有的作弊行为,许多常见于非游戏领域的攻击方式同样适用于游戏环境。以下我们将讨论一些最常见的针对游戏的经典攻击。 数据库攻击(DB Attacks)如果游戏需要持久化数据(几乎所有MOG都如此),通常需要一个数据库来储存这些信息。攻击者一旦获得数据库的访问权限,他们可以窃取所有玩家的密码、修改数据甚至篡改角色属性。
源代码盗窃源代码泄露对任何行业都是一个问题,但对于游戏尤其严重。源代码一旦泄露,会让客户端的所有混淆保护无效,暴露游戏的所有弱点并引发大范围的作弊问题。
密码钓鱼钓鱼攻击通常针对玩家,通过设置虚假网站诱使玩家输入游戏登录信息来获取密码。
键盘记录器/木马/后门程序此类攻击通过在玩家设备上安装恶意软件(如键盘记录器或木马)窃取其登录信息。尽管此类攻击并非直接针对游戏本身,但会对玩家体验和游戏安全产生负面影响。
分布式拒绝服务攻击(DDoS)DDoS攻击相对易于实施,通常用于发泄不满或进行勒索。攻击会导致服务器过载,影响玩家正常访问游戏。
这些经典攻击类型揭示了游戏开发中的潜在安全威胁。通过了解这些攻击的影响和防御途径,开发团队可以在设计阶段就考虑安全措施,以减少潜在的风险并提升游戏的安全性。 总结MOG攻击类型在表2.1中,我们对前文提到的各种攻击方式进行了总结。
作弊
多账户
经典攻击
关键架构依赖从表中可以看到,只有两种攻击(游戏规则违规和信息泄露)在很大程度上依赖于架构。这些攻击的防御效果与使用的架构密切相关。具体而言:
通过选用权威服务器架构和实施兴趣管理等措施,游戏开发者可以在早期开发阶段设计更强的防作弊能力,降低这些攻击带来的风险。 权威客户端:对抗作弊几乎无望(仅适用于仅限主机的游戏)有时会在不同论坛中看到这样的问题:“为什么还要麻烦用服务器?我们可以使用完全无单点故障且可无限扩展的P2P(点对点)架构。”此外,还有人认为客户端-服务器架构不够扩展性强,而MOG(多人在线游戏)的未来在于P2P系统。为便于讨论,我将以[Skibinsky]为例。 在P2P架构中,每个客户端负责自己的计算,并将结果发送给其他客户端以确定游戏世界的状态。例如,每位玩家模拟她的角色并将结果传送给其他客户端以同步其游戏世界状态。这种架构在没有作弊者的情况下是可行的,但一旦有玩家作弊,他便能修改客户端的行为,导致其他客户端也会应用作弊后的结果,从而获得诸如瞬间传送等不公平的优势,这类作弊行为会严重破坏游戏平衡。 严格来说,并非所有给客户端权限的架构都是P2P系统。在实践中,真正的P2P系统较少见,更常见的是选举某一客户端作为临时服务器的架构。另一种变体是所谓的非权威服务器,其仅作为客户端之间的数据中继。然而,出于反作弊的目的,任何形式的权威客户端架构在面对作弊时效果相似,因此我们暂时将它们统称为“权威客户端”。 对于“游戏规则违规”类型的攻击,权威客户端面临的处境非常不利,我们只能依赖“安全性通过混淆”的手段。然而,这一问题已经广泛地被认可,因此提出了几种解决方案;不幸的是,截至2017年,这些方案在实践中均未被证明为切实可行。 代码签名:在恶意环境中无效(主机游戏除外)应对权威客户端作弊的首要手段是代码签名。表面上,这似乎是一个好主意:如果我们的应用程序被签名,那么我们可以确信它会按我们编写的方式运行。 然而,代码签名的问题在于,一旦最终用户自己想要破解代码签名,它实际上就变成了“安全性通过混淆”。这是因为用户拥有对设备的完全控制权,他们可以篡改根证书来生成自己的私钥/公钥对并伪造签名。由于攻击者可以更改用于验证签名的根证书,因此代码签名变得毫无意义。 另外,在这种恶意环境下,关键在于“谁在执行验证”。如果执行签名验证的是用户控制的代码,那么即使签名完全无效,用户也可以使验证通过。 [Skibinsky]也承认代码签名的局限性,指出:“这并不能提供100%的安全性。”对此我进一步认为,“当用户自己想绕过代码签名时,它提供的安全性提升是极其有限的;除非是在主机(控制台)环境下。” 控制台的保护能力在此方面,控制台确实提供了更高水平的保护,直到被破解为止。控制台制造商会极力防止用户篡改其根证书和签名验证代码。因此在控制台环境中,这种保护能有效地防止作弊,直到控制台被破解为止(比如PS3曾保持了五年未被破解)。目前,控制台厂商正在努力防止已破解的控制台联网,从而实现对玩家环境的控制。这场攻防战在实践中可能对MOG开发有帮助,前提是游戏仅限于主机平台。 成功的控制台游戏示例一些成功的游戏依赖代码签名防止在P2P类架构上的作弊。例如,《光环:致远星》就是一个主要依靠控制台安全机制防止作弊的成功案例,据我所知,控制台的安全性确实对防止作弊起到了相当大的作用。 然而,将游戏限制于仅在控制台上运行对MOG来说通常不是一种可行选择,因为一旦游戏同时在控制台和PC上运行,PC端将成为防御链中的薄弱环节,容易遭到攻击。 理论性保护措施除了代码签名和主机之外,文献中还提出了其他反作弊方法(尤其是在[Skibinsky]中),但这些方法多为理论性,没有成功的游戏依赖它们来处理作弊问题。以下是这些主要理论性技术的简要概述及其局限性讨论。 交叉检查 —— 难以察觉的攻击、游戏控制权、延迟解决权威客户端系统“游戏规则违规”漏洞的首个理论方法是通过其他节点交叉检查潜在作弊者的计算。虽然这个想法看似可行,但存在几个关键问题:
总的来说,交叉检查在MOG中难以有效应用,且目前尚无成功案例。 共识机制(即多数投票)——延迟更严重共识机制是交叉检查的进一步发展,例如比特币或Stellar共识协议(SCP)。虽然SCP将共识时间缩短至2-5秒,但这对大多数游戏而言仍然过于缓慢,难以适应游戏的实时性需求。 可信节点 —— 我们信任谁?另一种理论方法是基于“可信节点”系统,仅允许可信节点参与计算。然而,对于MOG,这种系统有一个根本问题:我们如何定义并维持可信节点?
这些问题使得“可信节点”方法在大型MOG中难以实践,风险极高。 同态加密 —— 实际上行不通理论上,还有同态加密方案,其允许节点在完全不透明的情况下进行计算而不知晓数据内容。尽管有理论和实践支持,但同态加密的性能开销极高,难以应用于要求极高的游戏环境。在可预见的未来,这种方法在MOG中难以实现。 总结这些理论保护措施在概念上很有吸引力,但在MOG中的实际应用往往不可行,尤其是面对延迟、性能和管理难题。目前,大多数成功的MOG仍然依赖权威服务器架构来应对作弊问题。 Authoritative Client MOG总结关于权威客户端架构的讨论总结如下:虽然权威客户端架构(包括纯P2P和由客户端充当服务器的变体)在某些互相信任的社区中可以运行得相对良好,但从目前的情况来看,除了仅限控制台的游戏以外,很难为权威客户端MOG提供有效的反作弊保护。 这种对权威客户端的排斥以及向权威服务器架构的转移在游戏开发行业中愈发明显。例如,[Sweeney]和[Fiedler在关于游戏网络的必知要点]都表达了对权威服务器架构的支持。 尽管理论上存在可能依赖权威客户端的游戏类型(即没有明确的证据表明这种游戏一定不存在),但在决定依赖权威客户端时需再三慎重,尤其是在非控制台平台上。务必参考“如果你够受欢迎,他们总会找到作弊理由”章节,以便了解风险。 确定性锁步(Deterministic Lockstep):无游戏规则违规,但信息泄漏严重另一种在多玩家游戏中相当流行的设计理念是确保所有客户端保持完全一致的状态。这通过以下方式实现:
详见[Terrano和Bettner]和[Fiedler在Deterministic Lockstep中的研究]。 尽管确定性锁步本质上不排除权威服务器的使用(理论上可运行与客户端相同的权威服务器作为判断胜负的标准),但在实践中,带权威服务器的确定性锁步很少被应用,主要有两个原因:
从反作弊的角度来看,确定性锁步(无论是否带权威服务器)确实能有效防止游戏规则篡改类的作弊,尤其是在权威服务器存在或可以排除50%以上的玩家作弊可能性时。 然而,确定性锁步并非完全无缺点。问题在于,确定性锁步要求客户端保留整个游戏世界的状态。这意味着,作弊者可以轻松从客户端提取整个游戏状态,从而实现“透视墙”或“去除迷雾”的作弊手段(即wallhacks和maphacks)。 此外,确定性锁步还存在一些纯技术问题,包括不同平台上实现100%确定性行为的难度,以及不得不等待最慢玩家的延迟。这些问题促使Glenn Fiedler建议“仅将确定性锁步用于2至4人的游戏”。 确定性锁步的应用场景尽管有这些限制,确定性锁步在即时战略(RTS)游戏中仍有其受欢迎的应用场景,尤其是在独立游戏开发者中。然而,除非特定游戏完全无法采用其他方法进行流量优化,否则我更倾向于“经典”权威服务器,即通过服务器同步状态给客户端,而非确定性锁步加权威服务器。对于RTS,唯一反对权威服务器的理由是流量问题,但该问题通常可以通过优化解决(见第3章对RTS流量优化的讨论)。 相对于确定性锁步,权威服务器的优点:
综上所述,在因带宽限制而无法避免的情况下才推荐采用确定性锁步,且在流量优化做得很好的情况下,这种情况不太可能出现。 权威服务器架构:接近防作弊的最佳选择鉴于权威客户端和确定性锁步架构的种种问题,近年来“权威服务器”架构越来越受欢迎。实际上,对于绝大多数游戏来说,权威服务器是目前唯一真正可行的多玩家在线游戏(MOG)架构。 在一个典型的虚拟世界游戏的权威服务器架构中,客户端通常拥有3D引擎,但这个引擎仅用于渲染,而不是进行决策。所有玩家的输入(例如按键和点击)被发送到服务器,由服务器处理玩家和其他对象的移动、碰撞、命中等决策。服务器的游戏世界状态是唯一的权威版本,并会同步给客户端进行渲染。 对于快速反应的游戏来说,每次按键都要往返服务器会产生不可接受的延迟。在这种情况下,客户端通常会实现“客户端预测”,即通过本地处理玩家输入来暂时更新自己的游戏世界副本。然而,当客户端与服务器的视图不一致时,服务器的状态始终是“正确”的版本。因此,客户端预测产生的偏差是暂时的,不会对其他玩家造成影响。 从防作弊的角度来看,权威服务器架构是最佳选择。服务器可以对游戏规则进行强制执行,即便有客户端预测,服务器和客户端之间的冲突也可以通过服务器的权威性来解决。 权威服务器架构:可行但不完美的扩展性尽管权威服务器在防作弊方面极具优势,但许多人认为它不具备良好的扩展性,特别是一些批评者声称其客户端-服务器架构流量需求可能呈现“O(P²)”的增长,即游戏中每个玩家的状态变化需要通知给其他所有玩家。这种理论会带来严重的扩展问题。 然而,实际情况并非如此。现实中玩家的互动范围往往限于他们的“邻近区域”,与世界总人口无关。这种方式在实践中更接近O(P)的增长,而非O(P²)。 这一技术在MOG开发中被称为“兴趣管理”(Interest Management),将在第3章中详细讨论。借助兴趣管理,客户端仅处理与自身相关的实体信息,极大降低了数据流量,使得游戏服务器在处理大量玩家时依然可以实现可行的扩展性。 实际计算示例以下是一个实际的示例来说明上述扩展性理论: 假设某游戏中每个玩家最多只与C=100名其他玩家直接互动。假设每个玩家交互的带宽需求约为15字节/秒,且游戏的平均玩家每月收入为0.05美元。在这种情况下:
因此,只要扩展良好,权威服务器的收入和开销可以保持比例性增长,从而实现经济上的可持续性。 结论权威服务器架构是当今防作弊效果最佳的MOG架构。尽管其扩展性存在挑战,通过合理的实现(如兴趣管理),其在大规模玩家环境下依然是可行的,且能够在游戏收入增长的同时平衡流量开销。这使得权威服务器成为大多数现代MOG开发的首选架构。 权威服务器架构:接近防作弊的最佳选择鉴于权威客户端和确定性锁步架构的种种问题,近年来“权威服务器”架构越来越受欢迎。实际上,对于绝大多数游戏来说,权威服务器是目前唯一真正可行的多玩家在线游戏(MOG)架构。 在一个典型的虚拟世界游戏的权威服务器架构中,客户端通常拥有3D引擎,但这个引擎仅用于渲染,而不是进行决策。所有玩家的输入(例如按键和点击)被发送到服务器,由服务器处理玩家和其他对象的移动、碰撞、命中等决策。服务器的游戏世界状态是唯一的权威版本,并会同步给客户端进行渲染。 对于快速反应的游戏来说,每次按键都要往返服务器会产生不可接受的延迟。在这种情况下,客户端通常会实现“客户端预测”,即通过本地处理玩家输入来暂时更新自己的游戏世界副本。然而,当客户端与服务器的视图不一致时,服务器的状态始终是“正确”的版本。因此,客户端预测产生的偏差是暂时的,不会对其他玩家造成影响。 从防作弊的角度来看,权威服务器架构是最佳选择。服务器可以对游戏规则进行强制执行,即便有客户端预测,服务器和客户端之间的冲突也可以通过服务器的权威性来解决。 权威服务器架构:可行但不完美的扩展性尽管权威服务器在防作弊方面极具优势,但许多人认为它不具备良好的扩展性,特别是一些批评者声称其客户端-服务器架构流量需求可能呈现“O(P²)”的增长,即游戏中每个玩家的状态变化需要通知给其他所有玩家。这种理论会带来严重的扩展问题。 然而,实际情况并非如此。现实中玩家的互动范围往往限于他们的“邻近区域”,与世界总人口无关。这种方式在实践中更接近O(P)的增长,而非O(P²)。 这一技术在MOG开发中被称为“兴趣管理”(Interest Management),将在第3章中详细讨论。借助兴趣管理,客户端仅处理与自身相关的实体信息,极大降低了数据流量,使得游戏服务器在处理大量玩家时依然可以实现可行的扩展性。 实际计算示例以下是一个实际的示例来说明上述扩展性理论: 假设某游戏中每个玩家最多只与C=100名其他玩家直接互动。假设每个玩家交互的带宽需求约为15字节/秒,且游戏的平均玩家每月收入为0.05美元。在这种情况下:
因此,只要扩展良好,权威服务器的收入和开销可以保持比例性增长,从而实现经济上的可持续性。 结论权威服务器架构是当今防作弊效果最佳的MOG架构。尽管其扩展性存在挑战,通过合理的实现(如兴趣管理),其在大规模玩家环境下依然是可行的,且能够在游戏收入增长的同时平衡流量开销。这使得权威服务器成为大多数现代MOG开发的首选架构。 权威服务器:虽不完美,但唯一可行总结我们在应对作弊的探讨中对于三种不同架构的分析:
通过以上讨论可知,权威客户端架构在面对游戏规则违规时的抗性较差,对于绝大多数MOG游戏来说这是致命缺陷。而确定性锁步尽管在小规模RTS游戏中可用,但信息泄漏及玩家数量限制使其无法适应大部分游戏需求。 **因此,对大多数MOG游戏来说,唯一可行的解决方案是权威服务器。**虽然有少数例外(如仅限控制台的权威客户端架构游戏或部分使用确定性锁步的RTS游戏),但作为一条普遍准则,大多数情况下权威服务器是最佳选择。 积极应对:希望仍在尽管上文中谈及了众多与作弊相关的问题,可能让你觉得作弊者终将得势,但事实并非如此。虽然在抵御作弊的过程中,我们必须投入大量精力,实现零作弊几乎不可能(尤其是对于超过一千名玩家的游戏),但我们依然可以通过控制作弊者,防止他们对游戏生态系统造成过多影响。 一个在反作弊斗争中大有帮助的观察是:
换到反作弊的语境,我们可以这样说:
作弊的经济规律——特别是商业化的作弊行为——表明,如果存在两个目标,其中一个既吸引人又防护严密,另一个稍逊一筹却保护薄弱,那么商业作弊者通常会选择后者。毕竟,这只是商业行为,无关私仇。 每一点都很重要:多层保护这一规律带来的一个关键启示是:
尽管我们无法打造一个牢不可破的反作弊系统,且反作弊措施越多,被攻击的可能性越小,因此采用多层保护,从不同角度去抓捕作弊者是很有意义的(前提是这些保护层不会对普通玩家造成明显的副作用)。 此外,另一个有趣的观察是,多层防御有助于消耗攻击者的信心。如果攻击者攻破了一个防护层,而你才开始修复漏洞,那他很可能会继续尝试,并且可能再次成功。然而,如果他面前有五层或更多防护,且在攻破一两层后没有获得任何正面反馈,他可能会丧失动力和信心。 换句话说:
现实案例:多层防护的效果现实中有一个典型案例:某次,一名作弊者几乎破解了一个大型游戏的通信协议(并在相关论坛中分享,寻求最后的帮助)。尽管游戏采用了接近完美的权威服务器体系(即无法通过非法手段从外部操作游戏),仍然存在玩家编写刷经验机器人(Grinding Bots)的可能。 这个攻击方案当时颇为巧妙(攻击者替换了客户端中的根证书,然后对自己的客户端发动了中间人攻击,进而截获协议信息)。 对此,开发者布置了五个独立的保护层(每个都足以阻止该攻击),并同时上线部署。结果是,该攻击者从此销声匿迹,且在之后的数年中几乎没有类似的协议破解尝试。这一事件或许只是一个例子,但确实展示了多层防御的有效性,尤其是同时部署多层防护的威力。 第二章总结:确实,权威服务器是最佳选择第二章总结要点:
因此: 在本书余下的部分,我们将专注讨论权威服务器架构。 两个可能的例外情况:
参考文献
|
多人在线游戏的开发与部署:第1卷 development-and-deployment-of-multiplayer-online-games-vol1
The text was updated successfully, but these errors were encountered: