github GameOrDie007/Star-Wars-Episode-I-Racer-PCVR v1.3
v1.3 - Crash Fix & Performance

latest releases: v1.5, untagged-f500fa53421b098594fc, v1.4.1...
one month ago

Two fixes that matter to everyone: a crash at the end of a race, and a stutter that was costing you roughly a tenth of your frames.

Nothing else changes. Same controls, same settings, same requirements: a 32-bit OpenXR runtime (Virtual Desktop works, SteamVR does not), and your own copy of the game. Everything in the v1.2 notes still applies — analog steering, haptics and wheel support are unaffected.

The stutter

If the game felt like it was hitching about once a second no matter what was happening — in menus as much as mid-race — that was real, it was our fault, and it's fixed.

The mod checks for a connected gamepad so the D-pad can drive the menus. That check was supposed to run once a second. Because of a mistake in the condition, the rate limit only applied once a controller had already been found — so if you didn't have a gamepad plugged in, which is most people in VR, it asked Windows about all four controller slots every single frame, around 360 times a second. Asking about an empty slot is expensive: it goes all the way down into Windows' device enumeration, and that enumeration re-runs about once a second. Hence a freeze, once a second, forever.

Measured on a Quest 3 before and after, same machine, same session length:

before after
average 83–87 fps 90.0 fps
frames over budget 7–36% 0–3%
worst frame 130–190 ms 12–21 ms

A 130 ms freeze at 90 Hz is a dozen frames gone at once, which is why it read as stuttering rather than as a low framerate — the median frame was always fine.

Two related improvements came out of the same work: the Gamepad navigation setting now switches off the checking as well as the feature (before, turning it off still cost you the full price every frame), and the renderer no longer re-reads both shader source files from disk every time it compiles a shader.

If you previously turned settings down to cope with this, try turning them back up. AI full LOD in particular was measured as costing nothing.

The crash

A player reported an instant crash to desktop every time a race finished, on every track, with a freshly verified install. Someone else on the same build couldn't make it happen once.

That difference is the diagnosis. When identical code crashes always for one person and never for another, it's usually reading memory that's already been freed — and what happens next depends on what the machine happened to put there afterwards, which differs from run to run.

v1.2 added a line of diagnostic logging that looked up the player's pod to print a setting once. It remembered where the pod was during the race; the game throws the pod away when the race ends; the input code kept looking there every frame while you sat on the results screen. It checked the pointer wasn't empty, and it wasn't — it just no longer pointed at anything real.

It was a leftover debug print that should never have shipped. It's gone, along with the bookkeeping that fed it.

Also in this release

The wheel centring-spring feature is removed. Across every log ever collected it had never once worked — every device, every session, reported "not a force-feedback device", the G923 included. The tension wheel users noticed came from G HUB's own Centering Spring in Non Force Feedback Games setting, which the README has always told you to enable. That still works and is still the way to get it. Its F5 checkbox is gone rather than left doing nothing.

Crash reports now identify themselves properly. The mod installs as dinput.dll, and Windows has its own dinput.dll, so a crash in either printed the same thing and the two were indistinguishable — which cost a day on the bug above. Reports now name the folder as well as the file, mark the mod's own frames, and record where it was loaded, so a report you send in can be traced to an exact line of code without anyone having to reproduce it.

Frame timing is now logged permanently — one line per 300 frames with the median, the worst frame and a dropped-frame count. If anything ever feels slow again, hook.log will say so in numbers.

Reporting problems

Grab hook.log from the game folder before relaunching — it's overwritten each launch. If it crashed, include the whole timestamped file from crashes/. Both fixes in this release came out of exactly that.

Licence

AGPL-3.0, inherited from SW_RACER_RE by tim-tim707 and contributors, on whose decompilation and OpenGL renderer this is built. Complete corresponding source is the pcvr branch of this repository. openxr_loader.dll is the Khronos Group's OpenXR loader, redistributed unmodified under Apache-2.0. The original game is the property of LucasArts / Lucasfilm.

Don't miss a new Star-Wars-Episode-I-Racer-PCVR release

NewReleases is sending notifications on new releases.