github djules75/OFXR-Bridge 0.2.2_beta2
OFXR Bridge v0.2.2_beta2 (V151) — Frame pacing beta

latest releases: 0.2.14.3, 0.2.14.2, 0.2.14.1...
one month ago

An unofficial beta built on
tig3rmast3r's v0.2.1.

Use the NVIDIA backend if you have an NVIDIA card

Recommended: set the backend to NVIDIA in the tray. The shipped default
is still FidelityFX, which works on any card, but almost everything gained in
this release is on the NVIDIA path.

The reason is where the optical flow runs. NVIDIA cards have a dedicated
hardware engine for it - the Optical Flow Accelerator - which is idle while
your game renders, so frame generation costs you almost none of the GPU the
game is using. About 86% of the work goes there. FidelityFX computes the same
flow in ordinary compute shaders, on the very same shader cores the game is
drawing with, so it competes with your frame rate instead of hiding behind it.

That is why the headroom improvement below - needing roughly 48 FPS natively
rather than 57 to hold a steady 90 - is NVIDIA-only. On FidelityFX the work
cannot overlap, so there is nothing to win by moving it.

If you are coming from v0.2.2_beta, the headline is that the layer now
keeps 90 in scenes where it used to give up — and, more importantly, gets back
to 90 on its own once a demanding scene is over. Everything from the first beta
is still here and listed below.

New in beta2

  • It recovers. The most common complaint about beta1 was that a demanding
    scene would knock it down and it would stay down — back in an easy scene, or
    even back at the menu, it would sit at a lower frame rate until you restarted
    the game. The layer paced its own frames against an internal schedule that
    could drift out of step with the headset's refresh and had no way to drift
    back. It now corrects itself against the timing the runtime reports, every
    frame, so a bad patch lasts seconds rather than the rest of the session.
  • More headroom before it gives up. The frame generation work used to be
    queued behind the game's own rendering, so the game had to reach roughly
    57 FPS on its own before the layer could hold 90. On NVIDIA it now runs
    alongside the game's rendering instead, which brings that down to roughly
    48 FPS. If you were just short of a steady 90, this is the change most
    likely to get you there.
  • Fewer frames thrown away. When a frame ran long the layer would often
    skip the next display slot entirely rather than fill it, which reads as a
    hitch. It now only skips when a submission would genuinely land on top of
    the previous one. Measured across a session, frames landing correctly on the
    display's own cadence went from 92% to 98%.
  • Synthetic frames placed where they are actually shown. The generated
    frame was always the exact midpoint between two rendered frames, which is
    only correct when the game runs at exactly half the refresh rate. Away from
    that it was shown slightly early or late, and — because the error follows
    your frame time — alternately early and late as frame times swing. A
    constant offset would be invisible; an alternating one reads as judder.
    It is now placed to match when it is actually displayed.
  • Stability fixes in the new NVIDIA path: GPU work is properly drained when
    a swapchain or session goes away, and the generated frame is prepared in the
    right resource state rather than relying on the driver to tolerate it.

The first three are NVIDIA-specific or benefit NVIDIA most. FidelityFX is
unchanged from beta1 except where noted.

Still in from beta1

  • Steady 90 FPS at high headset resolution. At 27 Mpx per eye the layer
    previously produced fewer frames per second than running without it. The
    runtime was being told the layer's frame cost about a millisecond when the
    real work was around 15 ms, so it scheduled against numbers that described an
    empty loop. It now measures the real work, which is also what makes fpsVR's
    GPU and CPU frame times meaningful again.
  • Frame generation engages immediately. It could previously sit idle for
    minutes on a demanding scene — generating frames the whole time, at full GPU
    cost, with none of them being displayed — and then suddenly start working when
    you looked at something simple. The layer now decides it needs to pace itself
    by measuring the runtime rather than by guessing from the game's frame loop.
  • No more one-second dropouts. Changing settings, loading a world, or the
    game recreating its swapchains each cost a full second of generation.
    Transitions are now seamless.
  • Generation no longer stops permanently after a menu or loading screen.
    A clock inside the layer could drift a second per second until the game was
    predicting poses ten minutes into the future; once there, it never recovered
    for the rest of the session.
  • Games that would not start in VR now start. Titles that create many
    swapchains — The Callisto Protocol under UEVR, for example — exhausted the
    runtime's swapchain budget and failed at session creation. The layer now only
    takes resources for swapchains that actually carry the image you see.
  • Luke Ross mods: black flashes and double vision fixed. Cyberpunk 2077 was
    tearing down and restarting the layer's internals about three times a second,
    and separately publishing the previous pair's frame as the current one.
  • Higher resolution ceiling. Roughly 340 MB of per-frame copying moved off
    the critical path, taking the workable ceiling from about 15 to about
    24.5 Mpx.

Changed default

Unchanged from beta1, repeated here because it still catches people out:

FidelityFX honours the Optical flow resolution tray setting, which it
previously ignored and ran at full resolution. With the shipped default of 50%
this makes FidelityFX noticeably cheaper, at some cost in motion-vector detail.
Set nvidia_input_scale=100 in ofxr_bridge.ini to restore the old behaviour.

The tray menu entry is called Optical flow resolution rather than
"NVIDIA OFA resolution", because it applies to both backends. The ini key name
is unchanged.

Installing

Unzip anywhere and run OFXRBridgeTray.exe, then Arm bridge. Keep
OFXRBridgeTray.exe and the ofxr folder together. If you have an earlier
version armed, disarm it first.

Known issues

  • The frame generation work sharing the GPU with your game is new. If a game
    that was steady on beta1 is worse here, please say so and include a flight
    log — that is the case most worth hearing about.
  • Very high per-eye resolutions remain the limit. If frame times are erratic,
    drop the resolution first before changing anything else; the layer's cost
    scales with it.

Tested

Microsoft Flight Simulator 2024, Cyberpunk 2077 (Luke Ross mod), The Witcher 3,
and UEVR titles including The Callisto Protocol, on SteamVR with a Pimax
Crystal Super at up to 4172×3268 per eye, on both the NVIDIA OFA and FidelityFX
backends. VDXR is covered by the earlier work this builds on; PimaxXR is not
tested.

This is an experimental beta and compatibility is not universal. Please report
results — working and not — on this fork's
GitHub Issues, with an OFXR flight log where you can. Enable one
by setting logging_enabled=1 under [diagnostics] in ofxr_bridge.ini; logs
are written next to the armed layer under
%LOCALAPPDATA%\OFXR Bridge\RuntimeLayer\v151\.

Upstream results are collected in the
OFXR Bridge Compatibility Chart.

Don't miss a new OFXR-Bridge release

NewReleases is sending notifications on new releases.