轻量级人群重复随机化器

轻量级人群重复随机化器

满城都是同卵双胞胎这件事,是不是也让你和我一样感到刺眼?如果是的话,来看看这个模组吧——它能修复这个问题,还会带来大量你很可能从未见过的多样变化,而成本几乎为零!

- 简介 -

《赛博朋克 2077》很棒,但有一件事它做得不够好,那就是确保人群的多样性。游戏中虽然有很多选项,但引擎并不能很好地追踪其生成的内容,因此整个城市,尤其是人群中,会出现大量重复的 NPC。这有时会非常令人不适,具体取决于情境。

本模组旨在尽可能高效地解决这个问题,通过检测重复生成并重新生成这些重复项来实现。这一切都在后台完成,你只会注意到周围环境的多样性增加了。

默认设置已经过测试,效果非常好,本模组可以“安装后即忘”。

- 详细描述 -

在尝试寻找处理重复人群 NPC 生成的好方法时,我决定深入幕后,看看事情究竟是如何运作的。在这个过程中,我成功制作了一个相当轻量级的工具,用于检查重复的生成,并在检测到时,使用引擎原生的随机外观人群 NPC 生成函数来随机化它们的外观。

我的目标是找到并利用最高效的方式来处理重复的 NPC 外观;即对它们进行基本追踪,但不过度消耗资源——性能是关键。NPC 只在生成时被检查,在穿过你可以在选项中决定的限制时不会被检查(如下所述)。

话虽如此,在开发过程中我发现的最大改进之一,是从我自己编写的检查重复生成的代码,转向了模组 No More Duplicates 中已有的代码,该模组由伟大的 MisterChedda 制作,他慷慨地允许我在这个公开版本中使用他的代码!非常感谢!

从技术上讲,脚本会挂接到生成函数上,当检测到人群 NPC 生成时,它会检查该 NPC 使用的外观是否存在于内存池中。如果不存在,它会将此外观存储到池中,然后不再对这个特定的 NPC 做任何处理。然而,如果内存池中存在匹配项,意味着该模组之前已经见过并使用过这个外观(因此将其存储在内存池中),那么这个 NPC 就会被送回 NPC 生成器,以(希望)获得一个新外观。

6.4:愚蠢的是,我听信了一个将我引向 RedEngine 内部的声音,结果毁掉了我原本计划用来真正玩游戏的夜晚。但唉,从兔子洞的另一端出来后,我发现了金子……[size=2]或者,也许是黄铜[/size]。 无论如何:一种更强大的 NPC 匹配方式,应该会大大减少误判,提供更稳定的体验(更少的 NPC 消失/闪现,人群应该是满员的),无论使用什么设置。好吧,也许你把池子上限调到 500 多时效果不会那么好,但嘿——那是的问题!

技术细节:我发现(或者也许是某人直接告诉我的,你永远不会知道,我会把我的秘密带进坟墓!)仅匹配外观效果不佳,因为内部的随机化 NPC 引擎可以而且将会使用实体文件中未定义任何 app 的变体。这意味着之前的 NPC 匹配方式不够准确,因为我首先在生成时按实体层级进行过滤以获取人群,然后查找他们的 app,并用它来检查该外观是否已被使用过,如果是,则该 NPC 会被送回重新生成。[b]简单[/b],[b]快速[/b],[b]有效[/b],而且[u][i]错误[/i][/u]。但现在,我使用了更好的匹配技术代码来查找变体。[i]哇哦![/i]

不过,说正经的:非常感谢你的帮助,@anygoodname,这价值无可估量!

- 请求 -

如果你在使用本模组时有所发现,我将非常乐意收到报告:哪些选项似乎增加了额外的开销,哪些选项似乎效果良好,哪些选项似乎用处不大甚至带来问题(如果有,是什么问题?)。虽然我自己已经通过多次迭代使用了这个模组而没有遇到任何问题,但你的使用体验可能会有所不同。

- 选项 -

模组带有多个选项。所有选项都可以即时使用,无需重启或重新加载。我已注明每个选项是否会产生性能开销。

选项已移动到一个新菜单:人群重复随机化器

模组启用:开启/关闭。 虽然这会关闭模组的功能,但模组仍会挂接到 NPC 的生成逻辑并与其列表进行匹配。这意味着如果你真的想关闭模组以节省资源,最好直接卸载它。

精确匹配:开启/关闭。 这会启用一项更昂贵的检查,会消耗更多 CPU,但好处是更少的 NPC 被迫重新生成(这也会消耗资源,例如为下一个 NPC 生成加载网格和纹理),在性能方面应该是零和,但 NPC 消失或人群变薄的几率会更小。可能导致主观上的差异感降低,因为它在强制重新生成之前允许更细微的差异。

追踪消失:开启/关闭。(会产生性能开销) 如果开启,模组将追踪 NPC 的消失和生成,并检查消失的 NPC 外观是否在 NPC 外观池中,如果是,它将移除该引用并允许该外观立即重新被使用。— 此设置自 7.x 版本起不再有效,我们现在总是会正确地从未缓存中移除已消失的外观。

区域风味检查:开启/关闭。(会产生性能开销) 这允许检查生成的人群 NPC 是否适合所在区域。目前它仅检查市中心和恶土,前者只允许公司员工,后者只允许流浪者。

启用最小距离:开启/关闭滑块。(会产生性能开销) 为了避免重新随机化在玩家附近生成的 NPC,你可以启用此检查,它会跳过检查距离低于相关滑块设置值的 NPC 生成。这主要是为了避免 NPC 在你的视野中消失。不过即使关闭此选项,我在测试中也从未真正看到这种情况发生。

启用最大距离:开启/关闭滑块。(会产生性能开销) 这允许你忽略在距你一定距离之外生成的 NPC,跳过对这些 NPC 的重复检查。启用两个距离选项意味着你周围会形成一个走廊区域,我们会检查该区域内的重复项。请注意,在距离外生成的 NPC,如果与已生成的 NPC 重复,仍可能走进你的视野,并被视为他们真正(哦,恐怖!)的重复项。

最大池大小:数值范围滑块。(潜在性能开销) 此选项决定我们在内存中保留多少个独特外观并用于检查新生成。如果池满了,最旧的条目将被最新的独特外观生成所挤出。但是:池越大,生成的 NPC 可能被迫多次重新生成,最终才能找到一个当前未使用的外观的风险就越大。这是因为我们不会告诉引擎使用哪些外观(或外观组)。警告:如果池大于可用的独特外观数量,你可能会遇到新生成的人群 NPC 被不断送回重新生成的情况,最终导致它们永远无法生成。

池满时清除:开启/关闭。(潜在性能提升) 开启此选项后,一旦内存池被填满,就会完全清空,实际上相当于重新开始。关闭此选项时,当池满且生成新 NPC 外观时,只会移除最旧的条目。

- 更新 -

5.1 - 修复了一个关于类型比较的微小编译警告,可能是在我不注意的时候混进去的![哎呀!] 5.2 - 添加了一个缺失的括号,以确保我们只在距离检查实际开启时才花费 CPU 周期![唉,逻辑真难!] 6.4 - 添加了一个更精确的匹配系统,虽然使用成本更高,但也意味着更少(或没有?)的误判,这应该会带来性能上的净收益。[叮,叮,叮!] 6.5 - 添加了对之前遗漏项目的检查。[跳跳嘟嘟!] 6.6 - anygoodname 发现了损坏的地方并修复了它,效率极高!不,说真的——巨大的升级![敬礼!] 7.0 - 对追踪系统进行了近乎完全的重写——现在我们能追踪所有生成,不再清除!因此,设置功能是损坏的,但我们稍后会修复![嗖嗖嗖!] 7.1 - 快速修复了设置,它们现在应该无需重新加载游戏即可正确应用![咔哒咔哒咔哒!] 7.2 - 设置终于正常工作了![呜呼!] 只花了四个小时才找出 ModSettings 不喜欢我的变量前缀。ヽ(`Д´)ノ 8.0 - 添加了游戏启动前的保护,并让引擎稳定后再开始随机化。 9.0 - 更新为需要 DigitalVixen Core 和 Redscript 配置框架。支持 18 种语言 + 英语 = 共 19 种语言,配置现在可以通过游戏内干净整洁的弹窗完成。 9.1 - 日志记录移至可选的 RedLogger 插件,可在游戏内配置框架的日志查看器中阅读。 9.2 - 为 RCF 模组选择器添加了卡片 json;为日志增加了更细的粒度。

- 未来更新 -

暂无计划中的更新,但如果我能找到进一步优化的方法,我会实施。当然也会修复任何错误。

- 需求 -

此模组需要你安装以下内容: Redscript Codeware 及其所有依赖项。

对于 9.0 之前的版本: Mod Settings 及其所有依赖项。

对于 9.0+ 版本: DigitalVixen Core 及其所有依赖项。 Redscript Configuration Framework 及其所有依赖项。 RedLogger 及其所有依赖项。

- 推荐 -

我强烈建议不要使用以下模组,因为它不是必需的,并且只会消耗资源。

Expanded Citizens

- 安装 -

  1. 安装所有依赖项。
  2. 将下载的文件解压到你的游戏主目录中。

- 卸载 -

v7.2+: 删除文件 \Cyberpunk 2077\r6\scripts\CrowdDuplicateRandomizer6.reds 和 \Cyberpunk 2077\r6\scripts\CrowdDuplicateRandomizer6Settings.reds

v6.x-v7.1: 删除文件 \Cyberpunk 2077\r6\scripts\CrowdDuplicateRandomizer6.reds

v5.x: 删除文件 \Cyberpunk 2077\r6\scripts\noDuplicateCrowds5-public.reds

存档中没有写入任何信息,因此随时卸载都是安全的。

- 致谢 -

感谢 MisterChedda 提供的宝贵建议和代码,也感谢 f80h,他的原创工作最初启发我开始了这次冒险! 非常感谢 anygoodname 的指导和帮助! 也感谢 maffaxxx 帮助我测试 6.4 版本!