0 of 0

File information

Last updated

Original upload

Created by

ComplexRobot

Uploaded by

ComplexRobot

Virus scan

Safe to use

About this mod

Correct algorithm settings to truly eliminate stuttering for a seamless gameplay experience.

Requirements
Permissions and credits
Changelogs
This does not work through the use of graphical performance tweaks. Instead, this optimizes the way textures and game levels are loaded. As a result, it will stream all data gradually over multiple frames which should alleviate or eliminate stuttering altogether.


Installation

STEP 1:
This mod uses FFVIIHook and Stuttering fix - DXVK method. If you already have both installed, skip this step.
For easy access, click here to download the required files in an easy-to-use-zip.
Then, extract the zip file into: FFVIIRemakeIntergrade\End\Binaries\Win64
Where FFVIIRemakeIntergrade is the game install folder.


STEP 2:
If you already have Engine.ini installed, skip this step.
If you have 8GB or less of GPU VRAM download Engine.ini-Low-Settings, for 10GB or more VRAM download Engine.ini-High-Settings. (The only difference is r.Streaming.PoolSize value.)
Then, extract the file into: Documents\My Games\FINAL FANTASY VII REMAKE\Saved\Config\WindowsNoEditor\
Create the WindowsNoEditor folder if it doesn't exist.


STEP 3:
If you downloaded Engine.ini from this mod's download page, skip this step.
Copy the following into Engine.ini under [SystemSettings]:

r.DynamicRes.OperationMode=0
t.MaxFPS=0
r.Streaming.PoolSize=2850 ; 5700 for High settings, 2850 for Low settings, 0 for unlimited
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

Adjust r.Streaming.PoolSize depending on your GPU's VRAM. r.Streaming.PoolSize=2850 if you have 8GB or less VRAM, r.Streaming.PoolSize=5700 if you have 10GB or more VRAM.


STEP 4:
Enable VSync for FFVII Remake. I accomplished this through NVIDIA Control Panel under Manage 3D Settings.
Doing this is a necessary step for stability with the streaming of level data. It works well with t.MaxFPS=0, which disables the game's built-in framerate limiter.


STEP 5:
DirectX 11 is required for DXVK to work. The game will crash on load if you do not enable DirectX 11.
The mod is still functional and reduces stutter without DXVK, but DXVK should reduce stutter more.
If you do not wish to use DXVK or DirectX 11, make sure to remove dxgi.dll and d3d11.dll from the End\Binaries\Win64 folder and you can safely skip this step.

Enable DirectX 11 by adding -dx11 to the command line:
1. Open Epic Games Launcher and sign in if you are not already.
2. On the top-right click your profile image circle (may just be a first letter) and click Settings.
3. Scroll all the way to the bottom of the page to find your individual game settings.
4. Click FINAL FANTASY VII REMAKE INTERGRADE to expand the settings for the game.
5. Enable the checkbox for Additional Command Line Arguments.
6. In the box, enter -dx11.
7. DirectX 11 is enabled, you may back out of settings.

Check here for an alternate method to enable DirectX 11.


STEP 6:
Open FFVII Remake, and set the graphics settings based on your VRAM. If you have 8GB or less VRAM, change Shadow/Texture resolution settings to Low, if you have 10GB or more, change Shadow/Texture resolution to High.
Choose resolution based on your VRAM.
Low settings: Recommended 8GB VRAM for 4k, 7GB for 1440p/1080p
High settings: Recommended 12GB VRAM for 4K, 11GB for 1440p/1080p
All of the above settings are recommended based upon my tests with the operating system and running applications taking 1GB VRAM on my system. You may succeed with lower VRAM, some have played with 4GB VRAM and didn't have problems.
Set the framerate as close as possible to your monitor's refresh rate (VSync rate) for better frame stability.
After changing texture or resolution settings, restart the game to ensure memory is cleared.




Information

See the stickied post for more information!

r.Streaming.PoolSize may need to be reduced depending on your VRAM budget, the game lags if a memory allocation fails, and you need ~1GB free at all times, maybe less, for dynamic loading of special effects. r.Streaming.PoolSize is in MB, and is in addition to the base VRAM the game needs to run (depends on graphical settings, roughly 3-5GB). Monitoring your VRAM usage on the title screen will show you how much memory remains for the pool size and extra special effects. Note: If you lower the pool size, it may delay the loading of textures significantly.

The settings r.Streaming.MaxNumTexturesToStreamPerFrame and r.Streaming.NumStaticComponentsProcessedPerFrame are adjusted for 60FPS, so you may need to increase or decrease them for optimal performance if you play at a framerate other than 60. For example, if you are playing at 120FPS, you can halve those values (round up to be safe), divide by 1.5 for 90FPS, etc.

Most stutter in the game is caused by texture loading lag, and you can control it with r.Streaming.MaxNumTexturesToStreamPerFrame. Unfortunately, the game doesn't seek ahead of time and preload textures dynamically, instead loading them as they are needed, with no regards to texture size or frame time. Controlling the number of textures per frame is an imperfect solution: Sometimes loading a set number of textures at once will be fast, and other times it will be slow, because textures vary in size.

Through trial and error, I came to those number settings as the optimal performance at 60FPS while eliminating stutter and remaining seamless, so it should work for most systems, but you may need to tweak settings depending on your system.

If you copy-pasted the text into your existing Engine.ini, remember to delete any duplicate entries to be sure the settings are correct. You may want to delete all r.Streaming.* settings not from this mod to be safe.




Explanation (for the curious)

r.DynamicRes.OperationMode=0

This eliminates the dynamic sub-resolution performance enhancer that this game implements by default, resulting in a consistent resolution. This setting is optional and included for convenience. The consistent resolution also greatly improves frame stability.



t.MaxFPS=0

This disables the highly unstable framerate limiter implemented by the game. Instead, we enable VSync to stabilize the framerate.



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

r.Streaming.PoolSize
is the additional MB allocated in VRAM to store streamed textures. I'm not sure the exact amount necessary (somewhere above 5000 and below 6000), but 5120 ensured a seamless gameplay experience in my testing. r.Streaming.MaxTempMemoryAllowed determines the maximum amount of data allowed to be written/overwritten in the memory pool per operation, and needs to be sufficiently high to avoid a bottleneck. It's simply set to an arbitrarily high number. If no textures are loading in the game, this number may need to be adjusted so that the game engine accepts it as valid.



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

r.Streaming.MaxNumTexturesToStreamPerFrame
limits how many textures can be loaded per frame which eliminates a GPU performance hit and a direct source of stutter while allowing optimal performance adjustment. r.Streaming.NumStaticComponentsProcessedPerFrame works similarly, but instead limits how many static objects in the level are processed by the game per frame. r.Streaming.AmortizeCPUToGPUCopy simply enables r.Streaming.MaxNumTexturesToStreamPerFrame, which is ignored otherwise. r.Streaming.FramesForFullUpdate is used to calculate how much data to process per frame by spreading operations across a set number of frames. It's the default method used by the game to reduce stutter, but it is inconsistent and imprecise compared to directly setting the exact amount of textures loaded and objects processed per frame.



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

s.AsyncLoadingThreadEnabled
enables asynchronous streaming of level data over multiple frames. s.AsyncLoadingTimeLimits.LevelStreamingActorsUpdateTimeLimit, and s.UnregisterComponentsTimeLimit set a timeout in ms that prevents the streaming of data from taking up too much time of any individual frame. As you can see, I set them to absurdly low times 0.1 ms, because this makes the impact on performance negligible. Unfortunately, at the time of writing, the game engine overwrites the number I set for s.LevelStreamingActorsUpdateTimeLimit to 2.5 ms always, but it's still a fairly negligible impact on performance. s.AsyncLoadingUseFullTimeLimit forces the level loading to always take up its maximum amount of time, which essentially just bogs down the engine, so it's disabled here. s.LevelStreamingActorsUpdateTimeLimit has the largest impact on performance due to the populated town areas continuously loading and unloading actors as you travel through them.



s.IoDispatcherCacheSizeMB=256

This is the size of the cache used for partially downloaded level assets as they are downloaded over multiple frames. By default, this is 0, which prevents asynchronous loading, the point of this mod. 256 MB seems sufficient for any possible asset that may be loaded in. It must be large enough to hold each individual asset. 256 MB may be ten times larger than it needs to be, but I'm assuming any system easily has 256 MB of RAM to spare.



s.LevelStreamingComponentsRegistrationGranularity=1
s.LevelStreamingComponentsUnregistrationGranularity=1

These are undocumented variables by UE4, but they appear to force multiple assets to be deferred and loaded at once when set to values above 1. Setting them to 1 here allows individual assets to be loaded one at a time, the desired behavior.



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

s.MaxIncomingRequestsToStall
and s.MaxReadyRequestsToStallMB cause the CPU time to be checked frequently when set to such low values, preventing the operations from exceeding their time limits. s.MinBulkDataSizeForAsyncLoading would prevent level data from being loaded in until a certain threshold of data needs to be loaded, causing several assets to be loaded at once. It's set to 0 to allow assets to be loaded in one at a time regardless of size.



s.PriorityAsyncLoadingExtraTime=0

This adds additional time to the time limit in certain high-priority load situations, and is disabled here to prevent possible stutter.



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

Setting the LOD bias values to -15 guarantees that when a texture/mesh/etc. is loaded, it is always at its highest level of detail possible. This has the dual benefit of better visuals as well as reducing the amount of data that needs to be loaded into memory by restricting all objects to only their lowest and highest
detail levels. It is possible to set the biases to positive values, thereby reducing the level of detail and data cost altogether. r.MipMapLODBias=0 is the default value and included for clarity. Negative values of r.MipMapLODBias cause graphical artifacts on the main characters.



r.Streaming.MinMipForSplitRequest=0

r.Streaming.MinMipForSplitRequest=0 makes sure all textures are processed with the default behavior for choosing what texture resolution to stream.



r.Streaming.HiddenPrimitiveScale=1

This disables an optimization which would lower the resolution of textures not visible on screen. This is disabled to restore the default behavior, as that results in less texture pop.