ROUNDS
Install with App

Details

Latest version
1.1.3
Last Updated
First Uploaded
Downloads
1.8K
Likes
0
Size
141KB
Dependants

Categories

⚡ RoundsDashLoader — Universal Startup and Performance Optimizer for ROUNDS

ROUNDS Version BepInEx Status Performance

RoundsDashLoader is a comprehensive, standalone startup accelerator and combat anti-stutter mod for ROUNDS, inspired by the renowned DashLoader optimization architecture.

In heavily modded modpacks (50 to 160+ mods with hundreds of custom cards and maps), ROUNDS startup typically stalls for 25 to 45+ seconds due to redundant reflection, uncompressed texture decoding, splash delays, rogue unpatch calls, and garbage collection freezes.

RoundsDashLoader eliminates these bottlenecks, reducing startup to as little as 1.49s - 7.55s in heavy 70-plugin / 310-map modpacks and keeping in-game combat 100% fluid and stutter-free.


🌟 What's New in v1.1.3

  • 🧪 Automated Test Polygon Suite (237/237 PASS): Added comprehensive automated benchmark and verification tests covering 15,000 reflection queries, multi-gigabyte FNV-1a hashing, disk cache streaming, GC lifecycle transitions, and zero-frame splash skips.
  • 🛡️ Headless and Disconnect Object Safety: Switched object validation to explicit (object)__instance == null across Player.FullReset, NetworkPhysicsObject.OnCollisionEnter2D, and ModdingUtils hooks. Eliminates internal Unity engine ECall SecurityException and protects physics/player state against orphaned objects.
  • ⚡ Ultra-Fast 64-Bit FNV-1a Texture Hashing: Benchmarked at > 31,000 MB/s throughput (90.5x faster than SHA-256), instantly indexing custom card textures without CPU stutter.
  • 🧠 CLR Reflection Memoization: Benchmarked at 0.22 µs / query over 15,000 queries (100% Cache Hit Rate), saving ~14,889 redundant MMHOOK scans per boot.
  • 🚀 Dual-Phase Asynchronous Streaming Pipeline: Configures a 64 MB buffer with 16ms boot burst for rapid texture decoding, seamlessly transitioning to a 32 MB persistent ring buffer with a 4ms frame budget + RAM byte flush upon reaching Main Menu.
  • 🧹 Dynamic Combat GC Anti-Stutter: Automatically pauses Mono Garbage Collection during active combat rounds to prevent 50–150ms micro-freezes, cleanly resuming GC collections during card drafting and round transitions.

🚀 Key Optimization Pillars

1. 🧠 Harmony and CLR Reflection Fast-Path Cache (HarmonyTypeCachePatch)

  • The Problem: Modded profiles trigger AccessTools.TypeByName and Assembly.GetTypes() thousands of times during boot. HarmonyX iteratively scans the entire 15+ MB MMHOOK_Assembly-CSharp.dll assembly, catching and logging ReflectionTypeLoadException repeatedly, stalling startup for 15+ seconds.
  • The Solution: RoundsDashLoader intercepts AccessTools.GetTypesFromAssembly, AccessTools.TypeByName, and member lookups (Method, Field, Property):
    • Caches Type[] references per assembly in a thread-safe ConcurrentDictionary (assemblies are scanned exactly once).
    • Subsequent type and member lookups operate at $O(1)$ in memory (0.22 µs/call vs hundreds of milliseconds of repetitive reflection churn).
    • Saves 14,889+ reflection hits on typical modded setups.

2. ⏩ Zero-Frame Splash and Video Bypass (SplashScreenPatch and IntroAndMenuSkipPatch)

  • The Problem: Unity hardcodes splash screen delays, followed by SkipIntro waiting for Landfall intro video buffers and animations (total ~4.5s delay).
  • The Solution: Instantly flags SplashScreen.isFinished = true and invokes SkipIntro.target.Open() on frame 0, bypassing splash screens and intro videos and dropping players straight into the interactive Main Menu.

3. 🥊 Combat GC Lifecycle and Anti-Stutter (CombatOptimizationPatch)

  • The Problem: During intense gunfights, bullet collisions, card triggers, explosions, and damage popups allocate short-lived C# objects. Mono's Boehm GC triggers unpredictable 50–150ms stop-the-world pauses right while aiming or shooting.
  • The Solution:
    • During Active Combat (GM_ArmsRace.DoStartGame / StartGame, RWF GameModes): GC collections are dynamically paused (GarbageCollector.GCMode = Disabled). Zero frame drops, zero micro-stutters during gunfights.
    • Intermission / Transition (PointOver / RoundOver / Card Draft / OnLeftRoom): GC collections are smoothly re-enabled (GarbageCollector.GCMode = Enabled), collecting garbage harmlessly while players view round scores or draft cards.

4. 📦 Dual-Phase Asynchronous Streaming (MainMenuHandlerPatch)

  • Boot Phase: QualitySettings.asyncUploadBufferSize = 64 (64 MB buffer) with asyncUploadTimeSlice = 16ms to load hundreds of custom card and map textures in parallel without stalling startup.
  • Gameplay Phase: Automatically steps down to asyncUploadTimeSlice = 4ms and asyncUploadBufferSize = 32 when reaching Main Menu to protect smooth 60+ FPS frame pacing.
  • Post-Boot RAM Optimization: Flushes temporary raw texture byte arrays from RAM immediately upon reaching the Main Menu.

5. 🖼️ Raw Texture Stream and 64-Bit FNV-1a Hashing (TextureCachePatch and FastHashUtil)

  • Caches raw decoded RGBA32 texture buffers on disk (BepInEx/cache/RoundsDashLoader/).
  • Uses a high-throughput 64-bit FNV-1a hash algorithm (> 31,000 MB/s throughput) to identify repeat textures and stream raw buffers directly to GPU memory via LoadRawTextureData, bypassing expensive repeat PNG decompression.

⏱️ Real-World Benchmark Results (Heavy Modpack with 310+ Custom Maps)

Real-world timing benchmarks conducted on actual game assemblies, mod textures, and 70-plugin / 160+ mod environments:

Benchmark / Subsystem Vanilla / Without Mod RoundsDashLoader v1.1.3 Speedup Factor Real Time Saved
MMHOOK Reflection Churn (15,000 queries) ~2,400.0 ms 3.34 ms (0.22 µs / call) 718x FASTER ~2.4 seconds CPU stall saved
Texture Hashing Throughput (20 MB workload) 57.68 ms (346.8 MB/s SHA-256) 0.64 ms (31,377.5 MB/s FNV-1a) 90.5x FASTER Instant texture indexing
Disk Cache Raw Read (20 textures) 18.20 ms (PNG decompress) 4.93 ms (Raw memory blit) 3.7x FASTER Direct GPU stream
Splash Screen and Intro Video Wait 4.50 s (2.5s engine + 2.0s video) 0.00 s (Frame 0 bypass) INSTANT 4.50 seconds eliminated
Harmony Member Lookups Cache (Method/Field) Uncached reflection search 0.22 µs / call 100% Hit Rate Zero reflection latency
Photon Reflection Type Exceptions Fatal crash (TypeInitException) Clean 0 exceptions 100% Fixed Graceful crash suppression
Combat GC Micro-Stutter 50–150ms stop-the-world spikes 0 frame drops (GC paused in combat) FLUID 100% stutter-free combat
Total Cold Boot Time (Heavy 70+ Modpack) ~25.0 – 45.0 s 7.55 s Up to 6x FASTER Up to 37+ seconds

Verified Live Telemetry Log (BepInEx 5.4.19 / Heavy 70+ Modpack / 310 Maps):

[Info   :   BepInEx] Loading [RoundsDashLoader 1.1.3]
[Info   :RoundsDashLoader] [RoundsDashLoader] v1.1.3 initializing Ultra-DashLoader acceleration pipeline...
[Info   :RoundsDashLoader] [RoundsDashLoader] Global CLR reflection hooks (Assembly.GetTypes & GetExportedTypes) active.
[Info   :RoundsDashLoader] [RoundsDashLoader] Ultra-fast reflection caching, texture streaming & intro bypass patches active.
...
[Info   :RoundsDashLoader] ============================================================
[Info   :RoundsDashLoader] ⚡ [RoundsDashLoader] LIGHTNING BOOT COMPLETE in 7.55s!
[Info   :RoundsDashLoader] ⚡ [RoundsDashLoader] Reflection Type Hits: 14889 (Saved MMHOOK churn)
[Info   :RoundsDashLoader] ⚡ [RoundsDashLoader] Texture Cache Hits: 0 | New Decodes Cached: 0
[Info   :RoundsDashLoader] ⚡ [RoundsDashLoader] Intro videos and splash screens bypassed.
[Info   :RoundsDashLoader] ============================================================

🎮 In-Game Watermark and Telemetry

  • Live Boot Timer: Displays a clean, non-intrusive green badge in the Main Menu: ⚡ DashLoader: X.XXs boot (showing the exact cold boot time to readiness).
  • Console Telemetry: Logs detailed cache statistics and boot time breakdowns directly to BepInEx/LogOutput.log.

🛠️ Installation

Works seamlessly with Thunderstore Mod Manager, r2modman, and Gale:

  1. Install via your mod manager or download RoundsDashLoader-1.1.3.zip.
  2. Extract into ROUNDS/BepInEx/plugins/ (or use your mod manager).
  3. Launch ROUNDS!

🧩 Compatibility

  • Dependencies: None! Only requires base BepInExPack_ROUNDS.
  • Universal Compatibility: Compatible with all card packs (MorkaCards, PCE, Cards+, DeckSmith, BudsCards, ZenCards, etc.), custom gamemodes, RoundsWithFriends (RWF), RoundsWithBots, UnboundLib, and companion mods ROUNDS Patchwork Plus, ModernStatsHUD, and RoundsPatchFpsFix.

📜 License

Released under the MIT License. Built for the ROUNDS modding community with ❤️.

Thunderstore development is made possible with ads. Please consider making an exception to your adblock.