编号:122 作者:KT
发布于2023-01-28 17:59:54
本文作者Aers(SSE Engine Fixes - 引擎修复作者)
原文链接
-
前言
本文介绍的是老滚引擎中的一个加载特性和限制,我在上一篇mod教程中提到过,这种限制可能导致加载非常非常多插件的游戏变得不稳定。随着存档游玩时间的递增而增加CTD、坏档风险。
文章是四年前发的,但是似乎到今天为止引擎修复也没有拿出绕过该限制的解决方案。因此我猜测本文介绍的规则依然适用。
TLDR - 太长不看版本
- 老滚引擎除了大家熟知的灯光数量、动画数量有上限以外,对于世界空间(室内室外)的修改和编辑数量同样有上限,参照数量上限是1,048,576(2的20次方);
- 由于ESP、ESL、ESPFE这些格式的插件在引擎中的加载方式与ESM有本质的不同,因此安装大量mod(我是说非常非常多的mod),有可能达到这个上限;
- 超过这个上限会出现什么问题?游戏开始变得不稳定:存档时卡死、无法排查的CTD、存档损坏以及其他难以预测的问题;
- 如何确定你是否快要达到上限了:使用这个xEdit脚本(点右上角的Download Zip,放进SSEEdit脚本文件夹)来扫描你的整个加载列表。如果你危险地接近了上限,就把引用数量最多的插件卸载,或者把它们转换成ESM。在实际情况中,你的总参照数量绝对不应该太接近上限,因为你玩的时间越长,你的存档中的保存的参照数量就越多,你就越接近于达到上限(总之就是你的总参照数量越少,你的存档就能走的越久)。
正文
注意:并不是所有人的加载列表都会出现这个问题,但如果你的mod非常非常多,并且有很多对世界空间进行了大量的编辑(全面美化的mod),或者增加了大量非原版的室内外空间(大型地域扩展、任务等),那么你就应该确认是否自己存在这个问题。另外,我很确定它适用于LE以及SE,但我自己并没有去验证LE是否同样符合这个规则。
这个问题之所以引起我的注意,是因为Nukem在CK上的工作,Ralgor在SSE中实际遇到了这个问题,以及我自己的一些无关的研究 🙂
1. 常驻型参照 vs 临时性参照的区别
如果你有过在xEdit中打开插件、制作补丁的经验,那么你肯定知道老滚中存在这么两种参照类型:常驻型参照(Persistent Reference)和临时性参照(Temporary)。Arthmoor(USSEP、不一样的人生等mod主要作者)在这里有一篇关于这个的文章,如果你不想详细了解,只需要知道最关键的区别:
一个参照要么是临时的,这意味着它只有在玩家周围的网格内才会被加载;要么是常驻的,这意味着它在任何时候都会被加载在内存中,并保存到你的存档。

引擎内部处理这个问题的方式非常简单:甚至在你的主菜单还没出来之前,所有的常驻参照都已经被加载到内存中了,而临时性参照则是根据需要从你的文件中加载(例如,玩家去到一个空间,那么它的所有临时性参照都会被加载),而当游戏不再需要这些临时引用时,它们中的大多数将被卸载。
2. 老滚引擎所能处理的参照数量上限
参照的句柄(Reference handles)是引擎查找和加载参照对象的方式(技术细节在这里相当不重要;只要知道每个参照都需要有一个句柄就可以了)。老滚的引擎的参照处理上限是2的20次方(1,048,576)如果你达到或者超过这个上限,游戏就会在加载时卡住,或者直接CTD,或者发生其他不可预测的问题。
3. 你应该关心的问题
2的20次方其实是一个相当高的上限,普通玩家可能永远都达不到这个上限,但是对于那种装mod狂魔来说应该注意:
1. 实际加载的空间单元数量是有限的,而且绝大多数mod中编辑和添加的参照都是临时性参照,而不是常驻型的(原因很显而易见,如果全部做成常驻型参照,他们都要进入你的内存,你插1tb内存条都不够霍霍的)。
2. 临时参照的加载/卸载只适用与ESM,而不是普通插件(ESP、ESL、ESPFE)。这意味着所有来自普通插件的临时参照也和常驻型一样都是在主菜单之前加载到游戏中的。甚至你用普通插件去修改原版的内容,他们也会变成这样。
举个例子让你更好地对这个上限有个清晰的认知:被遗忘的地下城(Forgotten Dungeon SSE)有136,356个临时性参照、警戒者(Vigilant)有110,770个(这些数字现在可能不一样了,而且警戒者已经转ESM所以现在可以无视它)。仅仅是这两个插件就会使你的游戏达到1/4的上限。
为什么老滚引擎对待参照加载会是这样的工作方式?我的猜测是普通插件在B社内部一直都不是一个正式存在的插件类型,他们应该是认为:一切添加了大规模参照的插件都应该转成ESM。
另一件要记住的事情是,在游戏过程中,很多参照都是单独保存到存档里的,所以即你用脚本计算出来的加载列表总参照数量没有达到上限,在长时间游玩后也可能逐渐变多直到存档里的参照数量超过上限。(还是那个道理,你的总数量离上限越远你就越安全)
SSEEdit检测脚本的使用方式
下载这个xEdit脚本(点右上角的Download Zip),放进SSEEdit脚本文件夹(Edit Scripts)
打开SSEEdit,加载你的整个列表
等加载完成之后随便选一个esp右键 - 应用脚本 - 搜索count_loaded_refs_in_load_order
等待脚本跑完,可能需要比较长的时间。它会在最底部计算出你整个加载列表的参照数量
以我为例子:我的mod总数1183个,esm+esp+esl总数1071个,跑完脚本我的参照总数是582481(临时性参照438650,常驻型参照143831)
