辐射卡顿修复器

辐射卡顿修复器

FOSE 必需。改善卡顿和/或性能。

杂项

《辐射》卡顿修复工具

版本 4.0.7

由 SkyRanger-1 创作

论坛主题:http://www.bethsoft.com/bgsforums/index.php?showtopic=1069833

TESnexus页面: http://www.fallout3nexus.com/downloads/file.php?id=8886

这是一个FOSE插件,它只能在FOSE 1.2 beta 1或更高版本上运行。

这仅适用于《辐射3》1.7版本。

====================================

0. 目录:

====================================

  1. 目录
  2. 概述
  3. 安装
  4. 卸载
  5. 常见设置变更
  6. 所有设置
  7. 版本历史
  8. 运作方式
  9. 鸣谢

====================================

1. 概述:

====================================

这个插件能显著减少《辐射3》的"卡顿"现象,使游戏运行更流畅、性能更佳。它能预防或缓解多种与卡顿和帧率相关的问题,并降低因卡顿导致游戏崩溃的频率。更多详情请参阅第7节:工作原理。

但请注意,这通常不会修复驱动程序、硬件或编解码器的问题——如果你的性能问题源于根本原因,这个方法可能帮助不大。

这是《上古卷轴4:湮没》卡顿修复工具(OSR)的移植版本,适用于《辐射》系列。目前,它的效果不如原版的《湮没》卡顿修复工具,但应该能起到一定帮助作用。

这应该与所有内容兼容。
唯一的注意事项是,监控FPS的模组将无法准确测量此插件设定的目标范围之外的FPS(默认为10到30)。
实际上,即使是接近FSR目标的FPS也可能难以测量。

====================================

2. 安装:

====================================

安装过程如下:

1.A. 如果您安装的FSR版本是一个.zip文件,只需将压缩包中的"Data"文件夹拖拽到您的Oblivion文件夹中。 1.B. 如果你安装的FSR版本不是以.zip文件形式提供的,那么你需要将文件sr_Fallout_Stutter_Remover.dll放入你的Fallout\Data\fose\plugins文件夹中。如果没有这个文件夹,请创建一个。如果你安装了旧版本的FSR,请删除其ini文件(Data\fose\plugins\sr_Fallout_Stutter_Remover.ini)。如果没有现有的FSR ini文件,那么FSR会在你下次运行《辐射》时生成一个适合你版本的新ini文件。

====================================

3. 卸载:

====================================

只需从Data\fose\plugins文件夹中删除sr_Fallout_Stutter_Remover.dll文件。 将该文件移动到另一个目录也足够了。

====================================

4. 常见设置变更

====================================

一般来说,FSR会尽量提供合理的默认设置,这样用户就不需要频繁调整它们。
不过,有些设置的默认值可能并不适合你,可能是因为默认值不符合你的偏好,也可能是因为FSR对你的电脑做出了错误的假设。

FSR将其设置保存在文件Data\fose\plugins\sr_Fallout_Stutter_Remover.ini中 如果该文件不存在,只需启动安装了FSR的《辐射》,FSR会为您的版本生成一个带有默认设置的新文件。
如果您在设置中搞砸了某些内容,或者想恢复默认设置,只需删除这个ini文件并重新启动《辐射》。

你可以在第5节中找到关于设置的一般信息,以及每个单独设置的更完整信息。

您最可能需要更改的设置包括:

FPS_Management\MaximumFPS: (默认值为30,建议更改为0或其他数值)

有些人不想让帧率受到任何限制。
你可以将此值设为0来关闭FPS限制。
此外,如果你在玩《辐射》时屏幕刷新率不是60赫兹,
可以尝试将此值改为你的屏幕刷新率、
或刷新率的一半、
或刷新率的三分之一。
如果Master\bManageFPS被改为0,
此设置将不会生效。

哈希表\b允许动态调整大小:(默认为0,建议改为1)

启用此选项可显著提升重度模组游戏的总体性能/帧率。
遗憾的是,它可能导致竞态条件和普遍混乱,尤其是在每帧运行使用某些FOSE命令的脚本时。
我已尽力将问题发生几率降至近乎零,但...可能仍需更多改进工作。
目前该功能默认处于禁用状态。
若将Master\bHookHashtables设为0,则此设置将无效。

关键区域抑制:(特殊)

默认情况下,FSR会抑制一个特定的关键段,而《辐射》在没有这个关键段的情况下运行得更好。
还有另一个相关的关键段,部分用户似乎可以抑制它而不引发问题,但其他用户在抑制它时会遇到室内到室外切换时的CTD或其他问题。
这个关键段仅对卡顿有微小的改善效果,因此我通常不建议抑制它,但如果你愿意也可以尝试。
要抑制它,请在ini文件中找到"CallerAddress = 0x70172A"这一行,并在其下方添加新的一行"Mode = 5"。
请注意大小写很重要...应该是"Mode"而不是"mode"。
如果Master\bHookCriticalSections或CriticalSections\bUseOverrides设置为0,此设置将不会生效。

注意:上方被划掉的README部分针对的是《上古卷轴:湮没》,而非《辐射》;《辐射》中有对应的内容,但我还没抽出时间去查找具体的数值。目前请忽略那部分。

====================================

5. 所有设置

====================================

FSR 将其设置保存在文件 Data\fose\plugins\sr_Fallout_Stutter_Remover.ini 中 如果该文件不存在,只需启动安装了FSR的《辐射》,FSR会为你的版本生成一个带有默认设置的新文件。
如果你在设置中搞砸了某些内容,或者想恢复默认设置,只需删除这个ini文件并重新启动《辐射》。

请注意,FSR的ini文件格式在主版本之间会发生变化——您不应将FSR版本1的ini文件用于FSR版本2,以此类推。在FSR2中,ini文件被组织成类似"SectionName { SettingName = Value }"这样的节。可以通过SectionName\SettingName来引用特定设置,以区分不同节中同名的其他设置。通常,名称以"i"开头的设置是整数值(即没有小数点的数字),以"b"开头的设置是布尔值(即0或1),以"f"开头的设置是可能包含小数点的数字(如3.14)。有些设置不以这些字母开头,这种情况下可能不清楚其值的正确类型。

以下是设置及其当前默认值(可能不是100%最新):

段落:主控{}

本部分提供了禁用FSR各主要子系统的选项,以及一些不属于FSR特定子系统的设置项。

Master\b管理FPS(默认值:1)

将此设置为0将禁用所有FPS管理功能,使FPS_Management部分中的所有设置无效。

Master\bHookCriticalSections(默认值:1)

将此设置为0将禁用所有关键部分功能,使CriticalSections部分中的所有设置失去意义。

Master\bHookLightCriticalSections (默认值: 1)

将此设置为0将禁用所有轻量级关键部分功能,使得LightCriticalSections部分中的所有设置变得毫无意义。

Master\bHookHashtables(默认值:1)

将此设置为0将禁用所有哈希表功能,使CriticalSections部分中的每个设置都失去意义。

Master\bReplaceHeap (默认值: 0)

将此设置为1将启用堆替换,使堆部分中的设置生效。

Master\bLogToConsole (默认值: 0)

FSR会记录各种信息到日志文件中。
将此设置更改为1将导致FSR同时将这些信息打印到控制台。

日志文件位于Fallout目录下的sr_Fallout_Stutter_Remover.log。
每次运行安装了FSR的Fallout时,该文件都会被创建或覆盖。

大师\b修复64赫兹(默认值:1)

将此设置为1可修复《辐射》中导致"微卡顿"的问题。该问题有时被称为"64赫兹问题"。具体来说,问题在于《辐射》的游戏逻辑计时通常以1/64秒的分辨率运行,而屏幕刷新率通常允许《辐射》在垂直同步限制下每秒绘制60帧。这种组合会在帧率达到上限时产生一种拍频现象,即每秒有4帧的游戏时间是其他56帧的两倍。FSR应用的修复方案强制《辐射》使用1/1000秒的时间分辨率,而非原来的1/64秒。

Master\bFlushLog (默认值: 1)

这告诉FSR立即将所有日志消息写入文件,而不是在内存中缓冲它们。由于磁盘访问次数增加,可能会略微降低性能,但它使得在崩溃前短时间内发生的任何问题相关消息更有可能成功写入日志文件。

Master\iSchedulingResolution (默认值: 1)

FSR会请求Windows调度器以这么多毫秒为间隔运行。将此值设为1时,FSR和《辐射》通常表现更佳。但这可能会略微缩短笔记本电脑的电池续航时间。

章节:FPS管理{}

本节包含调整FSR如何管理帧率和游戏时间流的设置。

FPS_Management\bAllowSlowMotion(默认值:1)

将此设置为0将阻止FSR尝试覆盖游戏时间的正常流动。过去曾因FSR这样做而出现过错误(最臭名昭著的是附近NPC在场景切换时突然死亡的bug),但现在这些问题被认为已经修复。不过,如果你怀疑可能存在问题,可以通过此设置强制禁用所有FSR对游戏时间的调整。尽管名称如此,将其设置为0也会阻止FSR快进游戏时间,不过FSR仅在极少数设置和情况下才会尝试这样做。

FPS_Management\最大FPS(默认值:30)

这是FSR不允许《辐射》超过的最高FPS值。

我通常将其设置为足够高的帧率,这样我就不会太在意额外的每秒帧数。

请注意,FSR在这里并不真正处理"每秒帧数",而是将该值转换为每帧毫秒数,并单独考虑每一帧。

如果一帧完成得太快,FSR会让《辐射》的主线程进入休眠状态,直到经过正确的毫秒数。

让《辐射》的主线程休眠可以为《辐射》的后台线程或其他可能在后台运行的程序释放资源。

如果没有程序需要使用这些额外资源,那么你的CPU和/或GPU会运行得更凉爽并消耗更少的电力。

FPS_管理\最低FPS(默认值:10)

这是FSR不允许《辐射》低于的最低FPS值。
不过,这里处理的不是实际时间秒数,而是游戏内时间秒数。
因此即使你的电脑非常慢,仍可以保持1 FPS,但这会使游戏时间减慢至正常速度的10%,从而确保每秒游戏时间至少能有10帧。
以上数字仅为示例,基于实际FPS为1且MinimumFPS设置为10(默认值)的情况。
另外请注意,与MaximumFPS类似,此设置实际上是基于单帧处理的,计算单位是每帧毫秒数而非每秒帧数。

我通常将其设置为勉强可玩的最低FPS。
这个设置的主要目的是防止当FPS过低时,辐射游戏的逻辑变得混乱。
它可以避免的问题包括:
因敌人在帧间绕着你转圈而无法进行的战斗,
因辐射认为攻击键在整个帧内被按下或未被按下而导致的操作混乱(可能导致本想普通攻击却触发强力攻击),
以及其他许多类似问题。

FPS管理\i平滑帧数(默认值:0)

如果设置为0,"平滑"逻辑将不起作用。要启用平滑逻辑,可以尝试将其设置为2。不过,有报告表明平滑逻辑的实际效果并不明显。平滑逻辑旨在解决因帧率卡顿和快速变化引发的各种问题。如果bAllowSlowMotion为0,平滑逻辑将不会生效。

FPS_管理\i平滑模式(默认:0)

这应为0、1、2或3。
如果是0或1,则会启用一些额外逻辑,尝试从时间流中过滤掉卡顿事件。
如果FPS出现骤降,该逻辑可能导致游戏经过的总时间与实际经过的时间不完全相等。
如果是2或3,则禁用该额外逻辑。
0/2与1/3之间的区别在于帧间时间重新分配的细微处理方式差异。

FPS管理\iSleepExtra(默认值:2)

FSR 将强制让《辐射》每秒休眠这么多毫秒。这有助于为后台线程或其他进程释放资源,或略微降低电脑组件的温度与功耗。主要好处在于,如果某个后台线程正艰难获取主线程占用的某项资源,这能让它偶尔有机会获取到该资源。

如果此值设为-1,FSR帧率管理代码将永不使《辐射》进入休眠状态——若帧率可能超过MaximumFPS上限,FSR将通过空转循环消耗时间。该模式仅用于测试目的,不建议常规使用。

FPS_Management\bFPSConsoleSPAM (默认值: 0)

这将导致FSR记录完成每帧所需的时间。
它会每帧记录一次,从而产生大量的记录时间。

FPS_管理\i调度偏执(默认值:1)

此设置以毫秒为单位。
它决定了MaximumFPS代码对调度器的偏执程度。
如果数值较高,MaximumFPS代码将永不休眠,而是在空闲循环中浪费时间。
如果数值为0,MaximumFPS代码将完全信任调度器能在精确请求时间恢复主线程执行。
通常我会折中设为1,既保持对调度器的适度警惕,又能让大部分空闲时间得到有效利用。

FPS_Management\iHardMaxFrametime(默认值:200)

这是以毫秒为单位的。我们发现,当我的时间流调整代码在错误的时间输入一个过大的数值时,会发生奇怪的事情。糟糕的事情。比如,附近的NPC随机倒地死亡。这个设置通过设定FSR在正常情况下允许一次性通过的最大毫秒数来防止这种情况发生。通常你会先达到MinimumFPS的限制,但在某些情况下MinimumFPS会被忽略以防止副作用,比如嘴唇动作与声音不同步,所以这就像是第二级的MinimumFPS,即"我真的非常认真的最低FPS"。将这个值设置得太低可能会导致对话中嘴唇动作不同步,设置得太高则可能允许诸如NPC随机死亡之类的错误。我将其设置为200作为折衷方案——除非你的帧率在对话中降至5以下,否则它不会导致嘴唇不同步。而如果你在帧率低于5的情况下玩《辐射》,那你真的需要好好检查一下了。

章节:关键部分{}

本节介绍FSR对《辐射》中CRITICAL_SECTION所做的所有更改。想了解CRITICAL_SECTION对象吗?《辐射》使用它们来防止其各个线程意外相互干扰。微软提供了它们的代码。《辐射》根据运行的Windows版本使用略有不同的版本。您可以在MSDN上阅读更多相关信息。

CriticalSections\bEnableProfiling (默认值: 0)

如果设置为1,FSR将记录《辐射》中关键部分操作的时间/性能信息。这样做会对性能造成虽小但显著的影响。FSR会在其日志文件中记录这些信息。这可能会提供有关《辐射》为何卡顿或运行缓慢的有用信息。这些信息可用于调整FSR ini文件的"Overrides"部分或其他内容。

CriticalSections\bEnableMessages(默认值:0)

如果设置为1,FSR将记录关键部分的一些计时/性能事件信息。
这样做几乎不会影响性能,但可能会使日志文件变得杂乱,更难在其中找到非关键部分的信息。

关键部分\b使用覆盖(默认值:1)

如果设置为1,FSR将使用ini文件"Overrides"部分中的设置来决定如何处理特定的关键部分。

CriticalSections\iDefaultMode(默认值:2)

这决定了FSR如何处理那些在覆盖列表中没有模式条目的关键部分。

1: 它在接近正常行为时离开该关键部分。 2:它调整了关键部分,以牺牲吞吐量为代价提高公平性。这可以防止一个线程过多地占用关键部分,但会降低使用该关键部分执行操作的整体速率。 3:一种试图在公平性和吞吐量之间取得折衷的方案,通常优先优化吞吐量,但偶尔会切换行为以优化公平性。 5: 该关键部分被抑制。抑制关键部分通常会导致《辐射》崩溃,但通常也能提升性能。不过某些关键部分可能会受到不同的影响。 6: 主线程对该关键部分具有优先权。 7: 后台线程对该关键部分获得优先级。

CriticalSections\iDefaultSpin(默认值:500)

这会影响线程在请求调度器将其置于休眠状态之前,持续尝试进入临界区的时间长度。理论上,值过小会导致过多的调度器开销,而值过大则会浪费CPU周期。我认为500实际上是一个相当小的值。理想值可能会随着你拥有的核心数/硬件线程数而增加。

CriticalSections\iStutterLevel(默认值:4)

此参数影响关键部分模式2的行为切换频率。有关关键部分模式2的更多信息,请参阅iDefaultMode。数值越小表示切换越频繁,数值越大表示切换越不频繁。理想值可能应在3到6的范围内。

部分:轻量级关键部分{}

本节介绍FSR对一类Fallout对象所做的所有更改,这些对象的功能类似于CRITICAL_SECTION,但更为轻量级。

LightCriticalSections\bFullHooks(默认值:0)

如果设置为1,则将启用更完整版本的光临界区钩子。
遗憾的是,更完整版本目前仍存在缺陷,因此当前默认禁用。

LightCriticalSections\bEnableProfiling (默认值: 0)

如果设置为1,FSR将记录《辐射》中轻量级关键部分操作的计时/性能信息。这样做会对性能造成轻微但显著的影响。FSR会在其日志文件中记录这些信息。这可能会提供关于《辐射》为何卡顿或运行缓慢的有用信息。这些信息可用于调整FSR ini文件的Overrides部分或其他用途。

LightCriticalSections\bEnableMessages(默认值:1)

如果设置为1,FSR将记录一些轻量级关键区域的计时/性能事件信息。这样做对性能影响极小,但可能会使日志文件变得杂乱,更难在其中找到非关键区域的信息。

LightCriticalSections\bUseOverrides (默认值: 1)

如果将此设置为1,FSR将使用ini文件中Override部分中的设置来决定如何处理特定的关键部分。除非启用了完整的LCS钩子(上述bFullHooks),否则覆盖设置将不会生效。

LightCriticalSections\iDefaultMode(默认值:2)

这决定了FSR如何处理在覆盖列表中没有模式条目的轻度关键部分。
它尝试使用与关键部分内容类似的模式编号方案 - 更多信息请参见上面的CriticalSections\iDefaultMode。
某些模式的行为可能会因bFullHooks是否启用而有较大差异。

LightCriticalSections\iDefaultSpin(默认值:500)

这决定了FSR如何处理那些在覆盖列表中没有Spin条目的轻度关键部分。它试图与关键部分的内容具有相似的含义 - 更多信息请参见上面的CriticalSections\iDefaultSpin。Spin的含义可能会有所不同,具体取决于bFullHooks是否启用。

LightCriticalSections\iStutterLevel(默认值:4)

此参数影响轻度临界区模式2的行为切换频率。有关临界区模式2的更多信息,请参阅iDefaultMode。数值越小表示切换越频繁,数值越大表示切换越不频繁。理想值可能应在3到6的范围内。

段:堆{}

这些东西在《辐射》中还不能真正使用。请勿使用。

章节:哈希表{}

《辐射》包含了一系列用于查找各种内容的哈希表。
它们采用了一种普遍糟糕的哈希表实现方式,
但真正的问题在于这些哈希表从未进行过扩容。
当哈希表过载时,性能会急剧下降。
而如果哈希表利用率不足,则可能浪费少量内存,
并降低缓存一致性。
遗憾的是,大部分哈希表代码被内联到各处,
FOSE也对哈希表做了各种假设,
而且我完全不清楚相关的线程模型应该是怎样的,
因此安全地修改它们相当困难。
不过,我已经实现了一些哈希表钩子,
它们正在逐步改进。

哈希表\b允许动态调整大小(默认值:0)

如果设置为1,FSR会在哈希表过满时自动扩容。
然而扩容操作本身存在诸多问题——可能导致崩溃或故障,
而我用于预防这些问题的方法又可能引发轻微的性能卡顿、
或其他崩溃及故障。
不过目前来看,这个功能或许已经能基本正常运作了。

Hashtables\bUseOverrides (默认值: 0)

目前还没有哈希表的覆盖设置,而且指定它们的语法很笨拙,如果输入错误的值,可能会静默失败并执行其他操作。不过这个问题最终会得到修复,以允许通过ini文件指定钩子来初始化最重要的哈希表,使它们一开始就具有合适的大小,而不需要在之后调整大小。

哈希表\b启用性能分析(默认值:0)

这将监控哈希表并记录关于其填充程度和被访问频率的信息。

哈希表\b启用消息(默认值:0)

如果此值为1,则哈希表代码可能会偶尔记录其正在执行的操作信息。

哈希表\iHashtableResizeScale1(默认值:2)

哈希表\iHashtableResizeScale2(默认值:4)

如果 bAllowDynamicResizing 为 1,则 iHashtableResizeScale1 将决定哈希表调整大小的最低占用率,而 iHashtableResizeScale2 将决定新大小的增加幅度。这两个数字实际上是应用于 2 的指数,因此设置为 3 意味着系数为 8,设置为 5 意味着系数为 32。理论上,将 iHashtableResizeScale1 降低到 1 可能会进一步提高性能,因为它会增加更多哈希表的大小。iHashtableResizeScale2 应该设置为比 iHashtableResizeScale1 大 1 或 2。

哈希表\iHashtableResizeDelay (默认值: 20)

这是FSR在调整哈希表大小时会暂停的毫秒数。目的是虽然我无法阻止另一个线程在我忙于处理哈希表时访问它,但希望能阻止它们开始访问哈希表。所以我延迟足够长的时间,也许、可能让已经在访问哈希表的人完成操作,然后我再做我的事情。不幸的是,这在FOSE上不起作用,因为FOSE与Fallout做的事情不同,而且即使做了也不会使用虚函数表来完成。但目前我认为FOSE可能只从主线程访问它们,所以如果我的调整大小程序在主线程中运行,就不必担心FOSE。也许吧。

章节:覆盖{}

本节包含的信息告诉FSR如何找到它已知的各种类型对象的特定实例,以及如何对这些特定实例采用不同于该类型对象默认设置的处理方式。目前,这里实际列出的只有一些行为与大多数不同的特定关键部分。

====================================

6. 版本历史:

====================================

FPS限制器版本1:

这被称为FPS限制器。
它的功能仅限于FPS管理。
该版本已被整合进一组修改过的OBSE动态链接库中。

FPS限制器版本2:

这是首个拥有独立于OBSE的dll的版本。
它被称为FPS限制器。
其功能仅为FPS管理。

遗忘之域卡顿修复器版本3测试版1:

第一个版本命名为"遗忘之城卡顿修复器"。
有时在主菜单会冻结数分钟。
NPC对话时的语音和面部动作可能会出错。

版本3测试版2:NPC语音和面部动作在对话中可能出现问题。

遗忘之域卡顿修复器版本3测试版6:

beta 5 和 beta 6 之间间隔了很长时间,期间发布了多个 alpha 版本。
这是 FSR 首个真正能为普通用户有效减少卡顿的版本。
这得益于以下新功能:关键段公平性调整、关键段抑制和堆替换。
遗憾的是,堆替换功能仍对许多用户存在严重问题。
ini 文件中 bFix64Hertz 默认设置为 0,实际上应设为 1。

注意:从未发布过正式版3.0。如果需求量足够大,我可以基于3.0 beta 6的源代码制作一个修复若干问题的版本。

辐射防卡顿修复工具版本1测试版1:

将OSR初步移植到《辐射》系列。

上古卷轴/辐射 卡顿修复补丁 版本4.1.0:

主要变更: 1.支持《辐射》与《上古卷轴》共用一个代码库:对《辐射3》的帮助不算太大,但确实有所裨益。 2..ini文件:完全不同的ini文件格式 3.哈希表调整大小:提升性能的新特性 4.关键部分与轻量级关键部分:对关键部分的许多特殊情况进行了泛化处理,现在可以通过ini文件进行更多调整。轻量级关键部分代码的"完整钩子"仍然存在缺陷。 5.堆替换:修复了一些错误,但我认为它仍然存在问题。在《辐射》中仍然完全无法使用。 6.版本命名规则:发布至tesnexus的版本现称为正式版而非测试版。发布至本人FTP服务器的版本现称为测试版而非内测版。版本号首位数仅在配置或分发格式发生重大变更时递增。版本号第二位数随每个正式版发布递增。版本号第三位数则随每个测试版发布递增。当某一位数字递增时,其右侧所有数字均重置为0。

====================================

7. 运作方式:

====================================

这是一个FOSE插件dll。它基本上是对《辐射》进行修改。

7.1:帧率管理:

FPS管理代码负责监控帧率并调整游戏时间流速。
它通过防止《辐射》游戏逻辑在卡顿时跳过进程来减轻卡顿现象。
实际上,耗时较长的帧会以慢动作呈现。
这是通过让《辐射》表现得像设置了iFPSClamp到MinimumFPS值实现的,但仅针对低于MinimumFPS的帧。
此举可能还能提升稳定性。
它也可设定最大帧率上限——部分玩家认为当帧率不超过刷新率一半时游戏更流畅,同时这有助于为《辐射》的次要线程释放资源。

FPS管理代码还可以让Fallout的主线程短暂休眠,据观察这能改善部分玩家的卡顿问题(不过该功能可能已被本插件的其他优化措施所取代)。

7.2:关键部分:

关键部分是微软提供的线程同步原语,Fallout内部使用它们来确保线程不会意外相互破坏。默认情况下,FSR会让大多数关键部分尝试公平竞争,即使以吞吐量为代价,确保没有线程独占其他线程所需的资源。然而,有一个特定的关键部分被覆盖为使用稍微不那么公平的方法,另一个特定的关键部分被完全抑制,使其根本不起作用。所有这些都可以通过ini文件进行高度配置。此外,自旋计数也会被覆盖。

7.3:堆替换:

此功能目前在《辐射3》中运行不正常。

7.4: 哈希表:

《辐射》包含了一堆用于查找各种内容的哈希表。
它们使用了一种普遍糟糕的哈希表实现,
但真正的问题是这些哈希表从不调整大小。
当哈希表过载时,性能会急剧下降。
如果哈希表未满载,则可能浪费少量内存。
不幸的是,大部分哈希表代码被内联到各处,
而FOSE也对哈希表做了各种假设,
而且我完全不清楚相关的线程模型应该是怎样的,
因此安全地修改它们相当困难。

不过,我还有一些哈希表的钩子,它们正在逐渐改善。FSR可以在哈希表过载时增加其大小。然而,调整大小的操作充满了问题——可能导致崩溃或故障,而我用来防止这种情况发生的方法可能会引起小的性能卡顿或其他崩溃或故障。尽管如此,目前我认为它可能运行得还算不错。未来我可能会通过覆盖某些哈希表的初始大小来替换或补充这一功能。

====================================

8. 制作人员:

====================================

该插件由我(克里斯托弗·多蒂-汉弗莱)制作。

没有FOSE团队的巨大努力,这一切都不可能实现。此外,Ian Patterson(FOSE团队成员)在我遇到困难时给予了许多帮助。

促使我开始开发这个插件的原始讨论帖是由DeviusCreed发起的。

众多测试人员提供了宝贵的反馈。
特别是mashani提供的关于哪些设置为他带来哪些结果的信息,帮助我理解了早期版本为何会产生意料之外的效果,并促成了后续版本中多项功能和设置的引入。

我还要感谢badhair指出哈希表溢出是导致性能问题的原因。

本插件制作过程中使用了以下工具:

《遗忘之都》/《辐射》,贝塞斯达出品 OBSE/FOSE 及 OBSE/FOSE 源代码 Microsoft Visual C++ 2008 速成版 IDA Free(交互式调试器,免费版本,4.9版) 作弊引擎(版本5.4) 再加上显而易见的东西,比如Windows XP、记事本和火狐浏览器。

除了《上古卷轴4:湮没》/《辐射》和Windows XP外,其他所有内容均可免费获取。

我也听人推荐过Hex Workshop和ollydbg,但还没抽出时间去试用它们。