无卡顿无缝游戏体验

无卡顿无缝游戏体验

调整算法设置以真正消除卡顿,获得流畅的游戏体验。

视觉效果

此优化并非通过图形性能调整来实现,而是优化了纹理和游戏关卡加载方式。因此,它会将全部数据在多个帧中逐步流式加载,从而减轻或完全消除卡顿现象。

[color=#3d85c6][size=5]安装方法[/size][/color]

[color=#e69138][size=3]第一步[/size][/color]: 此模组需要 FFVIIHook卡顿修复 - DXVK 方法。如果你已安装两者,可跳过此步。 点击此处下载所需文件(已打包为便捷zip) 然后,将 zip 文件解压到:FFVIIRemakeIntergrade\End\Binaries\Win64 其中 FFVIIRemakeIntergrade 是游戏安装目录。

[color=#e69138][size=3]第二步[/size][/color]: 如果你已安装 Engine.ini,可跳过此步。 若显存为 8GB 或更少,下载 Engine.ini-低配设置;若显存为 10GB 或更多,下载 Engine.ini-高配设置。(唯一区别是 r.Streaming.PoolSize 的值。) 然后,将文件解压到:Documents\My Games\FINAL FANTASY VII REMAKE\Saved\Config\WindowsNoEditor 如果 WindowsNoEditor 文件夹不存在,请手动创建。

[color=#e69138][size=3]第三步[/size][/color]: 如果你从此模组的下载页面下载了 Engine.ini,可跳过此步。 将以下内容复制到 Engine.ini 中的 [SystemSettings] 下方:

r.DynamicRes.OperationMode=0
t.MaxFPS=0
r.Streaming.PoolSize=2850 ; 高设置为5700,低设置为2850,0为无限制
r.Streaming.MaxTempMemoryAllowed=100000
r.Streaming.AmortizeCPUToGPUCopy=1
r.Streaming.MaxNumTexturesToStreamPerFrame=3
r.Streaming.NumStaticComponentsProcessedPerFrame=3
r.Streaming.FramesForFullUpdate=1
r.Streaming.MinMipForSplitRequest=0
r.Streaming.HiddenPrimitiveScale=1
s.AsyncLoadingThreadEnabled=1
s.AsyncLoadingTimeLimit=0.1
s.LevelStreamingActorsUpdateTimeLimit=0.1
s.UnregisterComponentsTimeLimit=0.1
s.AsyncLoadingUseFullTimeLimit=0
s.IoDispatcherCacheSizeMB=256
s.LevelStreamingComponentsRegistrationGranularity=1
s.LevelStreamingComponentsUnregistrationGranularity=1
s.MaxIncomingRequestsToStall=1
s.MaxReadyRequestsToStallMB=0
s.MinBulkDataSizeForAsyncLoading=0
s.PriorityAsyncLoadingExtraTime=0
r.MipMapLODBias=0
r.SkeletalMeshLODBias=-15
r.LandscapeLODBias=-15
r.ParticleLODBias=-15

根据显卡显存调整 r.Streaming.PoolSize。若显存为 8GB 或更少,设为 r.Streaming.PoolSize=2850;若显存为 10GB 或更多,设为 r.Streaming.PoolSize=5700

[color=#e69138][size=3]第四步[/size][/color]: 为 FFVII Remake 启用垂直同步(VSync)。我通过 NVIDIA 控制面板中的“管理 3D 设置”实现。 这是确保关卡数据流式加载稳定性的必要步骤。配合 t.MaxFPS=0(禁用游戏内置帧率限制器)效果良好。

[color=#e69138][size=3]第五步[/size][/color]: DXVK 需要 DirectX 11 才能工作。如果你未启用 DirectX 11,游戏将在加载时崩溃。 即使没有 DXVK,此模组仍然有效,可减少卡顿,但 DXVK 应能更有效地减少卡顿。 如果你不想使用 DXVK 或 DirectX 11,请确保从 End\Binaries\Win64 文件夹中移除 dxgi.dlld3d11.dll,即可安全跳过此步。

通过向命令行添加 -dx11 启用 DirectX 11:

  1. 打开 Epic Games Launcher,如未登录请登录。
  2. 在右上角点击你的个人头像圆圈(可能只显示首字母),然后点击 设置
  3. 向下滚动页面至底部,找到你的个人游戏设置。
  4. 点击 FINAL FANTASY VII REMAKE INTERGRADE 展开该游戏设置。
  5. 勾选 附加命令行参数 复选框。
  6. 在框中输入 -dx11
  7. DirectX 11 已启用,你可以退出设置。 设置截图 点击此处查看启用 DirectX 11 的替代方法

[color=#e69138][size=3]第六步[/size][/color]: 打开 FFVII Remake,根据显存设置图形质量。若显存为 8GB 或更少,将阴影/纹理分辨率设为低;若显存为 10GB 或更多,设为高。 根据显存选择分辨率。 低设置:4K 建议 8GB 显存,1440p/1080p 建议 7GB。 高设置:4K 建议 12GB 显存,1440p/1080p 建议 11GB。 以上设置建议基于我的测试,我的系统中操作系统和运行程序占用了 1GB 显存。使用更少显存也可能成功,有些玩家用 4GB 显存未出现问题。 将帧率设置得尽可能接近显示器刷新率(垂直同步率),以获得更好的帧稳定性。 更改纹理或分辨率设置后,请重启游戏以确保内存被清除。

[color=#6aa84f][size=5]信息[/size][/color]

查看置顶帖获取更多信息!

r.Streaming.PoolSize 可能需要根据你的显存预算减少。如果内存分配失败,游戏会出现延迟。你始终需要约 1GB(可能更少)的剩余显存用于特效的动态加载。r.Streaming.PoolSize 以 MB 为单位,是游戏运行所需基础显存(取决于图形设置,约 3-5GB)之外的额外分配。在标题界面监控显存使用情况,可以显示池大小和额外特效剩余的内存。注意:如果降低池大小,纹理加载可能会显著延迟。

设置 r.Streaming.MaxNumTexturesToStreamPerFramer.Streaming.NumStaticComponentsProcessedPerFrame 针对 60FPS 进行了调整。如果你使用非 60 的帧率,可能需要增减这些值以获得最佳性能。例如,如果你以 120FPS 运行,可以将这些值减半(向上取整更安全),90FPS 时除以 1.5,以此类推。

游戏中的大多数卡顿是由纹理加载延迟引起的,你可以通过 r.Streaming.MaxNumTexturesToStreamPerFrame 来控制。不幸的是,游戏不会提前预加载并动态加载纹理,而是在需要时才加载,且不考虑纹理大小或帧时间。控制每帧纹理数量并非完美解决方案:有时加载一组固定数量的纹理很快,有时很慢,因为纹理大小不同。

通过反复试验,我得出这些数值能在 60FPS 下消除卡顿并保持流畅,因此适用于大多数系统,但你可能需要根据自身系统调整设置。

如果你将文本复制粘贴到现有的 Engine.ini 中,请记得删除任何重复条目以确保设置正确。为了安全起见,你可能希望删除所有非此模组提供的 r.Streaming.* 设置。

[color=#cc4125][size=5]解释说明[/size][/color] [size=1](供好奇者参考)[/size]

r.DynamicRes.OperationMode=0

这会禁用游戏默认实现的动态子分辨率性能增强功能,从而获得一致的分辨率。此设置可选,为方便起见包含在内。一致的分辨率也大大提高了帧稳定性。

t.MaxFPS=0

这会禁用游戏实现的高度不稳定的帧率限制器。相反,我们启用垂直同步来稳定帧率。

r.Streaming.PoolSize=5700
r.Streaming.MaxTempMemoryAllowed=100000

r.Streaming.PoolSize 是在显存中额外分配给存储流式纹理的 MB 数。我不确定确切所需量(大约在 5000 到 6000 之间),但根据我的测试,5120 确保了流畅的游戏体验。r.Streaming.MaxTempMemoryAllowed 决定每次操作允许写入/覆写内存池的最大数据量,需要足够高以避免成为瓶颈。这里只是设置为一个任意高的数字。如果游戏中未加载纹理,可能需要调整此数字,以便游戏引擎将其视为有效。

r.Streaming.AmortizeCPUToGPUCopy=1
r.Streaming.MaxNumTexturesToStreamPerFrame=3
r.Streaming.NumStaticComponentsProcessedPerFrame=3
r.Streaming.FramesForFullUpdate=1

r.Streaming.MaxNumTexturesToStreamPerFrame 限制每帧可加载的纹理数量,这消除了 GPU 性能影响和卡顿的直接来源,同时允许最佳性能调整。r.Streaming.NumStaticComponentsProcessedPerFrame 类似,但限制每帧游戏中处理的静态对象数量。r.Streaming.AmortizeCPUToGPUCopy 仅启用 r.Streaming.MaxNumTexturesToStreamPerFrame,否则会被忽略。r.Streaming.FramesForFullUpdate 通过将操作分散到设定的帧数中,用于计算每帧处理的数据量。这是游戏默认用于减少卡顿的方法,但与直接设置每帧加载的纹理和处理的对象的精确数量相比,该方法不一致且不精确。

s.AsyncLoadingThreadEnabled=1
s.AsyncLoadingTimeLimit=0.1
s.LevelStreamingActorsUpdateTimeLimit=0.1
s.UnregisterComponentsTimeLimit=0.1
s.AsyncLoadingUseFullTimeLimit=0

s.AsyncLoadingThreadEnabled 启用跨多帧的关卡数据异步流式加载。s.AsyncLoadingTimeLimits.LevelStreamingActorsUpdateTimeLimits.UnregisterComponentsTimeLimit 设置以毫秒为单位的超时时间,防止数据流式加载占用任何单个帧过多时间。如你所见,我将它们设置为荒谬的低值 0.1 毫秒,因为这使得对性能的影响微乎其微。不幸的是,在撰写本文时,游戏引擎始终将我设置的 s.LevelStreamingActorsUpdateTimeLimit 值覆盖为 2.5 毫秒,但这仍然对性能影响不大。s.AsyncLoadingUseFullTimeLimit 强制关卡加载始终占用最大时间,这本质上只会拖慢引擎,因此在此禁用。s.LevelStreamingActorsUpdateTimeLimit 对性能影响最大,因为人口稠密的城镇区域会在你穿过时持续加载和卸载角色。

s.IoDispatcherCacheSizeMB=256

这是用于在多个帧中部分下载关卡资源时使用的缓存大小。默认值为 0,这会阻止异步加载,而异步加载正是此模组的关键。256 MB 似乎足以容纳任何可能加载的资源。它必须足够大以容纳每个单独的资源。256 MB 可能比所需大十倍,但我假设任何系统都容易有 256 MB 的空闲内存。

s.LevelStreamingComponentsRegistrationGranularity=1
s.LevelStreamingComponentsUnregistrationGranularity=1

这些是 UE4 未记录的变量,但当值设置为大于 1 时,它们似乎会强制多个资源被推迟并同时加载。此处设置为 1 允许逐个加载单个资源,这是期望的行为。

s.MaxIncomingRequestsToStall=1
s.MaxReadyRequestsToStallMB=0
s.MinBulkDataSizeForAsyncLoading=0

s.MaxIncomingRequestsToStalls.MaxReadyRequestsToStallMB 在设置为如此低的值时,会导致 CPU 时间被频繁检查,防止操作超过其时间限制。s.MinBulkDataSizeForAsyncLoading 会阻止关卡数据加载,直到需要加载的数据达到一定阈值,这会导致同时加载多个资源。将其设置为 0 允许资源忽略大小逐个加载。

s.PriorityAsyncLoadingExtraTime=0

这在某些高优先级加载情况下会为时间限制增加额外时间,此处禁用以防止可能出现的卡顿。

r.MipMapLODBias=0
r.SkeletalMeshLODBias=-15
r.LandscapeLODBias=-15
r.ParticleLODBias=-15

将 LOD 偏差值设置为 -15 可确保纹理/网格等加载时始终处于可能的最高细节级别。这具有双重好处:更好的视觉效果,以及通过将所有对象限制为仅最低和最高细节级别来减少需要加载到内存中的数据量。也可以将偏差设置为正值,从而降低细节级别和数据成本。r.MipMapLODBias=0 是默认值,为清晰起见包含在内。r.MipMapLODBias 的负值会导致主要角色出现图形伪影。

r.Streaming.MinMipForSplitRequest=0

r.Streaming.MinMipForSplitRequest=0 确保所有纹理都使用默认行为处理以选择流式加载的纹理分辨率。

r.Streaming.HiddenPrimitiveScale=1

这会禁用一种优化,该优化会降低屏幕上不可见纹理的分辨率。此处禁用以恢复默认行为,因为这会减少纹理突然显现的现象。