莱瑞姆记忆处理器

莱瑞姆记忆处理器

《龙腾世纪:起源》是32位程序,在一次游戏会话中,它会把内存磨碎成小到无法容纳一个纹理的碎片。这就是闪烁和崩溃的原因,并非内存不足。引擎自身保留的内存块也有同样的现象,Lyrium将重复纹理排除在空间外,并为引擎提供第二个内存块,这样大型对象总能找到存放之处。

有一款带 Reshade 的版本和一款不带 Reshade 的版本(Reshade 可选,使用与否均可,两个版本都保留)。

LYRIUM 内存修复

《龙腾世纪:起源》是一款 32 位游戏,因此它只能使用 2 GB 的地址空间,如果你应用了 LAA 补丁,则可以使用 4 GB。游戏运行时间越长,该空间就会变得越碎片化。游戏加载的每个纹理都需要一块连续的内存,而一旦没有足够大的块,游戏就会开始出现纹理闪烁,然后崩溃。

关键在于内存并未真正耗尽。在记录的一次崩溃中,有 20 兆字节的空闲内存,但它分散在大约 430 个不同的碎片中。内存是存在的,只是从未连成一片。

这也不是内存泄漏,尽管人们几乎总是这样称呼它。没有任何东西被占用而不归还。游戏创建纹理、使用它、释放它,内存每次都会回来。没有回来的是空闲空间的形状,因为填补空隙的纹理大小永远不会与留下空隙的纹理大小相同。随着一次游戏会话的进行,空闲空间被磨得越来越碎,直到什么都无法容纳。

这就是为什么增加更多内存无济于事,也为什么 LAA 补丁无法修复它的原因。游戏一开始就没有耗尽内存。LAA 给了一个更大的空间来磨碎,这为你赢得了时间,而这正是通常建议每几个小时保存并重新启动游戏的原因。重新启动游戏会获得一个全新的、未碎片化的内存空间。

第二个问题(此版本新增)

引擎在启动时会为自己保留一个巨大的内存块,并从中自行分配所需的一切。Windows 无法看到它的内部。

该内存块会以完全相同的方式被磨碎,而且情况更糟,因为留下的碎片永远不会移动。在一次会话中,它内部最大的连续空隙只会不断缩小。在一次测试中,它从 508 兆字节开始,下降到 73 兆字节。

引擎进行最大任务时需要一块 71.6 兆字节的连续内存。一旦最大空隙低于此值,引擎不会崩溃,也不会发出警告。它会悄悄放弃正在加载的内容并继续运行。

这就是丹诺林市场空无一人的原因。这是一个从未触发的过场动画、缺失的风景、从未生成的 NPC。这看起来完全像一个损坏的模组或错误的加载顺序,这就是为什么人们多年来一直在寻找原因却找不到。没有报告错误,因为实际上从未尝试过任何操作。

它做了什么

通常,游戏会在那有限的内存空间中保留每个纹理的完整第二份副本。Lyrium 会移动这些纹理,使重复副本不再存储在那里。每当游戏想要写入纹理时,它会被提供一个临时缓冲区,该缓冲区在使用完毕后立即释放。游戏无法察觉区别,每次会话大约有 200 兆字节不再从空间中占用。

对于第二个问题,Lyrium 为引擎提供了第二个内存块,并悄悄将所有大型请求发送到那里。小型内容继续在原始块中进行,并像以前一样继续将其磨碎,但那里的内容不再需要大的连续空隙,因此它就不再重要了。新块只容纳大型内容,而且由于只有几十个,它们在被释放时会重新合并在一起,而不是留下碎片。

在同样降到 73 兆字节的测试中,最大空隙现在稳定在 209 并停止下降。游戏需要 71.6。这就是 1.5 兆字节余量和 200 兆字节余量之间的区别。

还有一个安全网。如果内存真的变得紧张,Lyrium 会以少量受控的方式释放空间,而不是一次性清空整个纹理缓存。这很重要,因为清空整个缓存会强制游戏从磁盘重新加载所有内容,这正是导致过场动画和区域切换时卡顿的原因。在正常游戏中,这永远不会被触发,在正确设置的安装中也不会。

首先应用 4GB 补丁

如果你还没有安装,请先为 DAOrigins.exe 应用 4GB 补丁再安装此模组。任何常规的 4GB 补丁工具都可以完成,只需几秒钟。

Lyrium 无论哪种方式都能工作,并会根据检测到的版本自动调整。但在 2 GB 可执行文件上,它的可用预算要小得多,任何巧妙的内存处理都无法改变一个事实:大量的纹理列表需要某个地方来存放纹理。补丁是唯一能提高这个上限的东西。

如果你打开下面两个设置中的任何一个,Lyrium 可以告诉你你拥有哪个版本。

安装

现在只有一个下载。它会自动适应游戏的任一版本,所以无需选择。

将 d3d9.dll 和 lyrium.ini 复制到你的《龙腾世纪:起源》安装目录下的 bin_ship 文件夹中,与 DAOrigins.exe 放在一起。

请手动安装,而不是通过模组管理器。它必须放在游戏可执行文件旁边,而模组管理器通常不会把文件放在那里。

要卸载,请删除这两个文件。没有修改其他任何内容,你的存档也不会受影响。

以无边框窗口模式运行游戏

从全屏 Alt-Tab 切换出来会使游戏重建其图形设备,并且该代码中有一个长期存在的崩溃问题,与内存无关,也没有任何模组可以修复。无边框窗口永远不会丢失设备,因此该崩溃永远不会有机会发生。这是你能做的关于 Alt-Tab 崩溃最有用的措施。

设置

你应该不需要调整任何这些。附带的 lyrium.ini 是为 4GB 安装设置的,如果你使用的是 2GB 版本,它会自动缩小到适合的数值。它会从游戏可执行文件中读取你的版本,所以不会出错。

文件中的两个数字分别是引擎自身块获得的内存量以及第二个块获得的内存量。除非你有理由,否则请不要改动它们。

设置 overlay=1 会在 Shift 和 F12 上显示一个面板。它有三个条,对应游戏使用的每个内存区域,每个条显示剩余的最大连续空隙对比仍需容纳的最大项目。绿色表示空间充足,橙色表示接近临界,红色表示已经在丢弃内容。最后一种情况正是这个模组存在的意义,也是第一次在发生过程中可见,而不是事后。

设置 logging=1 会在 lyrium_logs 文件夹中写入会话日志。

包含的文件中两者都处于关闭状态。如果你要报告问题,或者只是想观察它的工作方式,请将它们打开。

如果游戏无法启动

直接启动 bin_ship\DAOrigins.exe,而不是使用启动器或桌面快捷方式。

启动器会先运行 DAOriginsConfig.exe,而该程序在许多现代硬件上会自行崩溃。它完全不会加载此模组,所以这不是由 Lyrium 引起的,但它确实阻止了游戏启动。直接启动游戏可执行文件可以完全跳过它。

兼容性

适用于 4GB LAA 补丁,也适用于未打补丁的情况,并自动适应两者。适用于大量模组化的安装。

在更改任何内容之前,Lyrium 会检查你的游戏可执行文件是否与其预期逐字节匹配。如果不匹配,例如在游戏的不同版本上,它会完全不加修改地保留你的游戏,而不是修改错误的内容。它会安全地失败。

关于其作用和不作用,有一点诚实的说明。它不会阻止内存被碎片化。那是引擎自身的行为,除非重写它,否则无法改变。它做的是将需要大块连续空间的内容从会被碎片化的区域中移出,从而使碎片化不再造成损害。内存仍然和以前一样碎片化,只是不再重要了。