ULTRAPerf-UltraPerformance icon

UltraPerformance

Fixes FraudTweaks' explosion exception spam and its 13 ms/frame blocker check, removes per-frame exceptions and allocations, optional portal recursion LOD, built-in profiler. Defaults change nothing visible.

Last updated 2 hours ago
Total downloads 75
Total rating 1 
Categories Misc Quality Of Life Utility
Dependency string ULTRAPerf-UltraPerformance-1.0.0
Dependants 0 other packages depend on this package

This mod requires the following mods to function

BepInEx-BepInExPack-5.4.2100 icon
BepInEx-BepInExPack

BepInEx pack for Mono Unity games. Preconfigured and ready to use.

Preferred version: 5.4.2100

README

UltraPerformance

Performance fixes for ULTRAKILL, found by profiling the game frame by frame rather than guessing. Everything that is on by default leaves the game looking and playing exactly the same. Anything that trades visuals or AI behaviour for speed is off until you turn it on, and says what it costs.

Installation

With a mod manager (recommended): install UltraPerformance from r2modman or the Thunderstore Mod Manager. BepInEx is installed automatically as a dependency.

Manually:

  1. Install BepInExPack into your ULTRAKILL folder and launch the game once.
  2. Copy plugins/UltraPerformance.dll from this download into ULTRAKILL/BepInEx/plugins/.
  3. Launch the game. BepInEx/LogOutput.log should contain UltraPerformance ready.

What it does

On by default

Fixes for FraudTweaks

If you use FraudTweaks 1.6.0, two of its patches cost a lot on the current game version:

  • Explosions. Its explosion patch calls a portal function the game no longer has, so it throws an exception on every physics tick of every explosion near a portal. One session logged 16,866 of them, and each throw also stopped that explosion's portal damage. UltraPerformance removes just that patch; the game's own portal check, which now covers the same case, runs instead.
  • Out-of-bounds blockers. Its blocker check slows down with the square of the number of blockers and allocates memory every frame. In the custom level Infinite Regression (647 blockers) it took 13 ms of a 20 ms frame. UltraPerformance swaps in a version that does the same checks in a single pass: ~48 → ~120 fps in that level's portal room, with every portal fully rendered.

Both are skipped automatically if FraudTweaks isn't installed or releases a version that fixes them.

Exception spam

FadeOut.Update and Explosion.FixedUpdate can throw a NullReferenceException every frame (one session logged over 88,000). The exception already aborts the method, so skipping the call when it would throw changes nothing except the cost.

Allocation fixes

  • Enemy.GetVisionFilter() allocated an array every physics tick for every enemy. Now cached.
  • Idol.PickNewTarget() repeated the same vision query up to 7 × N times. Now runs it once; target choice is unchanged.
  • Mannequin.CheckClings() used an allocating physics query while airborne. Now non-allocating.

Off by default: portal quality settings

Each portal view is a full re-render of the scene, so portal-heavy levels are where frame time goes. These settings trade some portal detail for speed. All are in BepInEx/config/reedo.ultraperformance.cfg under [Portal render].

Setting What it does What you see
AdaptiveRecursion The portal you're looking through keeps full depth; small and distant ones render fewer levels. Measured 110 → 240 fps in a portal-heavy Fraud scene. Far-off portals-within-portals show a recently refreshed snapshot instead of a live view.
MaxRecursions Caps recursion depth for every portal. Same as above, for every portal.
MinPixelAreaFraction, MaxDistance Skip portals that are tiny or far away. Skipped portals render black.

FallbackForAllPortals (on) is what makes the first two safe: without it, portals at the depth limit render black.

Off by default: engine experiments

  • [Threads] JobWorkerCount: Unity sizes its worker thread pool from your CPU's thread count and ignores CPU pinning, so a pinned game can run more worker threads than it has cores. Try 6 or 4.
  • [Render] NoDistanceSort: sorts opaque objects by material to cut state changes, at the cost of GPU overdraw.

Measure before keeping either one; whether they help depends on your machine.

Settings

All settings are in BepInEx/config/reedo.ultraperformance.cfg, created the first time you launch the game with the mod. Every fix can be switched off individually there.

Numbers above are from one machine (i5-12600KF, RTX 4080 SUPER, 4K). Your results will differ.