1.2.0 ​

Swofty Launcher for F1 25 1.2.0 measures what the launcher costs inside the game and sends it with your logs.

swofty_core times every hook, site handler, event callback and storage call it runs, about 12 ns per timed call, and writes the result to swofty/perf.log in the game folder every 15 seconds and when the game exits. The report has frame times, hitches over 50 ms with the swofty calls that ran in them, single calls over 8 ms, the time each addon took, and a timeline of screens, flow states and sessions with the swofty time in each. A summary line goes to loader.log every minute. See Performance report.

Send Logs to Developers includes the running game's loader.log and perf.log. summary.txt gains a Performance section with the report's summary and per-addon table, and an Addons section with each installed addon's version and whether it's on in the active profile. After the game exits, swofty run keeps perf.log in the session folder beside loader.log. See Send your logs to the developers.

The Career Mode Editor and Driver Manager update with the launcher when an older version is installed. The release carries them in addons/updates/; they are not installed where they weren't before.

The Career Mode Editor 0.2.3 writes its snapshot every 5 seconds instead of every second while a career is loaded, and its frame callback never runs on two threads at once. Versions up to 0.2.0 rendered every section on the game's thread every second, which made career menus stutter; 0.2.1 rendered only while its launcher page was open.

Swap Seats works in My Team. Every My Team swap used to fail with no_component, because the editor needed a game component that My Team careers don't have. A swap now writes both seats the way the game's own My Team driver moves do, and then tells the game which drivers changed. The editor also logs what the game returned when a component lookup comes back empty.

on_frame callbacks run once per rendered frame, on the first flow-thread update after the frame, and at least every 33 ms when no frame is rendered. Before, they ran on every flow-state update, nested ones included, up to 24 times per frame, and on whichever worker thread ran it.

The UI hooks check game memory through the SDK's cached reader. A frontend reload, such as the one after leaving a race, spends about 11 ms less in swofty_core.

Join the Discord, above Send Logs to Developers, opens the Swofty Developments Discord server. The first time the launcher opens, a News popup invites you there too; once you close it, it doesn't show again.

Offline play starts when your Windows user name has characters outside your system's code page, such as Naël. The launcher uses the offline play extension's 0.3.10 release: before it, staging stopped with a filesystem error under such a user folder, so modded sessions could not start.

A track package without copy_from_track uses its copy_slot track as its base.

These switches change the performance report. Set them under "env" in "launch" in $DATA/config.json; see Diagnostic switches.

VariableEffect
SWOFTY_PROFILE=0Turns the performance report off
SWOFTY_PERF_HITCH_MS=<ms>The frame time counted as a hitch. Default 50
SWOFTY_PERF_SLOW_CALL_MS=<ms>The time a single call takes before it is listed as slow. Default 8
SWOFTY_PERF=1Also logs every hitch to loader.log

For addon authors:

  • on_frame runs once per rendered frame on one thread at a time. A plugin that counted calls to pace its work gets fewer calls; use dt.
  • swofty_core.dll exports SwoftyPerfProbe, SwoftyPerfEnter and SwoftyPerfLeave to time a plugin's own work in the report. See Performance report.

Download it from Releases or with the installer. The launcher offers each new release itself.

Publishing