
实际内存碎片修复
修复游戏内存碎片化/内存泄漏问题的实际补丁。直接替换bin_ship文件夹中的dinput8.dll即可开箱即用,无需LAA。无需解密.exe。防止由此引起的纹理闪烁和崩溃。
查看大图描述
针对《龙腾世纪:起源》内存碎片化的实际修复方案。
由于 DAO 是一款 32 位游戏,其可用地址空间上限为 2GB。游戏运行时间越长,该空间碎片化就越严重。每个纹理都需要一个连续的内存块,当没有可用的连续内存块时,DirectX 将抛出内存不足错误,这会导致纹理闪烁,进而引发游戏崩溃。问题在于,当时有 20MB 的可用内存,却分散在大约 430 个不同的间隙中。内存是可用的,只是不是连续的。
我发现,在游戏启动时,引擎会为其自身的内存池保留 795MB 内存,为模块镜像(包括 DLL、CUDA、PhysX 等)保留约 286MB 内存,留下约 229MB 供托管纹理副本使用。
由于这个问题在主机平台上不会发生,很可能是由于 PC 上使用的更高分辨率纹理所致。
每个纹理都使用 D3DPOOL_MANAGED 创建,这会在纹理的整个生命周期内在内存中保留一份完整副本,外加发送到 GPU 的副本。由于游戏会不断地将纹理加载进出,每个游戏会话中约有 150MB 的此类副本会被分配和释放;这正是导致地址空间碎片化的原因。
解决方案很简单:使用 D3DPOOL_DEFAULT 创建纹理,这样就不会有重复副本了!
唯一的问题是,引擎通过锁定该副本(即D3DPOOL_MANAGED 的内存副本)来写入纹理,而 DEFAULT 纹理无法被锁定。因此,当游戏锁定一个纹理时,它会收到一个临时缓冲区。引擎用相关像素数据填充该缓冲区,将其复制到显卡,然后立即丢弃该缓冲区。引擎无法察觉其中差异。
如果仍然没有足够的内存可用,它可以慢慢动用保留内存,这在测试中显著提高了性能和稳定性。
已测试约 30 分钟,未在此期间发现崩溃或性能下降。
安装说明
备份你现有的 dinput8.dll,然后将此文件拖放到 bin_ship 文件夹中。
鸣谢
Nathan Baggs 的 YouTube 频道
Afre、D00t,以及所有参与测试并提出建议的人。
还没有人评论,去客户端里说两句吧。
评论在新手盒子客户端中发表,这里同步展示。