站长之家- 部落 2020-04-20T14:07:43 +08:00

瓦罗兰特战争迷雾系统详解 valorant战争迷雾是什么?

瓦罗兰特valorant游戏中的战争迷雾系统是什么意思,与其他游戏中的战争迷雾效果有哪些不同之处呢,这里我们来看下拳头公司《VALORANT》开发部门的反作弊负责人Paul ″Arkem ″Chamberlain对战争迷雾系统的详细介绍。

大家好,我是Paul "Arkem "Chamberlain,Riot的新战术FPS游戏《VALORANT》的反作弊负责人。我是VALORANT游戏开发团队的一员,也是Riot公司众多从事游戏安全工作的人员之一。想了解更多关于VALORANT反作弊相关的信息,请查看我们的反作弊技术内核帖子,想了解英雄联盟的反作弊技术,请查看我们的反作弊技术博客帖子。

从VALORANT立项开始,我们就把建立反作弊作为首要任务,以确游戏的安全性。在这篇文章中,我将带你了解其中的一个反作弊系统--战争迷雾。这是VALORANT的主要安全系统之一,主要是打击利用游戏客户端获取信息的作弊行为,比如透视等。

什么是透视

作弊者利用透视功能来透视对手的墙体。在《VALORANT》这样的战术射击游戏中,这让他们在单人遭遇战以及整个回合的战略决策时都有巨大的优势。透视是特别隐蔽的,因为它所带来的优势并不总是很明显--你的敌人可能是透视...........或者是他们已经发现你每回合都在冲B。我们真的想避免这种怀疑的感觉,因为这种怀疑的感觉会让玩家们在比赛结束后很长时间内都无法摆脱。

VALORANT团队(包括我在内)都是FPS游戏的老粉丝,我们都曾不止一场比赛被其他游戏中的作弊玩家恶心过。在开发之初,当我们在讨论项目的安全目标时,有两件事情被反复提及,那就是透视和瞄准辅助。

在其中的一次策划会议上,有制作人问我,为什么《英雄联盟》没有透视的问题。我解释了英雄联盟的战争迷雾系统--如果你想了解更多关于这个问题,可以看看这篇关于英雄联盟中的战争迷雾的文章,还有这篇关于能见度的文章。他问我是否有可能在VALORANT中实现类似的东西,我的回答是 "嗯,也许可以,但会很棘手。换句话说...........我会做!"

方案的骨架

英雄联盟的战争迷雾系统之所以能够发挥作用,是因为游戏服务器会隐瞒敌人的位置信息,直到客户端需要显示出来。我知道如果我能在VALORANT上实现这样的系统,我们就能解决透视的问题,因为透视者根本看不到任何东西。如果对手在墙后,我们不会把他们的位置发送给敌方玩家,让他们隐藏起来,直到他们决定换个角度。如果我们能做到这一点,这似乎是个理想的解决方案--但我们不知道这在虚幻引擎中是否可行。

这对我来说是一项艰巨的任务。我对这个项目很陌生,这是我第一个未发布的游戏项目,使用一个我不熟悉的引擎和一个完全不同类型的游戏所启发的技术。我们的《战争迷雾》系统将基于《英雄联盟》,除了在一个新的引擎中,在一个更复杂的3D环境中运行,而且必须适应VALORANT非常严格的性能限制。

虚幻引擎中的关联网络

首先,我盘点了一下我们需要什么东西来实现这个目的。

  • 一个决定每个玩家需要哪些信息的方法
  • 防止玩家收到不必要的信息的一种方式
  • 在不必要的信息变得必要的时候,抓住玩家的一种方式。
  • 是时候深入了解虚幻引擎的内幕了。

在有史以来最棒的黑客电影(第二部)的背景音乐的推动下,我花了一周的时间阅读文档和引擎源代码,发现了一些有希望的线索。我发现虚幻引擎有一个网络关联性的概念,可以用来限制网络更新,甚至是去掉非相关的角色。我还发现虚幻引擎的复制系统最终是一致的,所以一旦信息变得相关,敌方玩家的状态就会匹配。这时,我越来越有信心,认为这是一个可行的解决方案。我想,我们可以将这些网络功能与虚幻引擎的视线检查功能结合起来,这样我们就能顺利完成任务了。

注意:虚幻引擎术语中的 "角色 "是一个独立的游戏对象,可以在网络上同步。特工、武器和技能都是可以是这个角色。

原型设计

于是我就去工作了,仍然兴致勃勃地去了,心想也许这并不难。一个星期后,我做了一个简单的原型。

它的工作原理是这样的。每当服务器想发送一次网络上传(通常是每tick一次),它就会做一次视线检查,从每个联网的角色(特工、武器等)到每个玩家的视点角色。如果视线检查失败,我们会将该角色标记为不相关,并停止发送网络更新。否则,我们会将其标记为相关,并发送正常的变化信息,让他们赶上他们错过的任何变化。

当标记一个角色为不相关时,服务器会向该玩家发送一条消息,将不相关的角色标记为隐形和无形的(因为他们处于一个过时的位置,显示他们会产生误导),并最终毁掉这些。当行为者再次成为相关的时候,它将发送一条消息,让它们出现(如果需要的话),然后使他们可见并启用碰撞。

进展如何?它有效!

嗯...... 还算有用。虽然有很多漏洞,但基本的想法是正确的。如果你看不到敌人,服务器就不会告诉你他们在哪里,所以透视是没有用的!但是,性能上也有问题,视线检查有一些严重的限制。还有很长的路要走,我很快就意识到这并不像我希望的那样容易。但我知道这是可以做到的。

在接下来的几个章节中,我将介绍这些问题,以及我们是如何解决这些问题的,这使我们能够达到今天保护VALORANT的稳定有效的战争迷雾系统。

问题和解决方案

在考虑修复BUG之前,我需要做一些调整,以正确地将《战争迷雾》嵌入到VALORANT中。我必须要绑定音频系统,为设计师添加工具,并处理游戏事件的系统通知。这些都是相对简单的修复,一旦完成后,我就可以专注于服务器可见性问题和性能问题等更复杂的问题。

同时,我还需要不断地对《战争迷雾》做一些小的调整,因为游戏的其他部分已经成型了,从一个粗糙的原型变成了今天的VALORANT。这意味着在飞机已经在空中的时候,我还需要反复返回来修复飞机的碎片。

服务器的可见性问题

在测试的早期,很明显可见性检查有问题。在测试过程中,角色们会无限期地出现或隐身。没过多久,我们就发现原型机制基于视线计算的射线播报是不够的。raycast直到太晚才会发现角色何时出现,有时检查根本不会成功。

我经历了几次迭代,最终找到了一个能持续工作的解决方案。最初,我把注意力集中在视线计算上,通过添加额外的视线投射来测试边界框的边缘,但这并不能解决弹出问题。我的第二次尝试涉及到扩展边界框,试图捕捉未来的动作,但视线检查从根本上来说还是太过悲观(偏向于负结果以避免假阳性结果)。第三次,也是最后一次尝试,这是第二次尝试的更进一部,结合了基于闭塞的剔除法来替代不可靠的视线投射。

视线计算

我首先解决的问题是不乐观的视线检查机制。第一个原型算法会从玩家的摄像头位置向角色的中心点投出一条射线,但这样会给出不准确(悲观)的结果。

这是有问题的,因为有的时候玩家无法看到演员的中心点,但仍然可以看到演员。这将导致完全不准确的结果,在门、窗台或墙角遮住了演员的中点的情况下,会造成完全不准确的结果--当敌人偷看角落时,会出现大量的弹出效果。换句话说,这将是小身位peak优势的一种新的极端形式。

以角色为中心的基本视线检查,效果并不好。

尝试一

我的第一个解决方案是把原来的单条射线轨迹从摄像头上取下来,然后把它做成 10 条射线:演员的边框的每个角各一条,一条到演员的摄像头位置,一条到中心。这样做的效果好了很多,但仍然不完美,因为地图上有一些地方,演员的中心和角落被遮挡住了,但仍有一小部分还是可以看到。所以这个方案是有缺陷的,而且会让系统的成本增加 10 倍--当我们致力于128 tick服务器的时候,每tick就有几千次的视线投射,真的很难说得过去。

视线检查对分层掩体的检测有所缓解,但这不是完全的解决方案。

尝试二

我的第二次迭代明显更成功。我通过将角色的速度乘以一个比预期的ping时间更长的 "预测 "时间来扩大演员的边框,使光线广播更远一些。这样可以防止弹出效应,在敌人来之前就将信息发送给玩家,防止了弹出效应。服务器有效地进行预测,使客户端能够及时获得所需的信息。

扩展边界框以考虑到移动和延迟的影响,这确实有效!

在这一点上,系统是可行的,但仍然存在着BUG和性能问题。在与VALORANT的一些图形工程师讨论这个问题的时候,我们意识到,我正在处理的服务器可视性问题与常见的客户端图形问题,即遮挡剔除问题非常相似

服务器端遮挡剔除问题

遮挡剔除是游戏引擎在将场景发送到显卡上进行渲染之前,用来去除场景中不必要的对象的一种技术。减少送入GPU的对象数量,可以让渲染场景的速度更快。

我在《战争迷雾》可见性方面遇到的问题也是类似的,因为:

  • 这两个系统都决定了哪些对象是可见的。
  • 两者都需要乐观的结果,我们只在明确不需要的情况下才会删除信息。
  • 这两个系统都需要非常快的速度,这样才值得我们一开始就做遮挡剔除。

我决定把我们的客户端遮挡剔除系统作为一个替代方案,在游戏服务器上运行。

我们的遮挡剔除系统使用了一种叫做潜在可见集(PVS)的技术。PVS系统会预先计算出场景中哪些部分(我们的地图)可以看到其他部分。我们提前运行一个过程,将场景划分成单元格--想象一下Minecraft中的voxels。然后它计算出每个单元格和场景中的每一个其他单元格之间的视线,然后将所有的数据存储在一个查找表中,这就像一个巨大的乘法表。

捷力的位置可以看到所有标绿的位置

我把这个查找表拿了出来,并开始把它和服务器配置和客户端包一起包含进去。我没有在摄像机和角色之间做射线追踪,而是直接做了查询表,看看摄像机的voxel是否能看到目标演员的voxel。这比光线追踪要快得多,而且也很乐观。只要一个voxel的任何部分可以看到其他voxel的任何部分,表就会返回 "可见"。这帮助我们避免了弹出的bug,并带来了巨大的性能提升。

这个预先计算的可见度表给了我们快速、笼统的视线测试

表现

在实施遮挡剔除方案之前,我们的服务器性能非常糟糕,帧时间翻了一倍,基本上让我们从128 tick回到了64 tick。在一个 10 人的游戏中,我们每帧计算关联度超过 350 次,而每一次都包括了昂贵的 10 次视线检查。

新的基于PVS的检查极大地提高了性能,我通过一些其他的优化获得了更多的收益。例如,系统开始假设相关的角色在少量的时间内保持相关,并假设附属的角色共享其来源的可见性。因此,如果一个玩家可以看到另一个角色,系统就不会去检查他们是否能看到自己的武器。这些变化减少了系统的计算量,使系统的计算速度更快。

如今,战争迷雾系统所占用的服务器帧时间不到2%(低于我们第一个原型的50%)。总的来说,由于减少了服务器向被战争迷雾隐藏的玩家发送的网络信息,系统的性能甚至有所提高。

一致性与状态管理

解决了服务器的可见性和性能问题,是朝着正确的方向迈出了一大步--但我们还有很多BUG要解决! 有些bug相对较小,比如如果玩家还没有看到敌人,就不会在计分板上显示。这些问题需要我们在发现后进行小的调整和修复。

但其他一些比较大的BUG可能会严重影响游戏,比如敌人没有显示出正确的动画姿势(会破坏命中反馈),或者角色在走过一个角落后会有片刻的隐形。一个常见的bug来源是游戏中的逻辑由网络事件驱动的地方(使用虚幻引擎的RPC系统),而不是最终一致的复制系统。

这个bug的一个例子是,当战争迷雾隐藏的敌人开始拆包时,观察他们的玩家会看到他们是默认角色姿势而不是拆包姿势。

左:观察者看到的。 右:实际发生的。

之所以会出现这种情况,是因为 "开始拆包 "事件会因为战争迷雾而无法发送,而且在离开战争之雾后也没有修复状态的机制--虽然他们的位置会更新,但他们当前的姿势不会更新。这类bug很常见,发生在游戏系统处理自己的网络消息和状态管理时。这种模式在原型设计期间经常发生,因为它允许系统并行构建,因此在炸弹相关内容上进行的实验不会妨碍基础设施工作或安全系统(如《战争迷雾》)的工作。

我们决定创建一个任何系统都可以使用的标准解决方案,而不是通过添加《战争迷雾》后的调和逻辑来单独修复这些BUG的每一个实例,我们决定创建一个标准的解决方案。负责特工和游戏系统的游戏工程师们构建了一个名为Effect Containers的系统。这个系统整齐地封装了客户端的游戏效果,并提供了一个标准的机制,可以在演员从战争之雾中出现后重启和快进效果。在演员离开战争之雾后,不仅会在演员离开战争之雾后播放安包动画,而且还会有正确的剩余时间。

这种系统性的修复BUG的方法有两个原因。第一,因为《战争迷雾》系统在开发之初就已经创建了。第二,因为整个VALORANT的工程师们对安全问题充满了热情,在设计系统时,他们很乐意将安全问题考虑在内。

衡量成效

我对战争迷雾系统有一个担心,就是如何跟踪它是否按预期的方式工作。特别是对于安全系统来说,重要的是要衡量其有效性,并确保其正常运行,否则故障可能会被忽视。

在开发《战争迷雾》的过程中,我建立了几个不同的壁障工具进行测试。它们在展示战争迷雾的运行情况方面做得很好,但这个工具更适合于定点检查,而不是抓住BUG,所以我建立了测试和仪表板,以确保我们能够持续地捕捉到事情的运行情况。

自动测试

为了建立对系统的更多信心,我通过创建一些让机器人进入和退出战争迷雾的自动测试实例来扩展我的透视问题研究。这可以帮助我们确保每次新构建后,战争迷雾系统仍能正常运行。这些自动化测试在检测系统中的总缺陷方面非常棒,但它们并不能真正帮助我们发现细微的问题,也不能让我们对系统的有效性有一个整体的看法。

仪表盘

为了抓住这些细微的问题,并获得系统整体性能的快照视图,我创建了仪表板来跟踪真实比赛中的健康和效果。我在游戏服务器中建立了遥测,测量每一次战争迷雾查询的结果。然后,我使用这些结果建立仪表板,显示敌人的相关时间,以及战争迷雾查询中每个结果的百分比(例如,"不相关 "或 "由于视线的关系")。然后,仪表板会按地图和代理进一步细分,这样我就可以看到这些特定的内容类型是否有问题。

通过这种遥测,我可以设置警报阈值,确保我在新的内容或系统变化影响到战争之雾的时候能注意到。例如,如果一个特工被列为 "相关 "的次数比其他的多得多,我就会被提醒,并且可以调查一下他们的能力是否有BUG。有一种情况是这样的BUG,捷力的Updraft能力会在循环播放的过程中播放一个声音(虽然听不到)。在这次遥测中,它表现为捷力玩家的关联性时间明显提高。

这种类型的仪表盘会比较战争迷雾相关性统计,帮助我们找到BUG。

最后的想法安全性是产品的核心目标

战争迷雾系统(除了其他VALORANT的安全功能外)之所以能够实现,是因为团队将安全视为产品的核心目标。VALORANT团队在制作周期的早期就开始研究安全功能,这使得我们在构建关键的游戏系统时能够考虑到安全要求。这创造了一种氛围,让所有的开发者都投入(并参与)到游戏的安全性中来。我相信这极大地提高了整个游戏的安全性。通过让我们所有的开发者一起努力解决安全问题,我们相信我们已经为打击骗子打下了最好的基础。而且我们会继续致力于寻找新的解决方案,以保证VALORANT的安全性。

所有这些工作的结果是,我们的系统大大减少了敌人的暴露时间,从而降低了透视的效果。

我们的期望

还有一些优化我很期待——战争迷雾系统是一个平台,随着我们获得新的信息,我们会继续完善。我们可以对战争之雾系统进行扩展,收紧容忍度,提高安全性。随着我们获得更多关于平均延迟的数据,以及更多关于不断变化的作弊情况的信息,我们将能够对战争迷雾系统进行更多的调整。

推荐关键词

24小时热搜

查看更多内容

大家正在看