Desktop:
Automatic GPU OC via MSI Afterburner
View attachment 154495
Oculus 2 via AirLink
Preparations:
I manually set headset refresh rate to 120 HZ (to avoid VSync problem MacGruber mentioned).
I also manually set render resolution to be fixed, It would change in between benchmarks and
would cause problems in modded rendering API (see Using OpenXR + vrperfkit below).
View attachment 154483
Baseline:
It looks like GPU bottleneck for me.
View attachment 154482
I tried automatic GPU and CPU OC with MSI afterburner and AMD Ryzen Master.
GPU overclock was helpful but not enough to justify another benchmark.
CPU overclock actually gave me worse result. I thin it it because it set higher than default but constant clock on all cores, while (as I understand) VaM is more single threaded and automatic turbo boost manages better clocks on various threads - much more clock bump for cores used by VaM.
To further optimize my game performance I followed this video:
I had some problems with vrperfkit, more about that below.
Using OpenXR adapter with Per-game installation option:
This adapter bypass OpenVr API, so games can run without Steam VR, which gives substantial performance boost in most games that use Oculus runtime.
I had some problems running the game, changing content of
VaM (OpenVR).bat
to
START "VaM" VaM.exe -vrmode OpenXR
seems to fix the problem, but I don't know whether it actually does something or not.
I placed API dll file in
VaM_Data\Plugins
. I recombed keeping the original file as copy.
It gave me additional fps boost:
- about + 15 FPS on average from baseline
- in most scenes it was more like + 35 FPS from baseline
View attachment 154484
Using OpenXR + vrperfkit:
I used FFR (Fixed foveated rendering) and upscaling (in this case FSR).
I found that it is required to set fixed rendering resolution in you headset settings as well as to set proper renderScale in upscaling config. When renderScale was set to wrong fraction I couldn't run the game. The engine was unable to allocate rendering buffer.
I used
Release 3 and unpacked files in the same folder as VaM.exe (should be the same location as VaM_Updater.exe)
It gave me additional fps boost:
- about + 35 FPS on average from baseline
- in most scenes it was more like + 60 FPS from baseline
There is one drawback, with my current upscaling settings most of the text is unreadable. The gameplay is fine though. I'm pretty sure it can be better with proper calibration of renderScale and sharpness.
View attachment 154485
My vrperfkit.yml configuration:
YAML:
# Upscaling: render the game at a lower resolution (thus saving performance),
# then upscale the image to the target resolution to regain some of the lost
# visual fidelity.
upscaling:
# enable (true) or disable (false) upscaling
enabled: true
# method to use for upscaling. Available options (all of them work on all GPUs):
# - fsr (AMD FidelityFX Super Resolution)
# - nis (NVIDIA Image Scaling)
# - cas (AMD FidelityFX Contrast Adaptive Sharpening)
method: fsr
# control how much the render resolution is lowered. The renderScale factor is
# applied to both width and height. So if renderScale is set to 0.5 and you
# have a resolution of 2000x2000 configured in SteamVR, the resulting render
# resolution is 1000x1000.
# NOTE: this is different from how render scale works in SteamVR! A SteamVR
# render scale of 0.5 would be equivalent to renderScale 0.707 in this mod!
renderScale: 0.7
# configure how much the image is sharpened during upscaling.
# This parameter works differently for each of the upscaling methods, so you
# will have to tweak it after you have chosen your preferred upscaling method.
sharpness: 0
# Performance optimization: only apply the (more expensive) upscaling method
# to an inner area of the rendered image and use cheaper bilinear sampling on
# the rest of the image. The radius parameter determines how large the area
# with the more expensive upscaling is. Upscaling happens within a circle
# centered at the projection centre of the eyes. You can use debugMode (below)
# to visualize the size of the circle.
# Note: to disable this optimization entirely, choose an arbitrary high value
# (e.g. 100) for the radius.
radius: 0.75
# when enables, applies a MIP bias to texture sampling in the game. This will
# make the game treat texture lookups as if it were rendering at the higher
# target resolution, which can improve image quality a little bit. However,
# it can also cause render artifacts in rare circumstances. So if you experience
# issues, you may want to turn this off.
applyMipBias: true
# Fixed foveated rendering: continue rendering the center of the image at full
# resolution, but drop the resolution when going to the edges of the image.
# There are four rings whose radii you can configure below. The inner ring/circle
# is the area that's rendered at full resolution and reaches from the center to innerRadius.
# The second ring reaches from innerRadius to midRadius and is rendered at half resolution.
# The third ring reaches from midRadius to outerRadius and is rendered at 1/4th resolution.
# The final fourth ring reaches from outerRadius to the edges of the image and is rendered
# at 1/16th resolution.
# Fixed foveated rendering is achieved with Variable Rate Shading. This technique is only
# available on NVIDIA RTX and GTX 16xx cards.
fixedFoveated:
# enable (true) or disable (false) fixed foveated rendering
enabled: true
# configure the end of the inner circle, which is the area that will be rendered at full resolution
innerRadius: 0.4
# configure the end of the second ring, which will be rendered at half resolution
midRadius: 0.55
# configure the end of the third ring, which will be rendered at 1/4th resolution
outerRadius: 1.0
# the remainder of the image will be rendered at 1/16th resolution
# when reducing resolution, prefer to keep horizontal (true) or vertical (false) resolution?
favorHorizontal: true
# when applying fixed foveated rendering, vrperfkit will do its best to guess when the game
# is rendering which eye to apply a proper foveation mask.
# However, for some games the default guess may be wrong. In such instances, you can uncomment
# and use the following option to change the order of rendering.
# Use letters L (left), R (right) or S (skip) to mark the order in which the game renders to the
# left or right eye, or skip a render target entirely.
#overrideSingleEyeOrder: LRLRLR
# Enabling debugMode will visualize the radius to which upscaling is applied (see above).
# It will also output additional log messages and regularly report how much GPU frame time
# the post-processing costs.
debugMode: true
# Hotkeys allow you to modify certain settings of the mod on the fly, which is useful
# for direct comparsions inside the headset. Note that any changes you make via hotkeys
# are not currently persisted in the config file and will reset to the values in the
# config file when you next launch the game.
hotkeys:
# enable or disable hotkeys; if they cause conflicts with ingame hotkeys, you can either
# configure them to different keys or just turn them off
enabled: true
# toggles debugMode
toggleDebugMode: ["ctrl", "f1"]
# cycle through the available upscaling methods
cycleUpscalingMethod: ["ctrl", "f2"]
# increase the upscaling circle's radius (see above) by 0.05
increaseUpscalingRadius: ["ctrl", "f3"]
# decrease the upscaling circle's radius (see above) by 0.05
decreaseUpscalingRadius: ["ctrl", "f4"]
# increase the upscaling sharpness (see above) by 0.05
increaseUpscalingSharpness: ["ctrl", "f5"]
# decrease the upscaling sharpness (see above) by 0.05
decreaseUpscalingSharpness: ["ctrl", "f6"]
# toggle the application of MIP bias (see above)
toggleUpscalingApplyMipBias: ["ctrl", "f7"]
# take a screen grab of the final (post-processed, upscaled) image.
# The screen grab is stored as a dds file next to the DLL.
captureOutput: ["ctrl", "f8"]
# toggle fixed foveated rendering
toggleFixedFoveated: ["alt", "f1"]
# toggle if you want to prefer horizontal or vertical resolution
toggleFFRFavorHorizontal: ["alt", "f2"]