拆除Valorant的战争雾的墙壁

嗨,我是保罗“arkem”张伯拉特,反作用的领先valorant.,骚乱的新战术fps。我是一部分valorant.我是Riot游戏安全部门的一员。了解更多有关valorant.安全,查看我们的反作用内核帖子,并阅读英雄联盟安全技术,查看我们的反作弊技术博客文章

从一开始valorant.发展,我们首要地建立了欺骗性,以确保竞争完整性。在这篇文章中,我会走过这些防骗系统之一 - 战争迷雾。这是其中之一valorant.一家关键安全系统,侧重于打击欺骗游戏客户端访问信息的作弊,如墙壁。

Wallhack里有什么?

骗子使用Wallhacks通过墙壁来看对手。在战术射手中喜欢valorant.,这使得它们在各个战斗遭遇以及整个圆形的战略决策方面提供了巨大的优势。墙壁尤其存在阴险,因为它们给出了一个并不总是显而易见的优势 - 你的敌人可以使用wallhacks……或者他们只是发现你每轮都用B。我们真的想防止怀疑的感觉徘徊在球员,毒害他们的经验赛后很长时间。

没有雾战:Wallhacks给出了播放器的大量游戏优势。

valorant.团队(包括我)是战术FPS类型的长期粉丝,我们都有一个以上的比赛在其他游戏中被欺骗毁了。亚博论坛在开发开始时,当我们谈论该项目的安全目标时,一遍又一遍地出现的两件事是壁虎和瞄准。

在其中一个计划会议期间,我被生产者询问为什么英雄联盟对wallhacks没有问题。我解释了联盟的战争系统的雾 - 如果您想了解更多关于此信息,请退房这篇文章是关于战争迷雾的联盟,这是关于净能见度的。他询问是否有可能实施类似的东西valorant.,我的答案是“好吧,也许,但这会很棘手。换句话说......我在它上!“

解决方案的骨架

联盟战争系统的雾化是因为游戏服务器扣留有关敌人位置的信息,直到客户需要显示它。我知道如果我能实施这样的东西valorant.我们可以解决Wallhacks的问题,因为Wallhack没有任何东西可以看到。如果对手在墙后面,我们不会将他们的位置送到敌人的球员,让他们隐藏在他们决定偷看角度。如果我们可以将其拉下来,这似乎是理想的解决方案 - 但我们不知道这是否可以在虚幻引擎中可行。

这对我来说是一个艰巨的任务。我是新的项目,这是我的第一个未发布的游戏项目,使用发动机我不熟悉,并通过完全不同类型的游戏灵感的技术。我们的战争系统将基于联盟“除了在一个新的发动机之外,在更复杂的3D环境上运行,它必须适应valorant.那太严格的性能约束

网络相关性

首先,我拿到了我们需要做这项工作的库存:

  • 一种决定每个玩家所必需的信息的方法

  • 防止玩家接受不必要的信息的方法

  • 当必要的信息变得不必要的信息时捕获球员的方式。

是时候潜入虚幻引擎的胆量。

阅读文档和发动机源代码的一周由原声带推动的(第二)最佳黑客电影在所有时间都产生了一些有前途的引线。我发现虚幻引擎具有网络相关性的概念,可用于限制网络更新,甚至挖掘非相关行为。我还发现虚幻引擎复制系统最终是一致的,所以一旦信息变得相关,敌方玩家的状态就会赶上来。此时,我越来越有信心,这是一个可行的解决方案。我想我们可以将这些网络功能与虚幻发动机的射线通道结合起来用于视线检查,我们将在业务中。

注意:

虚幻引擎术语中的“演员”是一个可以在网络上同步的独立游戏对象。代理人,武器和能力是网络演员的例子。

原型设计

关闭工作,我走了,仍然在精神上,思考,毕竟也许这不会那么难。一周后,我煮了一个简单的原型。

它的工作原理是这样的:每次服务器想要发送一个网络更新(通常每次都是一次),它会从每个网络参与者(代理,武器等)对每个玩家的视角参与者进行视线检查。如果视线检查失败,我们将把actor标记为不相关并停止发送网络更新。否则我们将它们标记为相关并发送通常的更新,并在他们错过的任何更新时赶上它们。

在标记演员时不相关,服务器向该播放器发送了一条消息来标记不相关演员像看不见和无形的(因为他们处于过时的位置并显示它们会误导)并最终审议他们。当演员变成了相关同样,它会发送一条消息来产生它们(如有必要),然后使它们可见并启用碰撞。

那怎么样?有效!

好吧......它有点工作。有一吨虫子,但基本的想法是声音。如果你看不到敌人,服务器不会告诉你他们在哪里,那么壁球就是没用的!但是,有表现存在的问题,而视线检查有一些严重的局限性。还有很长的路要走,我很快意识到它不会像我希望的那样容易。但我知道它可以完成。

在接下来的几个部分中,我将通过这些问题,以及我们如何解决它们,这使我们能够达到我们有保护的战争系统的稳定和有效的迷雾valorant.今天。

问题&解决方案

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

同时,随着比赛的其余部分走到一起,我还需要继续对战争的迷雾进行小调整,从janky原型转变为抛光valorant.我们今天有。这意味着反复返回以固定飞机的碎片,而它已经在空中。

服务器可见性问题

早期在测试中,清楚地表明了解可见性检查。在Playtests期间,演员将无限期地流行或保持不见实。不需要长时间发现原型的基于雷播的视线计算不足。雷播不会检测到演员何时可见,直到为时已晚,有时检查根本不会成功。

我之前经历了几次迭代,然后在持续工作的解决方案上。最初,我通过添加额外的射频来计算界限框的边缘来集中在视线计算中,但这没有解决弹出窗口。我的第二次尝试涉及扩展边界框以试图捕获未来的行为,但视线检查仍然是从根本上过于悲观(偏向消极结果以避免误报)。第三次和最终尝试是第二次尝试的“展望未来”的混合,结合基于遮挡的剔除,以取代不可靠的射线。

视线计算

我第一次解决的问题是悲观的视线检查。第一个原型从玩家的相机位置朝向演员的中心施放单个光线,但这会产生不准确的(悲观)结果。

这是有问题的,因为有时间玩家无法看到演员的中心点,但仍然可以看到演员。它会在门,壁架或角落遮挡演员的中点的情况下完全不准确的结果 - 以及作为敌人偷看一个角落的大量流行。换句话说,这将是一种新的极端形式的帕克斯的优势。

一个基本的视线检查到演员的中心并不能很好地工作。

尝试#1

我的第一个解决方案是从相机中获取原始的单线轨迹,并将其设置为10条射线:一条用于actor的边界框的每个角落,一条用于actor的相机位置,一条用于中心。这样好多了,但还不够完美,因为在地图上有些地方,演员的中间和角落被挡住了,但仍有一小部分清晰可见。所以这个解决方案是不可靠的,这将使系统的成本增加10倍——当我们承诺使用128台服务器时,很难证明每次发射数千次raycast是合理的。

对边界框的视线检查有助于缓解但不是完整的解决方案。

尝试#2

我的第二次迭代明显更成功。我通过将actor的速度乘以“look forward”时间来扩展actor的边界盒,从而使raycast能够展望未来,这个时间比预期的ping时间还要长。这就避免了在敌人靠近角落之前将信息发送给玩家的弹出效果。服务器有效地展望未来,及时为客户端获取所需的信息。

扩展边界框以解释运动和延迟真正有帮助!

此时,系统是可行的,但仍有错误和性能问题。在一些问题上通过一些问题谈论valorant.我们意识到,我在视线计算中处理的服务器可见性问题与一个叫做遮挡剔除的常见客户端图形问题非常相似。

服务器端阻塞扑杀

遮挡剔除是一种技术,游戏引擎使用,以删除不必要的对象之前,从一个场景发送到图形卡渲染。减少发送到GPU的对象的数量可以使渲染的速度更快。

我在战争能见度雾的问题是相似的,因为:

  • 两个系统都决定了哪些对象是可见的。

  • 两者都需要乐观的结果,如果我们不需要,我们只会删除东西。

  • 两者都需要真正快速地让它成为第一个值得抵御梳理。

我决定采取我们的客户闭塞剔除系统,并将其运行在游戏服务器上,作为做十条射线的替代方案。

我们的遮挡剔除系统使用称为潜在可见套件(PVS)的技术。PVS系统预先计算场景(我们的地图)的哪些部分可以看到哪些其他部分。我们提前运行一个过程,将场景划分为细胞 - MINECRAFT的Vimagine Voxels。然后,它计算每个小区和场景中的每个其他单元之间的视线,然后将所有数据存储在查找表中,这就像一个巨大的乘法表。

杰特的细胞可以看到丛林着色的所有细胞。

我拍摄了此查找表并启动了与服务器资产和客户端包的启动。而不是在相机和演员之间进行射线追踪,我只是做了一个表查找,看看相机的体素是否可以看到目标演员的体素。这比射频更快,而且也乐观。只要Voxel的任何部分都可以看到其他体素的任何部分,表返回“可见”。这有助于我们避免弹出错误,并导致大规模的性能增益。

这种预先计算的可见性表为我们提供了快速和慷慨的视线测试。

性能

在实现遮挡剔除解决方案之前,我们的服务器性能是可怕的,帧时间加倍,基本上将我们从128滴回到64个勾号。在10名玩家游戏中,我们每帧计算相关性超过350倍,每一个都包括相对昂贵的原始10射线视线检查。

基于新的PVS的检查大大提高了性能,并且我通过其他一些优化获得了更多。例如,系统开始假设相关的演员保持与少量时间相关,并假设附加的演员共享父母的可见性。因此,如果玩家可以看到另一个角色,系统不会打扰他们是否可以看到他们的武器。这些变化减少了系统执行显着使其更快地执行的计算量。

如今,战争系统的迷雾占上2%的服务器帧时间(我们的第一个原型中的50%)。整体系统甚至提高性能由于网络消息的减少服务器发送给由战争雾隐藏的播放器。

一致性和状态管理

解决服务器可见性和性能问题是在正确的方向上迈出的一大步——但我们仍然需要粉碎bug !有些bug相对较小,比如如果玩家这一轮没有看到敌人,他们就不会出现在记分牌上。这些需要在我们捕获它们时进行小的调整和修复。

但是其他更大的错误可能会严重影响游戏——比如敌人没有以正确的动画姿势出现(这会破坏命中注册),或者角色在走过一个角落后会有一段时间隐形。一个常见的错误来源是游戏中的逻辑是由网络事件驱动的(使用虚幻引擎的RPC系统),而不是最终一致的复制系统。

这个错误课的一个例子是,当战争雾隐藏的敌人开始欺骗钉子时,那个观察到它们的球员会在默认字符姿势而不是尖峰诽谤姿势看到它们。

左:玩家看到了什么。
对:实际发生了什么。

这将发生,因为由于战争的雾,不会发送“开始尖峰声明”事件,并且没有机制在离开战争之后修复国家 - 而他们的位置会更新,他们的目前构成不会。此类错误是常见的,并且当游戏系统处理自己的网络消息传递和国家管理时发生了常见的。这种模式经常发生在原型设计期间,因为它允许系统并行构建,因此在峰值相关内容上进行的实验不会妨碍基础设施工作或安全系统,如战争迷雾。

通过添加战争和解逻辑的雾后,我们决定使用任何系统可以使用的标准解决方案来单独修复这些错误的每一个和每个实例。负责代理和游戏系统负责的游戏工程师构建了一个称为效果容器的系统。这种整齐的客户端游戏效果并提供了一个标准机制,以便在战争雾中出现后重新启动和快速转发效果。在演员留下战争雾之后,钉子播种的尖峰播放不仅会播放,但它也具有正确的剩余持续时间。

这类修复错误的系统方法只有两个原因。首先,由于开发早期有多早,创造了战争系统的迷雾。第二,因为工程师来自跨越valorant.对安全和充满热情很高兴考虑安全在设计他们的系统时。

测量有效性

我与战争迷雾有一个问题是如何跟踪它是否按预期工作。对于特别的安全系统,重要的是测量有效性并确保正确运行的功能,或者失败可能会被忽视。

在战争雾的发展期间,我建立了一些不同的壁虎工具来测试。他们做了一项非常好的工作,展示了在行动中的战争迷雾,但这个工具更适合寻常检查而不是捕获错误,所以我建立了测试和仪表板,以确保我们一直捕获事情的工作。

自动测试

为了在系统中构建更多的信心,我通过创建一些自动测试案例在我的Wallhacks上扩展,其中一些自动测试案例让机器人进入和退出战争。这有助于我们确保战争系统的迷雾仍在运行后在每个新构建后运行。这些自动化测试很好在检测系统中的总缺陷,但他们并没有真正帮助我们发现微妙的问题,并且他们不会让我们整体看待系统效率。

仪表板

要捕获这些微妙的问题并获得整体系统性能的快照视图,我创建了仪表板以跟踪真实匹配中的健康和效果。我建立了遥测到游戏服务器,测量每次战争查询的结果。然后我使用这些结果来构建仪表板,显示敌人的时间数量相关的数量以及每个结果的雾百分比每个结果(例如,“不相关”或“由于视线上的相关”或“相关”)。然后,仪表板通过Map和Agent进一步突破,所以我可以看到那些特定内容类型是否存在任何问题。

使用此遥测,我有能力设置警报阈值,以确保我注意到当新的内容或系统更改时会影响战争的雾。例如,如果一个代理商被列为远远超过其他代理人,我将被警告,并可以调查以查看是否有任何具有任何功能的错误。像这样的情况是一个错误,杰特上升的能力发挥了一种会在循环中陷入困境的声音(虽然在不明显)。它在这个遥测中出现了捷克运动员的明显更高的相关时间。

这种仪表盘比较战争迷雾代理的相关状态来帮助我们找到bug。

最终的想法

安全作为核心产品目标

战争系统的迷雾(除了其他valorant.安全功能)只有可能因为团队将安全性视为核心产品目标。该valorant.团队在生产周期的早期就开始致力于安全特性,这使得我们在构建关键游戏系统时能够考虑到安全需求。这创造了一种所有开发者都投入(并参与)游戏安全的氛围。我相信这极大地提高了游戏的整体安全性。通过让我们所有的开发人员一起解决安全问题,我们相信我们已经为打击作弊者建立了最好的基础。我们将继续致力于寻找新的解决方案valorant.安全。

所有这项工作导致了一个系统大大减少了敌方位置可用于玩家的系统,从而降低了墙壁的有效性。

期待

我期待着制造的一些优化 - 战争系统的雾是一个平台,在我们获得新信息时会继续提高。我们可以扩大战争系统的雾,收紧公差,以提高安全性。当我们获得更多关于平均延迟的数据以及有关不断的作弊景观的更多信息时,我们将能够调整最大的战争。

战争雾后:墙壁的影响大大减少了。

谢谢阅读!如果您有任何疑问或意见,请随时在以下意见部分发布。

由Paul Chamberlain发布