(三千字长文预警、催眠预警,建议吃饭时下饭看)
写在前面:楼主并没有接触过无尽战区的源码,也不清楚无尽实际的功能实现方式,本帖子完全是楼主以玩家的角度猜测无尽战区的可能使用了哪些技术,再试着分析这些技术会带来什么样的问题,有什么解决方法。楼主在程序方面,水平有限,才疏学浅,如有错误,请多指教。(吟唱完毕,叠最厚的甲,挨最毒的打hhh)
以下正文:
【篇章1】程序员和游戏外挂斗智斗勇
最近关于游戏外挂的讨论还蛮多。我就先讲讲网络游戏中的外挂吧。
无尽是开房间式的多人竞技游戏,其网络同步方式是“状态同步”(这个以后有机会再详细讲讲),网络拓扑结构是C/S架构。什么是C/S架构呢?简单地讲,就是野火官方扮演服务器(比赛裁判),而我们玩家作为客户端(比赛选手)参与其中,相互切磋。在这种情况下,服务器理论上是“全知全能”、“绝对权威”的,我们所有玩家都以服务器为准,大家都听服务器的,你说你打到我了,我不信,裁判说了算,这样自然能够拥有绝对的公平!但这种理想的状态真的能够达到吗?答案是否定的,因为裁判是个“瞎子”!!!!
从服务器的角度来看,我们10个玩家分布在天南海北,服务器并不能直接接管我们的电脑,它获取信息的渠道完全依赖于玩家客户端和服务器的网络通讯(比如电话给裁判说:喂,我打中xxx了,你快扣他99999点血),这时候问题就来了,服务器该不该完全相信客户端呢?
事实证明,玩家(的电脑)都是大骗子,完全不可以信任!抛开故意开挂的坏蛋不说,普通玩家也是有可能欺骗裁判的,可能在有网络延迟的情况下发出错误的消息,当然这里不能怪玩家,因为错的是这个世界哒(物理规则:电磁波的光速限制)!在这种艰难的情况下,裁判自然是要开动脑筋(算力),模拟一下游戏场景,看看玩家说的合不合理,可不可以相信。
举几个例子:
1. 玩家:喂,裁判!我稻草人出击啦!
裁判:嗯?你现在明明在跟玲珑姐姐跳舞,你骗人,我不信,不准你放技能。
2. 玩家:喂,裁判!我里特”就位“干掉对面老头了,你快送他回基地!
裁判:嗯?你们中间明明隔着一堵墙,而且就算打中了,按我计算出来的伤害值你也秒不掉老头。假的,驳回。
3. 玩家:喂,裁判!我刚玉明明已经按了大招了,为啥还是死了,我不服!
裁判:哦,这个嘛,我看到的是你太浪了,冲到塔下先被乱枪打死了,大招并没有放出来,我把大招cd还给你,你回基地休息一会吧……
上面这些例子,看起来公平极了对吧?但是要付出很大的代价……
首先就是,大量的计算会加大服务器的负担,毕竟野火的服务器可能要支持一千万个玩家(这是我对野火的美好期望)同时进行游玩,对于服务器的资源自然要精打细算。当然这个问题我们也有别的解决方式,那就是加钱!买更多的服务器。
第二个成本,也是最主要的成本,那就是延迟。网络通讯是需要时间的,以每秒30帧的更新频率的游戏为例,即便是以光速传播,你和美国的朋友之间也有着2帧的延迟,而且网络通信是”回合制游戏“,你的消息发过去,还要等服务器给你回消息呢,这个延迟就要翻个倍了。更别说网络通信根本达不到光速,你的消息其实是先发到隔壁老张的路由器,再发到隔壁的隔壁……这样不断转发,最后才传到服务器的手中的,中间要是谁家的路由器堵了,发的很慢,或者干脆把你的消息给丢了,你还要重新再发一遍,这些都是肉眼可见的时间成本呐!!
这些时间成本在游戏上的表现是什么样的呢?那就是超影响游戏体验、超严重的延迟感。想象一下,你放技能时、技能打中敌人的时候,都要卡顿几帧等服务器的应答,网络差劲的时候可能还要按秒计算,这样的手感你可以接受吗?或者你能保证键盘不被你一怒之下掰成两半嘛?所以野火程序员为了守护大家的键盘,在服务器的”权威性“上进行了取舍,选择了牺牲一部分”权威性“,相信玩家发来的消息。我猜测这就是无尽这些乱七八糟的外挂能够得手的原因:
1. 攻速微调挂:在服务器端没能成功校验技能、平A的cd
2. 移速挂:没能成功校验英雄位置、位移的合理性
3. 莫名其妙受到伤害挂:没能成功校验伤害的合理性,比如攻击方和受击方的位置关系等
4. 锁位置挂:这我也不知道咋搞的hhh,可能和有控制技能的英雄以及位置校验的逻辑有关
确实,操作手感和外挂比起来,我觉得还是手感比较重要,那有没有“我全都要”的选项呢?这方面是有不少解决方案的,其中有一项叫做”预测-回滚“的技术,即玩家逻辑在发给服务器的同时,本地不用等待直接进行预表现(预测),等收到服务器发来应答的时候再判断玩家刚刚的预测是否正确,如果错了的话,就回滚到之前的逻辑重新执行。对于动作类(格斗类,射击类同样)网游这种对实时性要求很高的游戏来说,”预测-回滚“是一项十分重要的技术,但要想把这一项技术很好地应用在游戏当中,我觉得是蛮麻烦的,特别是在无尽战区采用的是状态同步这种难以对状态进行快照的情况下……有多复杂呢?大概就是伊森换头像的那个复杂度吧(指让程序员光头)。此外”预测回滚“也不是万能解药,因为”预测“意味着”出错“,多次的”预测“意味着必然的“出错”,错误的预测很有可能会给玩家带来很大的挫败感(上文的刚玉开大就是这样子)。在对抗网络延迟这一部分有很多很多内容,我了解的也不够深入,就不展开讲了……
这样来看,对抗网络延迟是程序员在与天斗,对抗外挂是程序员在与人斗。同时与天斗又与人斗,真是其乐无穷哈哈哈。
当然,除了这种”先手“对抗外挂的手段,把外挂扼杀在摇篮里,我们也还有”后手“的对抗外挂的手段,那就是保存游戏对局数据,事后检验玩家是否作弊,然后封号处理。
好,喝口茶休息一会……
上文说到出现外挂的重要原因就是”信任危机“,服务器过度的相信玩家说的鬼话才导致了作弊的出现。那如果服务器已经非常非常谨慎,完全不信赖玩家的消息,游戏就不会出现外挂了吗?其实还是会有外挂的,因为服务器对客户端的”信任“除了体现在”信任客户端发来的消息“以外,还包括了”信任客户端会遵守规则“。如果客户端不遵守游戏规则,那就会产生————透视挂。
举一个例子,老师偷懒,直接在布置作业的时候把答案发给你,说:必须做完作业才能去看答案哦!坏孩子直接就翻开答案对着抄了。这就是透视挂!在游戏当中,服务器会把所有玩家的位置都进行同步,也就是说不管敌人在不在你的视野内,你的电脑上都已经有了其他玩家的位置数据了,只要想办法提取到相关数据,你就可以”透视“了。
有人会说,诶,游戏数据被提取,那我对游戏数据进行严格的加密不行嘛?No,还不够。不管你怎么加密,游戏画面都是要靠显卡画出来的,有很多骇客会在显卡上下手,把特定的材质画成醒目的颜色,这样也可以达到透视的效果(就像我给显卡梆梆两拳,说:不管敌方英雄有没有被墙挡住,你都要把他画成五彩缤纷的黑色!然后显卡哭着成为了透视挂的帮凶)
想要从根源上解决透视挂,那么服务器就要把玩家当作会偷看答案的坏孩子,只把玩家视野内的敌人位置告诉玩家,剩下的等玩家看到了再发过来。实现这个功能正是状态同步的强项,也只有使用状态同步的游戏才能很好地实现这个功能(像王者荣耀这样用帧同步的游戏很难做到,或者说根本实现不了这个功能……),当然实际写起代码来估计也得抓掉程序员不少头发,会有很多很多的细节需要注意……
呼……讲了这么多,关于严重破坏游戏规则的外挂,上面提到了不少,下面就提一下坏蛋们怎么在不破坏游戏规则的情况下群魔乱舞的吧。
最常见的就是,脚本!通过软件辅助玩家来打出非类人操作,比如1秒点鼠标100下,枪枪爆头这种。现在AI技术快速发展,即便不破解游戏数据,脚本仅通过图像识别来锁头都有着极高的准确率。这种作弊方法,说实话程序员已经很难通过代码来预防了,基本只能在玩家作弊后校验数据进行封号了。但是高端的辅助器也已经能够模仿人类的操作,以假乱真,甚至人工都看不出来了,真的是道高一尺魔高一丈啊……
可以说,反作弊就是一场程序员与程序员(骇客)的斗智斗勇,只不过程序员往往也只能事后补救hhh,因为完全不知道骇客们会找到游戏哪个刁钻的漏洞,然后写出什么稀奇古怪的外挂。反外挂确实是不容易,需要在开发游戏的基础上再投入不少的人力物力(指头发)。
补充网络延迟部分:程序员在决定对抗网络延迟的策略的时候,会有两种倾向,一种是”网速快者获利“,另一种是”网速慢者获利“。如果选择程序员选择了后者,可能也会有坏蛋通过插拔网线,打开迅雷来作弊,这就是所谓的高ping战士。
题外话:看到649的day8了,无尽真的要活了,还要重做引擎,我好激动啊啊!!好期待!!
写在前面:楼主并没有接触过无尽战区的源码,也不清楚无尽实际的功能实现方式,本帖子完全是楼主以玩家的角度猜测无尽战区的可能使用了哪些技术,再试着分析这些技术会带来什么样的问题,有什么解决方法。楼主在程序方面,水平有限,才疏学浅,如有错误,请多指教。(吟唱完毕,叠最厚的甲,挨最毒的打hhh)
以下正文:
【篇章1】程序员和游戏外挂斗智斗勇
最近关于游戏外挂的讨论还蛮多。我就先讲讲网络游戏中的外挂吧。
无尽是开房间式的多人竞技游戏,其网络同步方式是“状态同步”(这个以后有机会再详细讲讲),网络拓扑结构是C/S架构。什么是C/S架构呢?简单地讲,就是野火官方扮演服务器(比赛裁判),而我们玩家作为客户端(比赛选手)参与其中,相互切磋。在这种情况下,服务器理论上是“全知全能”、“绝对权威”的,我们所有玩家都以服务器为准,大家都听服务器的,你说你打到我了,我不信,裁判说了算,这样自然能够拥有绝对的公平!但这种理想的状态真的能够达到吗?答案是否定的,因为裁判是个“瞎子”!!!!
从服务器的角度来看,我们10个玩家分布在天南海北,服务器并不能直接接管我们的电脑,它获取信息的渠道完全依赖于玩家客户端和服务器的网络通讯(比如电话给裁判说:喂,我打中xxx了,你快扣他99999点血),这时候问题就来了,服务器该不该完全相信客户端呢?
事实证明,玩家(的电脑)都是大骗子,完全不可以信任!抛开故意开挂的坏蛋不说,普通玩家也是有可能欺骗裁判的,可能在有网络延迟的情况下发出错误的消息,当然这里不能怪玩家,因为错的是这个世界哒(物理规则:电磁波的光速限制)!在这种艰难的情况下,裁判自然是要开动脑筋(算力),模拟一下游戏场景,看看玩家说的合不合理,可不可以相信。
举几个例子:
1. 玩家:喂,裁判!我稻草人出击啦!
裁判:嗯?你现在明明在跟玲珑姐姐跳舞,你骗人,我不信,不准你放技能。
2. 玩家:喂,裁判!我里特”就位“干掉对面老头了,你快送他回基地!
裁判:嗯?你们中间明明隔着一堵墙,而且就算打中了,按我计算出来的伤害值你也秒不掉老头。假的,驳回。
3. 玩家:喂,裁判!我刚玉明明已经按了大招了,为啥还是死了,我不服!
裁判:哦,这个嘛,我看到的是你太浪了,冲到塔下先被乱枪打死了,大招并没有放出来,我把大招cd还给你,你回基地休息一会吧……
上面这些例子,看起来公平极了对吧?但是要付出很大的代价……
首先就是,大量的计算会加大服务器的负担,毕竟野火的服务器可能要支持一千万个玩家(这是我对野火的美好期望)同时进行游玩,对于服务器的资源自然要精打细算。当然这个问题我们也有别的解决方式,那就是加钱!买更多的服务器。
第二个成本,也是最主要的成本,那就是延迟。网络通讯是需要时间的,以每秒30帧的更新频率的游戏为例,即便是以光速传播,你和美国的朋友之间也有着2帧的延迟,而且网络通信是”回合制游戏“,你的消息发过去,还要等服务器给你回消息呢,这个延迟就要翻个倍了。更别说网络通信根本达不到光速,你的消息其实是先发到隔壁老张的路由器,再发到隔壁的隔壁……这样不断转发,最后才传到服务器的手中的,中间要是谁家的路由器堵了,发的很慢,或者干脆把你的消息给丢了,你还要重新再发一遍,这些都是肉眼可见的时间成本呐!!
这些时间成本在游戏上的表现是什么样的呢?那就是超影响游戏体验、超严重的延迟感。想象一下,你放技能时、技能打中敌人的时候,都要卡顿几帧等服务器的应答,网络差劲的时候可能还要按秒计算,这样的手感你可以接受吗?或者你能保证键盘不被你一怒之下掰成两半嘛?所以野火程序员为了守护大家的键盘,在服务器的”权威性“上进行了取舍,选择了牺牲一部分”权威性“,相信玩家发来的消息。我猜测这就是无尽这些乱七八糟的外挂能够得手的原因:
1. 攻速微调挂:在服务器端没能成功校验技能、平A的cd
2. 移速挂:没能成功校验英雄位置、位移的合理性
3. 莫名其妙受到伤害挂:没能成功校验伤害的合理性,比如攻击方和受击方的位置关系等
4. 锁位置挂:这我也不知道咋搞的hhh,可能和有控制技能的英雄以及位置校验的逻辑有关
确实,操作手感和外挂比起来,我觉得还是手感比较重要,那有没有“我全都要”的选项呢?这方面是有不少解决方案的,其中有一项叫做”预测-回滚“的技术,即玩家逻辑在发给服务器的同时,本地不用等待直接进行预表现(预测),等收到服务器发来应答的时候再判断玩家刚刚的预测是否正确,如果错了的话,就回滚到之前的逻辑重新执行。对于动作类(格斗类,射击类同样)网游这种对实时性要求很高的游戏来说,”预测-回滚“是一项十分重要的技术,但要想把这一项技术很好地应用在游戏当中,我觉得是蛮麻烦的,特别是在无尽战区采用的是状态同步这种难以对状态进行快照的情况下……有多复杂呢?大概就是伊森换头像的那个复杂度吧(指让程序员光头)。此外”预测回滚“也不是万能解药,因为”预测“意味着”出错“,多次的”预测“意味着必然的“出错”,错误的预测很有可能会给玩家带来很大的挫败感(上文的刚玉开大就是这样子)。在对抗网络延迟这一部分有很多很多内容,我了解的也不够深入,就不展开讲了……
这样来看,对抗网络延迟是程序员在与天斗,对抗外挂是程序员在与人斗。同时与天斗又与人斗,真是其乐无穷哈哈哈。
当然,除了这种”先手“对抗外挂的手段,把外挂扼杀在摇篮里,我们也还有”后手“的对抗外挂的手段,那就是保存游戏对局数据,事后检验玩家是否作弊,然后封号处理。
好,喝口茶休息一会……
上文说到出现外挂的重要原因就是”信任危机“,服务器过度的相信玩家说的鬼话才导致了作弊的出现。那如果服务器已经非常非常谨慎,完全不信赖玩家的消息,游戏就不会出现外挂了吗?其实还是会有外挂的,因为服务器对客户端的”信任“除了体现在”信任客户端发来的消息“以外,还包括了”信任客户端会遵守规则“。如果客户端不遵守游戏规则,那就会产生————透视挂。
举一个例子,老师偷懒,直接在布置作业的时候把答案发给你,说:必须做完作业才能去看答案哦!坏孩子直接就翻开答案对着抄了。这就是透视挂!在游戏当中,服务器会把所有玩家的位置都进行同步,也就是说不管敌人在不在你的视野内,你的电脑上都已经有了其他玩家的位置数据了,只要想办法提取到相关数据,你就可以”透视“了。
有人会说,诶,游戏数据被提取,那我对游戏数据进行严格的加密不行嘛?No,还不够。不管你怎么加密,游戏画面都是要靠显卡画出来的,有很多骇客会在显卡上下手,把特定的材质画成醒目的颜色,这样也可以达到透视的效果(就像我给显卡梆梆两拳,说:不管敌方英雄有没有被墙挡住,你都要把他画成五彩缤纷的黑色!然后显卡哭着成为了透视挂的帮凶)
想要从根源上解决透视挂,那么服务器就要把玩家当作会偷看答案的坏孩子,只把玩家视野内的敌人位置告诉玩家,剩下的等玩家看到了再发过来。实现这个功能正是状态同步的强项,也只有使用状态同步的游戏才能很好地实现这个功能(像王者荣耀这样用帧同步的游戏很难做到,或者说根本实现不了这个功能……),当然实际写起代码来估计也得抓掉程序员不少头发,会有很多很多的细节需要注意……
呼……讲了这么多,关于严重破坏游戏规则的外挂,上面提到了不少,下面就提一下坏蛋们怎么在不破坏游戏规则的情况下群魔乱舞的吧。
最常见的就是,脚本!通过软件辅助玩家来打出非类人操作,比如1秒点鼠标100下,枪枪爆头这种。现在AI技术快速发展,即便不破解游戏数据,脚本仅通过图像识别来锁头都有着极高的准确率。这种作弊方法,说实话程序员已经很难通过代码来预防了,基本只能在玩家作弊后校验数据进行封号了。但是高端的辅助器也已经能够模仿人类的操作,以假乱真,甚至人工都看不出来了,真的是道高一尺魔高一丈啊……
可以说,反作弊就是一场程序员与程序员(骇客)的斗智斗勇,只不过程序员往往也只能事后补救hhh,因为完全不知道骇客们会找到游戏哪个刁钻的漏洞,然后写出什么稀奇古怪的外挂。反外挂确实是不容易,需要在开发游戏的基础上再投入不少的人力物力(指头发)。
补充网络延迟部分:程序员在决定对抗网络延迟的策略的时候,会有两种倾向,一种是”网速快者获利“,另一种是”网速慢者获利“。如果选择程序员选择了后者,可能也会有坏蛋通过插拔网线,打开迅雷来作弊,这就是所谓的高ping战士。
题外话:看到649的day8了,无尽真的要活了,还要重做引擎,我好激动啊啊!!好期待!!