Scorn_Dogs-LateGamePerformance icon

LateGamePerformance

Performance for long runs plus intro skip, crit overstacking, bug fixes, item sharing, chest cleanup, auto sprint, a damage meter, and character stat points. In-game settings menu.

Last updated a day ago
Total downloads 189
Total rating 1 
Categories Mods
Dependency string Scorn_Dogs-LateGamePerformance-1.5.0
Dependants 0 other packages depend on this package

This mod requires the following mods to function

bbepis-BepInExPack-5.4.2121 icon
bbepis-BepInExPack

Unified BepInEx all-in-one modding pack - plugin framework, detour library

Preferred version: 5.4.2121

README

LateGamePerformance

Performance, fixes, and quality-of-life for Risk of Rain 2. Every change comes from the game's own code.

Settings

Press F4 at any time. Pick a feature on the left. Set its values on the right. A switch takes effect at once, with no restart, and every change saves by itself. The page uses the game's own panel, font, and colors, and it scales with the screen.

Stat points have their own window. You spend them as you play, so they are not a setting. A badge appears on screen when you have points waiting. Click the badge, or press F3.

The page lists the gameplay features only. The performance fixes have no downside and no effect on play, so they stay on. Click "Show fixes and tuning" to see them, or edit the config file at BepInEx/config/com.tim.LateGamePerformance.cfg.

The damage meter shows during a run. F5 hides it. The performance readout starts closed. F6 shows it. Its log line runs either way.

What it does

Eighteen independent patch groups. Each has an on/off switch in the config file (BepInEx/config/com.tim.LateGamePerformance.cfg). Seventeen are on by default. Sharing is off, because it changes the balance of a run for every player in the game. Turn it on in the F4 page if you want it.

Performance

Group What it fixes
BuffStatsFilter Bleed and poison stacks force a full stat recalculation on every tick. The patch skips that recalculation for buffs that do not touch stats. It keeps vanilla behavior while a player holds Growth Nectar.
NavPathBudget The game ships a per-frame budget for AI path computation, but it never subtracts from that budget. A whole spawn wave computes paths in one frame every two seconds. The patch enforces the budget (default 4 per tick) and staggers repath timers.
TargetSearchGc Target searches for missiles, drones, turrets, and AI allocate a list and several closures per call. The patch reuses buffers and removes the closures. Less garbage means fewer GC stutters.
DamageNumberBatch Each damage number copies the data of every live number particle in and out. A large AOE hit makes that quadratic. The patch batches all numbers of a frame into one copy. Numbers can appear one frame later.
RaycastThrottle Every moving AI fires up to three obstruction raycasts per physics tick. The game defines a 0.2 s interval for this and never uses it. The patch applies a 0.1 s interval (configurable).
HealthBarThrottle Health bars rebuild every frame, because the game zeroes its own 0.1 s throttle on load. The patch restores a 0.05 s throttle.
TeamItemCountCache Teleporter events scan every character in the run up to six times per frame for team item counts. The patch caches the counts for 0.25 s.
ModelCameraPass CharacterModel.OnSceneCameraPreRender walks every character model twice per camera per frame. The first walk measures a distance to every hurtbox of every model, including models that draw nothing. The patch makes one walk, asks about renderer visibility first, and skips the measurement for anything off screen. The overlay scan reads about twenty-five buffs per model. The patch runs that scan on a frame stride instead of every frame. The hit and heal flash stay exact, because that color travels in the material property block.
PerfReadout Frame time, frames per second, and the worst frame of the last ten seconds. Also the worst frame of the run, character and hurtbox counts, garbage collections per second, and heap size. On screen, and in the log every thirty seconds.
FixedTimeCatchup One slow frame lets the engine run up to 20 catch-up physics ticks, which makes the next frame slower. That feedback loop is the endgame freeze. The patch clamps catch-up to 2 ticks during a run. The game slows down under extreme load instead of freezing.

Fixes and quality of life

Group What it does
SkipIntro The game boots straight to the title screen. No startup video.
BugFixes Guards for vanilla code that throws exceptions during play. It covers menu tag profile reads, crosshair stock displays, and target searches on broken hurtboxes. It also covers tether VFX indexing, light cookie teardown, and two log-spam test states.
CritOverstack Crit chance above 100 percent converts into extra crit damage. 150 percent chance gives a guaranteed crit at 1.5 times the normal crit bonus.
Sharing Off by default. A player pickup grants the same item to every other player. Tier filters live in the menu. Lunar and void items are off by default. Gold works the same way. Every player gets the full amount of all gold. That includes the kill gold, which the base game splits between you. The mod can share equipment as well, and that is off by default. The equipment it replaces drops next to its owner. Printer, cauldron, and scrapper output stays private unless you ask for it. Void Fields, Simulacrum waves, and Scavenger bags drop no extra copies. The base game drops one reward for each player, because players compete for them. Sharing already gives everybody a copy. The host runs this feature. Other players need no mod.
EmptyChests Opened chests, used barrels, and spent multishops despawn after a delay. Adaptive (roulette) chests stay for now. Scavenger bags stay by default.
AutoSprint Your character sprints by itself while it moves. The sprint key reverses: hold it to walk. The vanilla direction rule stays, so characters without the any-direction flag do not sprint sideways or backward. After a skill that cancels sprint, a short pause lets the animation finish.
DpsMeter A table on screen shows the damage each player did on the stage you are on. It also gives the share of the total. Two more columns show damage per second: one over the whole stage, one over the last six seconds. Every connected player has a row. Damage from drones, turrets, and other minions counts toward the player who owns them. F5 hides the table. The host and a player who joins both see the same numbers. The game already sends every damage event to every client.
StatPoints Your character earns a point every few levels. Spend it on maximum health, regeneration, damage, attack speed, crit chance, armor, or move speed. Press F3 during a run, or click the badge, to spend points. Take them back at any time. You can set every value. It works with every survivor, modded ones included, because it raises the same base stats the game uses. Points last for the current run. Only the host can spend points. A player who joins still sees the window and the points earned, but the buttons stay off. A point spent on that machine would never reach the machine that runs the game.

Requirements

  • BepInEx 5 (BepInExPack for Risk of Rain 2)

No other mod is required.

Install

With a mod manager (recommended):

  1. Install r2modman and set it up for Risk of Rain 2.
  2. Install BepInExPack from the online list.
  3. Use "Settings" > "Import local mod" and select this zip.
  4. Start the game through the mod manager.

Manual install:

  1. Install BepInExPack into the game folder.
  2. Copy LateGamePerformance.dll into BepInEx\plugins\LateGamePerformance\.
  3. If no plugin loads and the log reports a missing Newtonsoft.Json, put the official Newtonsoft.Json.dll (v12+) into BepInEx\core\.

In multiplayer each player can run the mod on their own. The AI and pathfinding fixes act on the machine that hosts the game. The visual fixes act on each machine that has the mod.

Compatibility notes

  • The mod replaces five methods whole. Another mod that patches the inside of one of these methods loses its changes. Turn off the group named beside it if a conflict appears.

    Method Group
    BullseyeSearch.RefreshCandidates TargetSearchGc
    BullseyeSearch.GetResults TargetSearchGc
    DamageNumberManager.SpawnDamageNumber DamageNumberBatch
    NodeGraphNavigationSystem.UpdateAgents NavPathBudget
    CharacterModel.OnSceneCameraPreRender ModelCameraPass

    Patches on CheckVisible and CheckLoS stay effective.

  • Run one item-sharing mod at a time. Sharing and ShareSuite both grant their own copy of a pickup, so together they give two. Sharing is off by default, so this only matters if you turn it on.

  • A mod that adds a postfix to Util.GetItemCountForTeam can apply its adjustment twice while a cached value lives. Turn off TeamItemCountCache in that case.

  • FixedTimeCatchup is a local setting, like a graphics option. In multiplayer each player runs their own value.

  • A larger HealthBarThrottle interval slows the trailing damage bar. The range stops at 0.1 s for this reason.

Multiplayer

The ten performance groups change no damage, no spawn, no drop, and no networked decision. Path timing and raycast timing change only on the machine that simulates the AI (the host). Clients keep full vanilla behavior for all server-authoritative state.

Three groups do change play, and the host decides for the whole game:

Group Default What the group changes
Sharing off Items and gold for every player.
CritOverstack on Crit chance above 100 percent becomes crit damage.
StatPoints on The stats of the host character. A player who joins cannot spend.

Uninstall

Remove the mod at any time. This is safe.

The game keeps intro_skip and splash_skip in its own config.cfg. Those two switches break a vanilla start if they stay on. The mod writes them back to off before the game saves that file. The file always holds the vanilla value.

Delete BepInEx\plugins\LateGamePerformance\. Delete BepInEx\config\com.tim.LateGamePerformance.cfg as well if you do not plan to return. Stat points last for one run and store nothing.