大家好,我是安德鲁-弗里德兰(Andrew Friedland),命运2工程团队技术负责人,我们负责多项事务包括命运2的奖励系统。我最终领导了关于Perk权重问题调查的编程工作,并且向大家介绍我们这边发生的情况。
我们社区团队将此问题上报给我们的时机实际上相当巧合。当这个问题首次出现在我们团队的关注列表中时,团队的一名工程师文森特·戴维斯(Vincent Davies)刚刚写完了一个脚本,这个脚本的用处是帮助我们验证"前线"中新一代护甲的属性分布,稍作修改,我们就能够使用这个脚本帮助我们验证武器的Perk分布,模拟每分钟数千次掉落并记录数据供我们分析。使用这个工具,我们也能够快速验证社区的发现。
我们的发现是?虽然单个Perk的概率是均等的,但成对Perk的概率却并非如此。
以下是10w次VS 冰冷抑制掉落测试的结果。正如社区发现的那样,有些Perk组合比较常见,有些不太常见,有些几乎不可能获得。
为了理解这里发生了什么,我们首先需要深入探讨一些数学和计算机科学知识,来定义我们所说的“随机”是什么意思。
什么是随机
真正的随机事件是指我们可以为其分配概率但无法预测的事情。这包括抛硬币或掷骰子等事件,以及更广泛的物理现象,例如闪电击中哪里或放射性原子何时衰变。对于所有这些,我们可以对某事发生的可能性做出一般性预测,但我们无法准确预测会发生什么。我们也无法在我们想要的时候重复某个结果。计算机本身无法做到真正的随机,当需要真正的随机性时,人们求助于大气噪声(例如收音机或电视上的静态噪声)、宇宙背景辐射的记录,甚至熔岩灯的图案。然而,大多数事情并不需要真正的随机数,对于游戏而言,我们通常不希望有真正的随机性,因为我们无法控制它。
很多年前,一些聪明人提出了伪随机数生成器 (PRNG) 的概念。伪随机的基本思想是,给定一个种子数(通常是当前系统时间),我们可以运行一系列数学运算来得到一个相当随机的数。然后,你可以使用这个新数作为下一个随机数的种子,最终得到一个足够随机的数列。
伪随机相比真随机数在游戏中的一个巨大优势在于其可重复性。使用相同的初始种子,你将始终获得相同的数字序列,这意味着如果你拥有相同的初始种子和相同的输入,游戏结果将相同。游戏利用这一点用于许多不同的用途,从保存游戏到公平竞赛等等。
伪随机 的一个主要缺点,正如其名称所示,是它们是伪随机的。伪随机 的输出中可能会出现"模式",并且根据你的使用方法,你最终可能会放大这些模式,而不是得到看起来随机的东西。
为了帮助大家更好地理解各种算法,我将使用由我们的工程总监 乔-文森(Joe Venzon) 帮忙生成的示例数据。我们将从伪随机的基本用例开始,使用 1 作为第一个种子,然后使用最后一个结果作为下一个值的种子。这将产生一个漂亮的点云,没有明显的可识别模式,类似于旧电视屏幕上的雪花。这正是我们想要的,因为它意味着我们的随机数在可能性空间中相当均匀地分布,并且在查看我们的数字序列时不应该有任何明显的模式。
不幸的是,在 Destiny 中,我们不能总是将之前的结果作为下一个种子反馈进来。在生成新的随机数时,有很多地方需要稳定可预测的种子,而这种新的种子选择最终导致了我们的问题。
这个BUG
在《命运 2》中,我们为物品创建了分别名为插槽和组件的新系统。此系统处理玩家视为装备的大部分内容,包括武器Perk、模组、着色器、大师强化,甚至是护甲属性。随机物品在《遗落之族》添加,它们主要通过插槽和组件系统运作。《命运 2》中的武器会有枪管、弹匣和其他Perk的插槽。当我们拾取该武器时,我们会从可用组件列表中选择组件插入这些插槽,而这些组件分别代表你熟悉的Perk。去年“锻造狂潮(仙器时代)”的混乱局面,都要归功于这个系统的灵活性。
玩家可以根据自己的操作或获取方式,在同一件物品上启用不同的插槽,就像最初的制造护甲的实现方式一样。这意味着在初始化新的掉落物时,我们无法假设总是以相同的顺序初始化插槽。为了确保商人为所有玩家都提供相同的Perk组合,即时玩家有更多的插槽,我们为每个要初始化的插槽使用不同的种子。不幸的是,这种为了增加稳定性而做的额外工作最终导致了我们的错误。
为了为物品上的每个插槽选择稳定的种子,我们最终将许多不同的信息片段组合在一起,使用哈希函数,这是一种将大量数据转换为单个数字的数学方法。虽然这个新的哈希数字如我们最初设想的那样保证稳定,但由于插槽索引是添加到哈希中的最后一个片段,我们经常最终得到哈希值连续的情况,而这些连续的种子最终导致了坏的结果。
回到我们的表格,让我们从观察连续数字的哈希值开始。虽然哈希值本身并不连续,但我们可以看到输出数字中一些相当明显的模式。这意味着当我们查看连续数字的哈希值时,我们很可能能够在输出的哈希值中找到模式。虽然这本身并非坏事,但这确实意味着我们输入 PRNG 的数据中存在一些有趣的模式。
如果我们将这些数字输入随机数生成器,我们会发现输入数据中的这些模式破坏了我们的输出,导致数据中出现一些模式。这些模式具体来说就是导致一些Perk组合很容易获得,而另一些却几乎不可能找到的原因。
早期沙盒调查
终极问题:你为什么没有早点调查 RNG?
每次我们看到玩家反馈中关于难以获得特定组合的武器时,我们的沙盒团队都会首先查看武器数据。武器的Perk从来没有任何故意设置的权重,并且在缺乏更多证据的情况下,我们就此作罢。
随机数生成在游戏中(实际上对所有游戏来说)都处于非常底层且基础的层面,如果没有明确或充分的证据表明存在问题,那么指派工程师进行调查并不总是明智的。如果这样的问题频繁出现且显而易见,我们早就应该注意到了,对吧?
就像所有游戏开发一样,这是一个优先级和权衡的问题。许多工程师和质量保证人员都专注于打造《命运》的未来。如果将他们的优先事项转移到一个可能并非真正问题的领域,这将付出一定的成本,并且可能会影响到那些正在开发中的功能和内容。
在这种情况下,围绕数据收集工作而组织起来的社区,有力地证明存在问题,我们需要对 RNG 代码进行更深入的调查。
调查发现,这个问题在游戏中存在已有一段时间,但直到最近才引起玩家社区的广泛关注和重视。玩家开始主要关注铁旗的 多机系统CCX 冲锋枪和 晚星之主 的 VS 寒冷抑制 重型榴弹发射器。
尽管这个 bug 影响了所有武器,但它有时也会导致更容易获得理想的Perk——因此在一段时间内没有被注意到。
几个相互重叠的问题导致了这种情况:
- 问题在Perk池为6*6的武器上最为严重。
- 多年来,出现同样情况的武器拥有更多或更少的Perk组,在一定程度上掩盖了这个问题的影响。
- 多排Perk很大程度上缓解了随机数导致的坏结果。
- 专家武器和列表武器都有多排Perk
- 大多数的终局武器来源,例如试炼,Raid,日落都有专家版本。
- 玩家可以通过重置声望来获得多排奖励。
- 对于可锻造的武器来说,这个Bug无关紧要,自从《邪姬魅影》加入锻造系统以来已经应用到了大多数的非终局武器来源。
最终,我们的社区随着时间的推移收集到了足够的证据,证明即使在权重相同的Perk设置下,也存在更深层次的问题需要解决。
修复
本-汤普森(Ben Thompsom),我们资历较深的一位工程师,几乎立刻就意识到了这个问题。对于任何在最初的冥冥低语任务发布时就在玩的人来说,你可能还记得曾遇到过无法触发“Taken Blight”公共事件的问题(又是卡巴尔?!)。事实证明,这里潜在的问题与此类似,我们当时使用的是顺序输入来为随机数生成器提供种子。在那时,以及在这里的解决方案都是将我们的哈希输入乘以很大的素数以更好地分配它们,也称为数据加盐。虽然顺序输入之间仍然会有一个规律的步长,但现在两个顺序输入之间的实际值差异显著,因此我们避免了一些模式问题。当我们对这些加盐的输入进行哈希运算时,最终会得到一系列分布得更好的哈希值。
当我们将加盐的哈希值输入随机数生成器时,我们再次得到一个漂亮的点云,没有任何明显可辨别的模式。
回到我们最初使用 VS Chill Inhibitor 的测试案例,修复后我们的Perk分布看起来如何?所有Perk组合出现的几率相对均匀,与随机事件的样本预期存在一些轻微的偏差。现在获得任何特定Perk组合的概率应该接近真正的随机,正如最初的设计意图。
Perk选择修复已在 8.1.0.4 更新中上线,我们计划很快对代码库的多个区域进行审计,以查找任何类似问题。总而言之,这些经验教训将使我们能够防止此类问题再次发生,或者至少能够帮助我们不时进行更好的抽查,以确保错误不会再次出现。我要感谢社区成员令人印象深刻的数据收集工作,这帮助我们识别出潜伏在现在相当古老且经过验证的代码中的这个相当隐蔽的问题。
更多游戏资讯请关注:电玩帮游戏资讯专区
电玩帮图文攻略 www.vgover.com