|
|
本帖最后由 鼓掌之间 于 2026-3-27 14:56 编辑
转自:https://www.nexusmods.com/skyrimspecialedition/mods/175062
这是一款无脚本的SKSE插件,用于修复被错误禁用/删除的游戏引用,减少微卡顿与各类异常问题。可在游戏内直接动态扫描并修复所有已加载的场景单元格,支持高度自定义配置。
---
功能说明
禁用引用完整性修复工具是一款轻量级SKSE插件,专门修复因损坏的引用、以及放置在《上古卷轴》世界空间地面以下的导航网格数据引发的微卡顿问题。在大型MOD组合中,部分记录的Z轴坐标最终会低于引擎边界(Z轴数值<-30000),这会让引擎在后台持续运算,进而引发卡顿峰值。本插件会在这些引用的模型与贴图加载前完成拦截,自动修正其中的无效数据。
---
运行需求
- SKSE64(《上古卷轴》64位脚本扩展工具)
- 地址库(Address Library)
- Visual C++ 运行库
---
修复内容
本插件的设计灵感大量源自Z-Floor Patcher(Z轴地面补丁),它遵循严格明确的规则,确保仅修复存在问题的记录,规则如下:
1. 若某条记录被标记为「初始禁用」,且非持久化/无父对象/未关联任务,同时Z轴坐标≠-30000,则自动将其Z轴坐标设为-30000
2. 若某条记录的Z轴坐标≤-30000,但未被标记为「初始禁用」,则为其添加该标记
3. 若某条记录被标记为「已删除」,且不属于导航网格,则移除其「已删除」标记,添加「初始禁用」标记,并将其坐标移至Z轴-30000
4. 遵循Z轴地面补丁的规范,将所有初始禁用的导航网格的全部顶点移至Z轴-30000
5. 对于所有被本插件修改的引用,都会将其绑定至玩家引用(playerRef)作为父对象,并添加「启用状态与父对象相反」的标记,确保它们不会因意外情况或其他因素被重新启用。这是一项同步安全机制,很多处理禁用引用的插件均采用该设计。
《上古卷轴》可以兼容很多数据异常,但错误的放置坐标尤为棘手——因为这些对象依然会被渲染。尤其是被标记为「已删除」的引用,在部分情况下还会导致游戏崩溃。
简单来说,本插件会修复游戏内未被正确禁用、因此仍在被渲染的对象;同时修复被标记为「已删除」的对象(永远不应该用这种方式移除对象,会引发各类问题);还会修复顶点垂直坐标过低的导航网格。
禁用引用完整性修复工具并非万能的“性能魔法”MOD,它仅修复MOD作者留下的细微错误,确保引擎只渲染玩家需要看到的内容。
---
核心运行机制
本插件修改记录标记与坐标的核心功能,代码源自《基础对象交换器(Base Object Swapper)》的开源代码。
插件分为两个运行阶段:
- 主阶段:通过挂钩InitItemImpl与Load3D虚函数表,在引用的模型与贴图加载前完成拦截。这是实现防卡顿的核心环节,所有Z轴坐标为-30000、但未带「初始禁用」标记的引用,都会在此处被无条件拦截处理,不会因排除逻辑被静默跳过。
- 次阶段:在场景加载事件、存档加载时运行。负责执行正确的Disable()禁用调用、绑定启用父对象、修正导航网格顶点,同时作为挂钩机制遗漏内容的安全网。该阶段在模型加载完成后才会触发,因此无法避免初始的加载开销,但能保证后续游戏状态的正确性。
这种设计既保证了修正的自动化,又避免了大范围的盲目修改。本插件是完全无脚本的轻量级SKSE插件:不含任何脚本、无MOD配置菜单(MCM)、无额外UI组件(无需SKSE Framework、Prisma UI等)、不新增任何游戏玩法系统,采用事件驱动机制而非持续轮询,仅在处理场景时才会运行。
---
配置说明
所有配置均可在DisabledReferenceIntegrityFix.ini文件中修改。
基础配置项:
enable_logging = true ; 启用日志功能
verbose_logging = false ; 启用详细日志
log_level = 3 ; 日志等级
fix_references = true ; 启用引用修正逻辑
fix_navmeshes = true ; 启用地面以下导航网格顶点修正(实验性功能)
auto_fix_on_cell_load = true ; 探索世界的过程中持续保持防护生效
patch_interior = true ; 扫描并修复室内场景
patch_exterior = true ; 扫描并修复室外场景
include_deleted_refs = false ; 默认关闭。已删除记录的恢复属于高级功能,仅了解其利弊后再启用
fix_all_init_disabled = false ; 对初始禁用引用采用更激进的处理方式,非特殊需求请保持关闭
max_refs_per_batch = 0 ; 若使用超大型MOD组合,想要更平缓的增量清理,可通过该参数限制单场景的单批次最大处理引用数
---
排除规则与控制
默认情况下,仅标记类引用会被排除在修正范围外,其他任何位于Z轴-30000、但未带「初始禁用」标记的表单类型,都会被处理。
你可以通过INI文件排除已知的敏感内容:
- 按插件名称排除
- 按FormID排除
这让你可以保留已知特殊场景的内容不被修改,同时享受其他内容的自动清理。DynDOLOD.esp已被默认设为忽略,因为目前暂不确定它修改的初始禁用记录是否允许改动坐标。
---
日志与诊断功能
插件内置了可配置的日志系统:
- 标准模式:提供简洁实用的运行摘要
- 详细模式:用于深度故障排查
- 日志等级:可自定义输出内容,从仅报错到全追踪细节。1=错误,2=警告,3=信息,4=调试,5=追踪
如果你在测试卡顿改善效果,日志可以帮你确认扫描与修复的内容。日志会记录记录类型与FormID,让你可以自行查看哪些内容存在问题。
如果你想在游戏内验证MOD是否生效,可以使用控制台指令Prid。该指令可以在控制台中选中对应引用,无论它处于启用/禁用状态。之后配合《更详细信息控制台(More Informative Console)》MOD,即可实时查看引用的状态与Z轴坐标。
使用示例:
Prid 0xFECF0871
调试用的日志示例可查看:
[18:08:58.740] [33016] [I] DisabledReferenceIntegrityFix v1-1-0-0
[18:08:58.740] [33016] [I] [Disabled Reference Integrity Fix] Early reference hooks installed (InitItemImpl + Load3D)
[18:08:58.740] [33016] [I] Plugin: Z-Floor Patcher v1.0.0
[18:08:58.740] [33016] [I] Author: Alaxouche
[18:08:58.740] [33016] [I] Description: SKSE plugin to fix incorrectly disabled records
[18:08:58.740] [33016] [I]
[18:08:58.740] [33016] [I] Attempting to register messaging interface...
[18:08:58.740] [33016] [I] OK - Messaging interface obtained
[18:08:58.740] [33016] [I] OK - Message handler registered successfully
[18:08:58.740] [33016] [I] [Disabled Reference Integrity Fix] Loaded
[18:10:36.302] [19676] [I] [hooks:live] initSeen:1 initFixedPreLive:0 initSkip(3d:0 attached:0 refsLoaded:0) load3dGated:0 | diag(cairOk:0 belowDis:0 excl:0) | fallbackCells:0 fallbackRefFixes:0 navmeshEventCells:0 navmeshEventVerts:0
[18:10:36.474] [19676] [I] [ref-fix] stage=init reason=below_floor_gate ref=0x01000DBC oldZ=-30000.000 newZ=-30000.000 cell=0x00009659 cellType=ext cellXY=(4, -5) base=0x8500FE2D srcRef=wip Skyrim Regional Forests Framework 1.0.esp srcBase=wip Skyrim Regional Forests Framework 1.0.esp
[18:10:36.917] [19676] [I] [ref-fix] stage=init reason=below_floor_gate ref=0xFE41D4E1 oldZ=-30000.000 newZ=-30000.000 cell=0x000099C4 cellType=ext cellXY=(-1, -1) base=0x04039F87 srcRef=Serpents_Covenant_Merged.esp srcBase=Dragonborn.esm
[18:10:40.599] [19676] [I] [ref-fix] stage=init reason=below_floor_gate ref=0x000C0627 oldZ=-30000.000 newZ=-30000.000 cell=0x00009712 cellType=ext cellXY=(5, -11) base=0x0001819B srcRef=Ivy - Riverwood Windmill Garden.esp srcBase=Skyrim.esm
[18:10:40.648] [19676] [I] [ref-fix] stage=init reason=below_floor_gate ref=0x000C0628 oldZ=-30000.000 newZ=-30000.000 cell=0x00009712 cellType=ext cellXY=(5, -11) base=0x0001B0A9 srcRef=Ivy - Riverwood Windmill Garden.esp srcBase=Skyrim.esm
[18:10:40.649] [19676] [I] [ref-fix] stage=init reason=below_floor_gate ref=0x000C053C oldZ=-30000.000 newZ=-30000.000 cell=0x00009712 cellType=ext cellXY=(5, -11) base=0x0001B0A9 srcRef=Ivy - Riverwood Windmill Garden.esp srcBase=Skyrim.esm
[18:10:41.287] [19676] [I] [hooks:live] initSeen:19580 initFixedPreLive:5 initSkip(3d:0 attached:0 refsLoaded:0) load3dGated:0 | diag(cairOk:0 belowDis:0 excl:0) | fallbackCells:0 fallbackRefFixes:0 navmeshEventCells:0 navmeshEventVerts:0
[18:10:46.287] [19676] [I] [hooks:live] initSeen:38398 initFixedPreLive:5 initSkip(3d:0 attached:0 refsLoaded:0) load3dGated:0 | diag(cairOk:0 belowDis:0 excl:0) | fallbackCells:0 fallbackRefFixes:0 navmeshEventCells:0 navmeshEventVerts:0
[18:10:48.038] [19676] [I] [ref-fix] stage=init reason=below_floor_gate ref=0x00077E93 oldZ=-30000.000 newZ=-30000.000 cell=0x000093BF cellType=ext cellXY=(-11, 15) base=0x000C5860 srcRef=Environs - Hroggars House.esp srcBase=Skyrim.esm
[18:10:48.038] [19676] [I] [ref-fix] stage=init reason=below_floor_gate ref=0x01001709 oldZ=-30000.000 newZ=-30000.000 cell=0x000093BF cellType=ext cellXY=(-11, 15) base=0x8500AA2E srcRef=Environs - Hroggars House.esp srcBase=wip Skyrim Regional Forests Framework 1.0.esp
[18:10:49.461] [19676] [I] [ref-fix] stage=init reason=below_floor_gate ref=0xFECF0818 oldZ=-30000.000 newZ=-30000.000 cell=0x000096F3 cellType=ext cellXY=(5, -10) base=0x1F10E2E6 srcRef=Northern Roads - Lux Via - Riverwood Wooden Bridge - Covered Bridge patch.esp srcBase=Lux Via.esp
[18:10:51.287] [19676] [I] [hooks:live] initSeen:56343 initFixedPreLive:8 initSkip(3d:0 attached:0 refsLoaded:0) load3dGated:0 | diag(cairOk:0 belowDis:0 excl:0) | fallbackCells:0 fallbackRefFixes:0 navmeshEventCells:0 navmeshEventVerts:0
[18:10:52.742] [19676] [I] [ref-fix] stage=init reason=below_floor_gate ref=0x000C3C6E oldZ=-30000.000 newZ=-30000.000 cell=0x00009883 cellType=ext cellXY=(8, -23) base=0x00050D03 srcRef=MoveableChain.esp srcBase=Skyrim.esm
[18:10:52.743] [19676] [I] [ref-fix] stage=init reason=below_floor_gate ref=0x000C3C69 oldZ=-30000.000 newZ=-30000.000 cell=0x00009883 cellType=ext cellXY=(8, -23) base=0x00050D03 srcRef=MoveableChain.esp srcBase=Skyrim.esm
[18:10:52.746] [19676] [I] [ref-fix] stage=init reason=below_floor_gate ref=0x000C3C65 oldZ=-30000.000 newZ=-30000.000 cell=0x00009883 cellType=ext cellXY=(8, -23) base=0x00050D03 srcRef=MoveableChain.esp srcBase=Skyrim.esm
[18:10:55.230] [19676] [I] [ref-fix] stage=init reason=below_floor_gate ref=0x0001D70A oldZ=-30000.000 newZ=-30000.000 cell=0x00009440 cellType=ext cellXY=(-8, 11) base=0x00026FDD srcRef=MoveableChain.esp srcBase=Skyrim.esm
[18:10:55.250] [19676] [I] [ref-fix] stage=init reason=below_floor_gate ref=0x00061415 oldZ=-30000.000 newZ=-30000.000 cell=0x0000943E cellType=ext cellXY=(-6, 11) base=0x00050D03 srcRef=MoveableChain.esp srcBase=Skyrim.esm
[18:10:55.251] [19676] [I] [ref-fix] stage=init reason=below_floor_gate ref=0x00061417 oldZ=-30000.000 newZ=-30000.000 cell=0x0000943E cellType=ext cellXY=(-6, 11) base=0x00050D03 srcRef=MoveableChain.esp srcBase=Skyrim.esm
[18:10:55.252] [19676] [I] [ref-fix] stage=init reason=below_floor_gate ref=0x00061413 oldZ=-30000.000 newZ=-30000.000 cell=0x0000943E cellType=ext cellXY=(-6, 11) base=0x00050D03 srcRef=MoveableChain.esp srcBase=Skyrim.esm
[18:10:55.253] [19676] [I] [ref-fix] stage=init reason=below_floor_gate ref=0x00061419 oldZ=-30000.000 newZ=-30000.000 cell=0x0000943E cellType=ext cellXY=(-6, 11) base=0x00050D03 srcRef=MoveableChain.esp srcBase=Skyrim.esm
[18:10:55.253] [19676] [I] [ref-fix] stage=init reason=below_floor_gate ref=0x00061410 oldZ=-30000.000 newZ=-30000.000 cell=0x0000943E cellType=ext cellXY=(-6, 11) base=0x00050D03 srcRef=MoveableChain.esp srcBase=Skyrim.esm
[18:10:55.256] [19676] [I] [ref-fix] stage=init reason=below_floor_gate ref=0x00061418 oldZ=-30000.000 newZ=-30000.000 cell=0x0000943E cellType=ext cellXY=(-6, 11) base=0x00050D03 srcRef=MoveableChain.esp srcBase=Skyrim.esm
[18:10:56.287] [19676] [I] [hooks:live] initSeen:73430 initFixedPreLive:18 initSkip(3d:0 attached:0 refsLoaded:0) load3dGated:0 | diag(cairOk:0 belowDis:0 excl:0) | fallbackCells:0 fallbackRefFixes:0 navmeshEventCells:0 navmeshEventVerts:0
[18:11:01.287] [19676] [I] [hooks:live] initSeen:89584 initFixedPreLive:18 initSkip(3d:0 attached:0 refsLoaded:0) load3dGated:0 | diag(cairOk:0 belowDis:0 excl:0) | fallbackCells:0 fallbackRefFixes:0 navmeshEventCells:0 navmeshEventVerts:0
[18:11:06.287] [19676] [I] [hooks:live] initSeen:105715 initFixedPreLive:18 initSkip(3d:0 attached:0 refsLoaded:0) load3dGated:0 | diag(cairOk:0 belowDis:0 excl:0) | fallbackCells:0 fallbackRefFixes:0 navmeshEventCells:0 navmeshEventVerts:0
[18:11:11.287] [19676] [I] [hooks:live] initSeen:121226 initFixedPreLive:18 initSkip(3d:0 attached:0 refsLoaded:0) load3dGated:0 | diag(cairOk:0 belowDis:0 excl:0) | fallbackCells:0 fallbackRefFixes:0 navmeshEventCells:0 navmeshEventVerts:0
[18:11:16.287] [19676] [I] [hooks:live] initSeen:136622 initFixedPreLive:18 initSkip(3d:0 attached:0 refsLoaded:0) load3dGated:0 | diag(cairOk:0 belowDis:0 excl:0) | fallbackCells:0 fallbackRefFixes:0 navmeshEventCells:0 navmeshEventVerts:0
[18:11:17.896] [19676] [I] [ref-fix] stage=init reason=below_floor_gate ref=0x5A000808 oldZ=-30000.000 newZ=-30000.000 cell=0x0000BCB0 cellType=ext cellXY=(41, -23) base=0x00049441 srcRef=Riften Docks Overhaul.esp srcBase=Skyrim.esm
[18:11:17.914] [19676] [I] [ref-fix] stage=init reason=below_floor_gate ref=0x5A000881 oldZ=-30000.000 newZ=-30000.000 cell=0x0000BCB0 cellType=ext cellXY=(41, -23) base=0x00097F68 srcRef=Riften Docks Overhaul.esp srcBase=Skyrim.esm
[18:11:17.946] [19676] [I] [ref-fix] stage=init reason=below_floor_gate ref=0x5A000884 oldZ=-30000.000 newZ=-30000.000 cell=0x0000BCB0 cellType=ext cellXY=(41, -23) base=0x00093D2C srcRef=Riften Docks Overhaul.esp srcBase=Skyrim.esm
[18:11:21.287] [19676] [I] [hooks:live] initSeen:152350 initFixedPreLive:21 initSkip(3d:0 attached:0 refsLoaded:0) load3dGated:0 | diag(cairOk:0 belowDis:0 excl:0) | fallbackCells:0 fallbackRefFixes:0 navmeshEventCells:0 navmeshEventVerts:0
[18:11:26.287] [19676] [I] [hooks:live] initSeen:166821 initFixedPreLive:21 initSkip(3d:0 attached:0 refsLoaded:0) load3dGated:0 | diag(cairOk:0 belowDis:0 excl:0) | fallbackCells:0 fallbackRefFixes:0 navmeshEventCells:0 navmeshEventVerts:0
[18:11:31.287] [19676] [I] [hooks:live] initSeen:180878 initFixedPreLive:21 initSkip(3d:0 attached:0 refsLoaded:0) load3dGated:0 | diag(cairOk:0 belowDis:0 excl:0) | fallbackCells:0 fallbackRefFixes:0 navmeshEventCells:0 navmeshEventVerts:0
[18:11:36.287] [19676] [I] [hooks:live] initSeen:194101 initFixedPreLive:21 initSkip(3d:0 attached:0 refsLoaded:0) load3dGated:0 | diag(cairOk:0 belowDis:0 excl:0) | fallbackCells:0 fallbackRefFixes:0 navmeshEventCells:0 navmeshEventVerts:0
[18:11:36.452] [19676] [I] [ref-fix] stage=init reason=below_floor_gate ref=0x00015B2A oldZ=-30000.000 newZ=-30000.000 cell=0x00009292 cellType=ext cellXY=(-7, 24) base=0x8500592E srcRef=wip Skyrim Regional Forests Framework 1.0.esp srcBase=wip Skyrim Regional Forests Framework 1.0.esp
[18:11:37.644] [19676] [I] [ref-fix] stage=init reason=below_floor_gate ref=0xFE18D999 oldZ=-30000.000 newZ=-30000.000 cell=0x00009A07 cellType=ext cellXY=(-2, -3) base=0xFE382824 srcRef=Environs - Tundra Farmhouse.esp srcBase=Dynamic Things Alternative.esp
---
兼容性
本插件为《上古卷轴5 特别版/周年版/VR版》制作,兼容1.5.97与1.6.1170版本,其他版本未经测试。
通用兼容性说明:
- 兼容所有创建、修改记录的MOD
- 可作为加载顺序清理与冲突解决的补充,但无法替代它们
- 与其他SKSE插件暂无已知冲突
若你启用了实验性设置,请先在自己的游戏环境中测试。
---
性能预期与局限性
本MOD可以正确禁用无用的记录,让它们不再被渲染——这些问题大多由其他MOD引发。
预期效果
- 减少微卡顿
- 降低由已删除记录引发的崩溃与BUG概率
- 效果随安装的MOD数量递增,本MOD仅修复非原版游戏的内容。除非使用的MOD存在严重的数据损坏,否则大概率不会感受到极其明显的性能与稳定性提升。
非预期效果
- 无法修复无关的性能瓶颈(脚本、绘制调用、贴图、CPU上限等)
- 它不是通用的帧率提升工具,只是一款记录修复工具
尽管有极其严格的规则体系,本插件仍有可能误触不该修改的记录。部分记录虽被禁用,但未被移至Z轴-30000,是因为它们被任务使用、有关联父对象、属于持久化内容等。部分记录类型(如标记类)绝对不应被修改。如果你发现任何问题,请反馈给作者,作者会深入排查并将这些引用加入插件的排除列表,你也可以自行将特定记录或插件加入黑名单。
> 请注意:如果你有足够的修改经验,始终建议在XEdit中手动修复这些问题,而非完全依赖本工具。本工具仅作为针对特定记录引发问题的额外防护手段。
---
常见问题FAQ
Q:可以在存档中途安装吗?
A:可以。
Q:我应该立刻启用所有选项吗?
A:请从默认设置开始,先测试游玩,仅当你有明确需求时,再启用实验性选项。
Q:我需要一直开着详细日志吗?
A:不需要。正常游玩时请关闭详细日志,仅在调试时临时启用。
---
下载地址:
|
评分
-
1
查看全部评分
-
|