打个比方,在传统的网络游戏里,你操控角色对着面前的怪物攻击了一次
这个怪物受到伤害扣除了10点血。
下面,让我们回顾一下这个过程,过程为:你攻击怪物→怪物受伤扣10点血量。那么在玩家的客户端和服务器之间这个过程是以这样的方式进行交互的:
你(操控鼠标点击怪物)→客户端(判断点击鼠标行为,判断为攻击。目标为怪物,攻击值为10,上传数据)→服务器(接受数据,判断数据正常合理,攻击有效。怪物扣除血量10点,玩家无损伤,下发数据)→客户端(接收数据,播放动画)→你(看到了怪物-10血)。
传统的网络游戏是怎么防范外挂的呢?还是以上面的为例子。
你(操控鼠标点击怪物)→客户端(判断点击鼠标行为,判断为攻击。目标为怪物,攻击值为10,上传数据)→外挂(拦截客户端数据,篡改攻击值为9999,伪装客户端上传数据)→服务器(接受数据,判断数据是否合理。如果判定数据通过则怪物扣血9999点,玩家无损伤。如果判定不通过则驳回数据请求并触发反作弊系统检验玩家数据包,发现作弊行为然后封号)。
聪明的你应该已经看出来了,角色操作的数据权限在于客户端,但是角色的数据判定和后续的权限在于服务器,服务器需要验证玩家上传的数据然后在提供给玩家反馈数据,玩家能改变的只有操作交互,服务器里的内容你是接触不到的。
这些交互内容需要上传和下载大量的数据内容,而上传下载都是需要时间的,这些时间便是你游戏体验中的延迟。如果你仔细观察就会发现,网络游戏中角色死亡并不是一瞬间的,比如魔兽世界中从高处掉落摔死往往迟钝一下才会死亡灰屏。这个迟钝的时间就是数据交互判定带来的延迟。
而与其他的网络游戏不同,FPS游戏的胜负之分往往只在一瞬间,游戏中发射一颗子弹后,这颗子弹的落单点在哪里?在有没有击中敌人?击中敌人后造成了多少的伤害?这些数据需要游戏程序在极短的时间就做出完整的判断并反馈给玩家,很多时候这种数据走完整个循环流程可能不到0.1秒,这种游戏玩法是不会给予客户端和服务器之间充足的延迟时间的,没有哪个射击游戏的玩家能忍受打完一梭子后还得等上几秒才能计算出具体的伤害,这样的话射击游戏就从拼反应变成了纯粹的拼网速,游戏也就变了味。
怎么办?FPS的设计者们想到了一个*操作,就是下放数据权力让客户端自己去完成一些验证操作,这样可以极大的降低数据传输的负担也能完美的提升游戏玩家的游戏体验。比如在传统网络游戏里,一只木箱子后面有个敌人,你的角色在客户端,而敌人在服务器。你移动自己的角色走到可以看到他的位置,那么客户端发送给服务器的仅仅是你角色的坐标,服务器验证坐标合理后再告诉客户端你的位置可以看见敌人了,然后你的屏幕才显示出来敌人。
但是在FPS游戏中不是这样,你的角色和敌人都在本地的客户端,敌人的位置和你的角色是否能看到敌人是由本地的客户端验证的,客户端不停地发送你的角色坐标给服务器,服务器也不停的发送敌人的坐标给你的客户端,你的客户端从一开始就知道这只木箱子后面有个敌人,只是它不想告诉你并用木箱子的模型遮盖住了这个敌人的模型,你能不能看见敌人完全是本地客户端说了算,不需要服务器去验证。那么FPS的外挂原理就是入侵客户端与服务器的传输程序窃取服务器发送给客户端的敌人的坐标然后用红框框显示出来。这就是所谓的透视,至于自瞄锁头技术不同但和透视的逻辑上大差不差。
如果你理解了FPS和传统网游之间的差别,那么下面就能更好的向你解释透视自瞄是怎么完成的。
正常观察:
你(移动角色来到了木箱子前面)→客户端(上传玩家坐标)→服务器(下发敌人坐标,接收玩家坐标并广播给其他玩家的客户端)→客户端(接收数据,敌人就在木箱子后面但是我不告诉玩家嘿嘿嘿)→你(只能看见一只木箱子)。
透视观察:
你(移动角色来到了木箱子前面)→客户端(上传玩家坐标)→服务器(下发敌人坐标,接收玩家坐标并广播给其他玩家的客户端)→外挂(偷偷窃取敌人坐标但不干扰数据包传输)→客户端(接收数据,敌人就在木箱子后面但是我不告诉玩家嘿嘿嘿)→外挂(你不告诉我告诉,敌人就在木箱子后面我已经用红框框标记了!)→你(看见了一只木箱子和一个标记敌人的红框框)。