All Mods Resource Packs Data Packs Shaders Modpacks Plugins
F

FPSFlow

by McAffe13 • Downloads: 0 • Followers: 0
Description
Gallery
Changelog
Versions

FPSFlow

Real FPS improvements — no placebo, no bloat.

FPSFlow is a client-side Fabric optimization mod that targets the biggest rendering bottlenecks in vanilla Minecraft. Every feature is measurably effective, individually toggleable, and automatically adjusts to your hardware via four built-in performance profiles.


✦ Features at a Glance

Feature What it does
🔍 Entity Culling Frustum, occlusion, and distance culling. Dual-point raycasting prevents false-positives on small entities. Auto-disables when EntityCulling is detected.
📐 Entity LOD Entities beyond a configurable distance render every 2nd tick. Server NPCs and entities within nameplate range are always fully exempt — no flicker, even in busy lobbies.
🏷️ Nameplate Culling Hides name tags beyond a configurable distance. Server-forced labels are never hidden.
🧱 Block Entity Culling Skips chests, furnaces, signs, banners, and item frames beyond the configured range.
✨ Particle Optimization Count cap + three-zone density LOD (full / ~50 % / none) based on distance from player.
🖼️ Painting Back-Face Culling Instantly skips paintings when the camera is behind them — they are never visible from the back.
🌙 Background FPS Limiter Caps frame rate when the window loses focus, is minimised, or on any loading/menu screen (reduces GPU spinning during startup).
🌍 Singleplayer Boost More aggressive adaptive culling in singleplayer — frees CPU for chunk generation threads so exploration stays smooth.
⚡ World Join Optimizer Culling distances ramp up from 35 % on join and return to 100 % over ~10 seconds — eliminates the initial FPS spike.
🎮 GUI & HUD Optimizer Dirty-flag hotbar caching (including CustomModelData); HUD throttling with immediate response to actual stat changes. Caches auto-clear on resource-pack reload to prevent stale item textures.

✦ Performance Profiles

One setting, four presets — changing the profile rewrites all other settings automatically.

Profile Entity Dist. BE Dist. LOD threshold Nameplate Particle (mid/max) BG FPS (unfoc/min/menu)
Quality 128 b Off 128 b Off Off 30/10/120
Balanced (default) 64 b 64 b 96 b 32 b 32/64 b 60/30/120
Performance 48 b 48 b 64 b 24 b 16/32 b 10/3/120
Ultra Performance 32 b 32 b 40 b 16 b 8/16 b 5/2/60

Set "profile": null in the config to use fully custom values.


✦ Compatibility

FPSFlow detects installed mods at startup and automatically disables overlapping features.

Mod Status
🟢 Sodium Fully compatible — FPSFlow adds entity/GUI optimizations on top
🟢 Lithium No overlap — both run independently
🟢 FerriteCore No overlap — both run independently
🟢 ModernFix No overlap — both run independently
🟢 ModMenu Optional — enables in-game config screen
⚡ EntityCulling (tr7zw) FPSFlow's built-in culling disables automatically — recommended companion for superior occlusion accuracy
⚡ ImmediatelyFast FPSFlow's HUD caching defers automatically

Recommended stack: Sodium + Lithium + FerriteCore + ImmediatelyFast + EntityCulling + ModMenu + FPSFlow


✦ Installation

  1. Install Fabric Loader for Minecraft 1.21.11
  2. Download and install Fabric API
  3. Drop the FPSFlow .jar into your mods/ folder
  4. (Optional) Install ModMenu for the in-game settings screen
  5. Launch — the config is written automatically on first run

✦ FAQ

Does FPSFlow conflict with Sodium, Lithium, or FerriteCore? No. FPSFlow is designed to complement these mods — install all of them together.

Can entities "pop in" with occlusion culling? Rarely. The cache refreshes every 10 ticks (configurable). FPSFlow samples the entity's eye position for the raycast — naturally above the geometric centre, which avoids false-positives for small entities like floating heads and armor stands.

Does this work on servers? FPSFlow is purely client-side — works with any server, no server installation required. Servers that send a custom resource pack are fully supported: FPSFlow detects the pack reload and pauses render throttles for ~3 seconds so item-frame maps and hotbar items always show the correct textures after the pack loads.


✦ Partner

NexoMaker — Use code MCAFFE13 for 15% discount

🎨 Create Custom Minecraft Content with NexoMaker

Create custom items, mobs, blocks, recipes, and more — without coding.
Compatible with Nexo, ItemsAdder, and other modern custom-content systems.

💜 Use code MCAFFE13 to get 15% off! 👉 Get started with NexoMaker

⚠️ ItemsAdder or Nexo required for exported content.

✦ Source & License

GitHub — McAffe13/FPSFlow · Licensed under the Mozilla Public License 2.0

All Versions

+ Add Version
Name Game version Platforms Published Downloads Actions
1.21.11
Fabric
3mo ago 1
26.2 26.1.x
Fabric
3mo ago 1
1.21.11
Fabric
3mo ago 1
26.2 26.1.x
Fabric
3mo ago 1
1.21.11
Fabric
3mo ago 1
26.2 26.1.x
Fabric
3mo ago 1
26.2 26.1.x
Fabric
3mo ago 1
1.21.11
Fabric
3mo ago 1
1.21.11
Fabric
4mo ago 1
1.21.11
Fabric
4mo ago 1
1.21.11
Fabric
4mo ago 1
1.21.11
Fabric
5mo ago 1
1.21.11
Fabric
5mo ago 1
1.21.11
Fabric
5mo ago 1
1.21.11
Fabric
5mo ago 1
1.21.11
Fabric
5mo ago 1
1.21.11
Fabric
5mo ago 1
1.21.11
Fabric
5mo ago 1
1.21.11
Fabric
5mo ago 1
1.21.11
Fabric
5mo ago 1
1.21.11
Fabric
5mo ago 1
1.21.11
Fabric
5mo ago 1
1.21.11
Fabric
5mo ago 1
1.21.11
Fabric
5mo ago 1
1.21.11
Fabric
5mo ago 1
1.21.11
Fabric
5mo ago 1
1.21.11
Fabric
5mo ago 1
1.21.11
Fabric
5mo ago 1
1.21.11
Fabric
5mo ago 1
1.21.11
Fabric
5mo ago 1
1.21.11
Fabric
5mo ago 1
1.21.11
Fabric
5mo ago 1
1.21.11
Fabric
5mo ago 1
1.21.11
Fabric
5mo ago 1
1.21.11
Fabric
5mo ago 1
1.21.11
Fabric
5mo ago 1
[1.8.3] FPSFlow 1.8.3 by McAffe13 on Jul 29, 2026
Download
## [1.8.3]

### Fixed
  • ModMenu settings screen now shows the full FPSFlow configuration again in modern builds** — The modern compatibility screen now exposes the same settings layout as the 1.21.11 build instead of opening an empty or placeholder page.

### Changed
  • Version bumped to 1.8.4** — Gradle property mod_version updated from 1.8.3 to 1.8.4.

## [1.8.3]

### Fixed
  • Particle optimization is no longer enabled by default in the Balanced profile** — The default profile now keeps particle limits off unless you enable them manually, so visible effects like fishing particles are not filtered out on a fresh install.

### Changed
  • Version bumped to 1.8.3** — Gradle property mod_version updated from 1.8.2 to 1.8.3.
[1.8.3] FPSFlow 1.8.3 by McAffe13 on Jul 29, 2026
Download
## [1.8.3]

### Fixed
  • ModMenu settings screen now shows the full FPSFlow configuration again in modern builds** — The modern compatibility screen now exposes the same settings layout as the 1.21.11 build instead of opening an empty or placeholder page.

### Changed
  • Version bumped to 1.8.4** — Gradle property mod_version updated from 1.8.3 to 1.8.4.

## [1.8.3]

### Fixed
  • Particle optimization is no longer enabled by default in the Balanced profile** — The default profile now keeps particle limits off unless you enable them manually, so visible effects like fishing particles are not filtered out on a fresh install.

### Changed
  • Version bumped to 1.8.3** — Gradle property mod_version updated from 1.8.2 to 1.8.3.
[1.8.2] FPSFlow 1.8.2 by McAffe13 on Jul 26, 2026
Download
## [1.8.2]

### Changed
  • Single modern build now supports both Minecraft 26.1.2 and 26.2** — The modern build target now uses a flexible dependency range (>=26.1 for Minecraft, >=0.155.1 for Fabric API) in fabric.mod.json. A single gradle buildModern produces one JAR that works on both Minecraft 26.1.2 and 26.2 without separate artifacts.
  • Build system improvements** — Added minecraft_dep and fabric_dep properties to build.gradle.kts, keeping the compile-time dependency pinned to a specific version while declaring a wider runtime compatibility range in the mod metadata.

### Fixed
  • Mod rejected on Minecraft 26.1.2** — The previous hard dependency on Minecraft >=26.2 prevented the mod from loading on 26.1.2. The runtime dependency is now >=26.1, accepting all 26.x releases.

[1.8.2] FPSFlow 1.8.2 by McAffe13 on Jul 26, 2026
Download
## [1.8.2]

### Changed
  • Single modern build now supports both Minecraft 26.1.2 and 26.2** — The modern build target now uses a flexible dependency range (>=26.1 for Minecraft, >=0.155.1 for Fabric API) in fabric.mod.json. A single gradle buildModern produces one JAR that works on both Minecraft 26.1.2 and 26.2 without separate artifacts.
  • Build system improvements** — Added minecraft_dep and fabric_dep properties to build.gradle.kts, keeping the compile-time dependency pinned to a specific version while declaring a wider runtime compatibility range in the mod metadata.

### Fixed
  • Mod rejected on Minecraft 26.1.2** — The previous hard dependency on Minecraft >=26.2 prevented the mod from loading on 26.1.2. The runtime dependency is now >=26.1, accepting all 26.x releases.

[1.8.1] FPSFlow 1.8.1 by McAffe13 on Jul 24, 2026
Download
## [1.8.1]

### Added
  • Lithium-inspired performance optimizations** — FPSFlow 1.8.1 integrates several key optimization techniques adapted from CaffeineMC's excellent [Lithium](https://github.com/CaffeineMC/lithium) mod, reimplemented from scratch to respect Lithium's license and ensure full compatibility with the FPSFlow codebase:
  • Compact Sine Table** (CompactSineTable.java) — A memory-efficient sine LUT that reduces table size from 256 KB to 64 KB using trigonometric identities (sin(-x) = -sin(x), sin(x) = sin(π/2 - x)). Reduces CPU cache pressure during rotation-heavy rendering while maintaining bit-for-bit compatibility with Minecraft's MathHelper.
  • Direction Constants Caching** (DirectionValuesMixin.java, FastDirection.java) — Prevents repeated defensive array copies from Direction.values() in hot code paths by providing cached references. Every call to Enum.values() in Java creates a new array allocation; this optimization eliminates that overhead in frequently-called redstone, block update, and entity collision code.
  • Fast BlockPos Utilities** (FastBlockPos.java) — Thread-local mutable BlockPos for iteration contexts plus efficient long-packing for hash-based collections, reducing GC pressure in chunk scanning and neighbor-iteration hot loops.
  • Collection Helper** (FastCollectionHelper.java) — Pre-sized HashMap/HashSet factories with optimal initial capacities, identity-based sets for entity classification, and utility methods that avoid the common allocation pitfalls found in vanilla's collection usage.
  • Full Lithium attribution** — All adapted code paths include Javadoc @see references and Inspired by comments linking to the upstream Lithium repository.

### Changed
  • Version bumped to 1.8.1** — Gradle property mod_version updated from 1.8 to 1.8.1.
  • OptimizationManager module list extended** — New lightweight utility modules are registered on startup (no tick overhead, no Minecraft class dependencies).

### Fixed
  • None.

[1.8.1] FPSFlow 1.8.1 by McAffe13 on Jul 24, 2026
Download
## [1.8.1]

### Added
  • Lithium-inspired performance optimizations** — FPSFlow 1.8.1 integrates several key optimization techniques adapted from CaffeineMC's excellent [Lithium](https://github.com/CaffeineMC/lithium) mod, reimplemented from scratch to respect Lithium's license and ensure full compatibility with the FPSFlow codebase:
  • Compact Sine Table** (CompactSineTable.java) — A memory-efficient sine LUT that reduces table size from 256 KB to 64 KB using trigonometric identities (sin(-x) = -sin(x), sin(x) = sin(π/2 - x)). Reduces CPU cache pressure during rotation-heavy rendering while maintaining bit-for-bit compatibility with Minecraft's MathHelper.
  • Direction Constants Caching** (DirectionValuesMixin.java, FastDirection.java) — Prevents repeated defensive array copies from Direction.values() in hot code paths by providing cached references. Every call to Enum.values() in Java creates a new array allocation; this optimization eliminates that overhead in frequently-called redstone, block update, and entity collision code.
  • Fast BlockPos Utilities** (FastBlockPos.java) — Thread-local mutable BlockPos for iteration contexts plus efficient long-packing for hash-based collections, reducing GC pressure in chunk scanning and neighbor-iteration hot loops.
  • Collection Helper** (FastCollectionHelper.java) — Pre-sized HashMap/HashSet factories with optimal initial capacities, identity-based sets for entity classification, and utility methods that avoid the common allocation pitfalls found in vanilla's collection usage.
  • Full Lithium attribution** — All adapted code paths include Javadoc @see references and Inspired by comments linking to the upstream Lithium repository.

### Changed
  • Version bumped to 1.8.1** — Gradle property mod_version updated from 1.8 to 1.8.1.
  • OptimizationManager module list extended** — New lightweight utility modules are registered on startup (no tick overhead, no Minecraft class dependencies).

### Fixed
  • None.

[1.8] FPSFlow 1.8 by McAffe13 on Jul 23, 2026
Download
## [1.8.0]

### Changed
  • Configurable Java target** — The Java version is no longer hardcoded in build.gradle.kts. It is now read from the java_version property in gradle.properties (default: 21). Set java_version=25 to build with Java 25. The Mixin compatibility level (JAVA_21 / JAVA_25) and the remapJar classifier (mc1.21.11-java21 / mc1.21.11-java25) are derived automatically from this value — nothing is hardcoded.
  • Removed broken Java 21 / Java 25 multi-target build** — The previous targetJavaVersion switch that attempted to produce separate artifacts for different Minecraft generations never functioned correctly. The build now uses a single, configurable Java version.
  • Removed Java 25 properties from gradle.properties** — The minecraft_version_java25, yarn_mappings_java25, loader_version_java25, fabric_version_java25, and modmenu_version_java25 properties have been removed. All builds now use the single set of Fabric properties.
  • Simplified build.gradle.kts** — Dead code removed, all comments translated to English, ModMenu removed from compile-time dependencies. The integration class now uses a matching method signature that ModMenu calls via reflection, eliminating the compile-time dependency that caused build failures when ModMenu artifacts were unavailable.
  • Fixed TerraformersMC Maven repository URL** — Changed from https://terraformersmc.com to https://maven.terraformersmc.com for correct dependency resolution.
  • Improved fabric.mod.json** — Description updated to match the Modrinth page; fabricloader and fabric-api dependency minimums tightened to >=0.19.3 and >=0.141.4 respectively.
  • Updated how_to_build.md** — Rewritten for the single configurable Java build path; references to the removed buildJava21 / buildJava25 tasks eliminated.
  • Updated settings.gradle.kts** — Removed version lock for fabric-loom and simplified plugin repository configuration.
  • Fabric API version corrected** — Changed from 0.19.3+26.2 (invalid) to 0.141.4+1.21.11 (correct for MC 1.21.11).
  • Build verified with Java 25** — Successfully compiled and remapped fpsflow-1.8.0-mc1.21.11-java25.jar.
  • Version migration guide** — Added VERSION_MIGRATION.md documenting short-term (Yarn) and long-term (Mojang mappings) strategies.

### Fixed
  • ModMenu integration was broken** — FPSFlowModMenuIntegration.createConfigScreen() returned null, causing a NullPointerException when a player clicked the Config button in ModMenu. The class now properly implements ModMenuFactory and returns a FPSFlowConfigScreen instance.
  • Duplicate translation keys in en_us.json and de_de.json** — The entity_lod and item_frame key blocks were duplicated, with the first occurrence silently overwritten by the second. All duplicate blocks have been merged into single, complete entries.
  • Missing translation keys** — Added entity_culling.painting_backface_culling, entity_culling.painting_backface_culling.tooltip, and nameplate_culling.enabled.tooltip to both language files. These keys were referenced by the config screen but had no translations, causing fallback to the raw key string.
  • Dead variable in settings.gradle.kts** — The mcVersion variable was read from Gradle properties but never used in the fabric-loom resolution strategy. Removed.

### Removed
  • i18n_pending_keys.txt and README_UI_KEYS.txt** — These development artifacts tracked missing translation keys. All keys are now present in both language files, so these files are no longer needed.
  • gradlew and gradle/wrapper/** — The Gradle wrapper is unnecessary when Gradle is installed system-wide. Users can build directly with gradle build.
  • Yarn OFFICIAL mapping mode** — Temporarily removed; Loom 1.17.3 requires explicit Yarn mappings.

[1.8] FPSFlow 1.8 by McAffe13 on Jul 23, 2026
Download
## [1.8.0]

### Changed
  • Configurable Java target** — The Java version is no longer hardcoded in build.gradle.kts. It is now read from the java_version property in gradle.properties (default: 21). Set java_version=25 to build with Java 25. The Mixin compatibility level (JAVA_21 / JAVA_25) and the remapJar classifier (mc1.21.11-java21 / mc1.21.11-java25) are derived automatically from this value — nothing is hardcoded.
  • Removed broken Java 21 / Java 25 multi-target build** — The previous targetJavaVersion switch that attempted to produce separate artifacts for different Minecraft generations never functioned correctly. The build now uses a single, configurable Java version.
  • Removed Java 25 properties from gradle.properties** — The minecraft_version_java25, yarn_mappings_java25, loader_version_java25, fabric_version_java25, and modmenu_version_java25 properties have been removed. All builds now use the single set of Fabric properties.
  • Simplified build.gradle.kts** — Dead code removed, all comments translated to English, ModMenu removed from compile-time dependencies. The integration class now uses a matching method signature that ModMenu calls via reflection, eliminating the compile-time dependency that caused build failures when ModMenu artifacts were unavailable.
  • Fixed TerraformersMC Maven repository URL** — Changed from https://terraformersmc.com to https://maven.terraformersmc.com for correct dependency resolution.
  • Improved fabric.mod.json** — Description updated to match the Modrinth page; fabricloader and fabric-api dependency minimums tightened to >=0.19.3 and >=0.141.4 respectively.
  • Updated how_to_build.md** — Rewritten for the single configurable Java build path; references to the removed buildJava21 / buildJava25 tasks eliminated.
  • Updated settings.gradle.kts** — Removed version lock for fabric-loom and simplified plugin repository configuration.
  • Fabric API version corrected** — Changed from 0.19.3+26.2 (invalid) to 0.141.4+1.21.11 (correct for MC 1.21.11).
  • Build verified with Java 25** — Successfully compiled and remapped fpsflow-1.8.0-mc1.21.11-java25.jar.
  • Version migration guide** — Added VERSION_MIGRATION.md documenting short-term (Yarn) and long-term (Mojang mappings) strategies.

### Fixed
  • ModMenu integration was broken** — FPSFlowModMenuIntegration.createConfigScreen() returned null, causing a NullPointerException when a player clicked the Config button in ModMenu. The class now properly implements ModMenuFactory and returns a FPSFlowConfigScreen instance.
  • Duplicate translation keys in en_us.json and de_de.json** — The entity_lod and item_frame key blocks were duplicated, with the first occurrence silently overwritten by the second. All duplicate blocks have been merged into single, complete entries.
  • Missing translation keys** — Added entity_culling.painting_backface_culling, entity_culling.painting_backface_culling.tooltip, and nameplate_culling.enabled.tooltip to both language files. These keys were referenced by the config screen but had no translations, causing fallback to the raw key string.
  • Dead variable in settings.gradle.kts** — The mcVersion variable was read from Gradle properties but never used in the fabric-loom resolution strategy. Removed.

### Removed
  • i18n_pending_keys.txt and README_UI_KEYS.txt** — These development artifacts tracked missing translation keys. All keys are now present in both language files, so these files are no longer needed.
  • gradlew and gradle/wrapper/** — The Gradle wrapper is unnecessary when Gradle is installed system-wide. Users can build directly with gradle build.
  • Yarn OFFICIAL mapping mode** — Temporarily removed; Loom 1.17.3 requires explicit Yarn mappings.

[1.7.14] FPSFlow 1.7.14 by McAffe13 on Jun 24, 2026
Download
## [1.7.14]

### Fixed
  • Crash on launch on Minecraft 26.1.2 caused by lingering net/minecraft/class_#### (intermediary) references in the release artifact mapping/remap pipeline.
  • Mixin loading is now fail-soft (defaultRequire=0) so missing/renamed targets from mapping drift no longer hard-crash the mod.
  • Updated mixin Java compatibility level to JAVA_21 to match the project/toolchain.

[1.7.13] FPSFlow 1.7.13 by McAffe13 on Jun 23, 2026
Download

## [1.7.13]

### Fixed
  • Crash on launch on Minecraft 26.1.2 caused by lingering net/minecraft/class_#### (intermediary) references in the release artifact mapping/remap pipeline.

[1.7.12] FPSFlow 1.7.12 by McAffe13 on Jun 22, 2026
Download

## [1.7.12]

### Changed
  • Minecraft 1.21.11+ support** — The release now targets Minecraft 1.21.11 with matching Yarn mappings, Fabric Loader, and Fabric API dependency versions.

### Fixed
  • Launch crash due to intermediary net/minecraft/class_#### references** — The default release artifact now stays in the named runtime namespace expected by Minecraft 1.21.11, while Loom's intermediary remap is written as fpsflow-<version>-intermediary.jar. Maven publishing also uses the named jar artifact, preventing accidental uploads of a class_####-mapped build.
[1.7.11] FPSFlow 1.7.11 by McAffe13 on Jun 13, 2026
Download
## [1.7.11]

### Fixed
  • Item flickering on texture-pack servers** — When a server sends a resource pack, Minecraft reloads all textures and re-bakes item models asynchronously. The map item-frame throttle (ItemFrameEntityRendererMixin) kept cancelling updateRenderState calls during this window, leaving frames holding a stale render state that referenced invalidated texture handles — causing visible flickering. A new ResourcePackReloadTracker registers as a Fabric resource reload listener and activates a 60-tick cooldown after every reload; the throttle skips itself while the cooldown is active so render states are always refreshed immediately after a pack change. HUDCache is also reset on reload, so the hotbar dirty-flag system re-evaluates every slot on the first post-reload frame.
  • Hotbar cache miss for CustomModelData items** — itemStackHash only covered item type, count, damage, and enchantment presence. Texture-pack servers commonly assign the custom_model_data component to items to drive custom model selection; two visually different items sharing the same base data but different CustomModelData values produced identical hashes, causing incorrect "nothing changed" cache hits. The hash now includes CustomModelData.

[1.7.10] FPSFlow 1.7.10 by McAffe13 on Jun 13, 2026
Download
## [1.7.10]

### Fixed
  • Crash in ParticleManagerMixin on servers with many entities** — Minecraft 1.21.11 changed the value type of the internal particles map from Queue<Particle> to an internal collection class (class_11940) that does not implement Queue. The @Shadow field declaration and the per-tick particle count loop now use a raw Map with an instanceof Collection<?> check, which is compatible with both the old and new type.

[1.7.9] FPSFlow 1.7.9 by McAffe13 on Jun 13, 2026
Download
## [1.7.9]

### Fixed
  • Crash with Voxy / extreme camera clipping** — When an entity's eye position coincided exactly with the camera position, normalize() produced a NaN direction vector, causing Minecraft's DDA raycast to freeze or crash the render thread. rayCast() now returns false immediately when the squared distance between endpoints is below 1 × 10⁻⁶, and adds a secondary NaN guard after each passable-block step.

[1.7.8] FPSFlow 1.7.8 by McAffe13 on Jun 13, 2026
Download
## [1.7.8]

### Fixed
  • Update checker never detected new releases** — The Modrinth API URL contained unencoded [, ], and " characters (loaders=["fabric"]). Java's URI.create() rejects these with an IllegalArgumentException that was silently swallowed, so the HTTP request never executed. The URL now uses percent-encoded form (loaders=%5B%22fabric%22%5D).
  • Update notification could be missed on slow title screens** — The old implementation slept 10 seconds after the HTTP response, then checked mc.player. If the player hadn't joined a world yet, the notification was silently dropped. The notification is now stored and shown 3 seconds after the next world join via ClientPlayConnectionEvents.JOIN.
[1.7.7] FPSFlow 1.7.7 by McAffe13 on Jun 13, 2026
Download
## [1.7.7]

### Fixed
  • Crash when occlusion ray and entity eye position coincide** — If a camera and an entity eye position were at the same point (degenerate geometry, e.g. some Voxy LOD entities or extreme camera clipping), to.subtract(origin).normalize() produced a NaN direction vector. Minecraft's DDA raycast then diverged into undefined behaviour, freezing or crashing the render thread. rayCast() now short-circuits immediately when the squared distance between endpoints is below 1 × 10⁻⁶, and adds a secondary NaN guard after each passable-block step.

[1.7.6] FPSFlow 1.7.6 by McAffe13 on Jun 12, 2026
Download
## [1.7.6]

### Fixed
  • Entity type override cache now resets after a profile switch** — The per-entity-type culling override cache (entityTypeOverrides) was computed once and never invalidated. Switching profiles replaced the underlying map reference but left stale cached results for entity types that had already been seen, so the new profile's overrides were silently ignored until the game was restarted. The cache is now cleared automatically whenever the overrides map reference changes.
  • Config null-safety after manual JSON edits** — If a player manually edited fpsflow.json and set a section to null (e.g. "entityCulling": null), all reads from that section would throw a NullPointerException. All nested config objects are now replaced with their defaults if null after deserialization.
  • Config screen title and Done button now use the translation system** — The screen title was hardcoded as "FPSFlow Settings" and the Done button as "Done", bypassing the translation files. Both now use Text.translatable so German (and any future) translations apply correctly.

### Changed
  • Dead code removed** — WorldRendererMixin.java was never registered in fpsflow.mixins.json and had no effect at runtime. The file has been removed to avoid confusion.

[1.7.5] FPSFlow 1.7.5 by McAffe13 on Jun 12, 2026
Download
## [1.7.5]

### Fixed
  • Update checker now works for all current and future Minecraft versions** — The Modrinth API query previously used &featured=true, which caused new releases to be missed if they were not explicitly marked "featured" on the project page. An intermediate fix tried filtering by the exact running MC version, but that would have broken detection for newer MC versions (e.g. 26.1, 26.2) whose version strings do not match the old format. The query now fetches all Fabric releases with no version filter and compares only the FPSFlow version number, so updates are reliably detected regardless of which Minecraft version the mod is built for.

[1.7.5] FPSFlow 1.7.5 by McAffe13 on Jun 12, 2026
Download
## [1.7.5]

### Fixed
  • Update checker no longer misses unpublished-as-featured releases** — The Modrinth API query previously used &featured=true, so only versions explicitly marked "featured" on the project page were returned. A newly uploaded release that was not featured would never be detected. The query now filters by the current Minecraft version instead (&game_versions=["1.21.11"]), returning all releases for the running MC version regardless of featured status.

[1.7.4] FPSFlow 1.7.4 by McAffe13 on Jun 12, 2026
Download
## [1.7.4]

### Fixed
  • Entities no longer disappear when moving around corners** — The occlusion cache stored whether an entity was hidden, but did not track where the camera was when that raycast was taken. After the player moved, the old "occluded" result stayed in the cache for up to 10 ticks (0.5 s), making previously-hidden entities invisible even when now in plain sight. The cache now records the camera position at raycast time; if the camera has moved more than 1.5 blocks since then, the result is immediately discarded.
  • Entities within 8 blocks are never occlusion-culled** — The previous safety margin was only 4 blocks. At 5–8 blocks the raycast is susceptible to precision errors (slab edges, floor-level geometry, crawling/swimming camera clips). Raising the threshold to 8 blocks eliminates false-positive culling at close range without any meaningful performance cost.
  • Stale "occluded" result no longer used for nearby entities while async re-check is pending** — When a cache entry expires and the new check is queued asynchronously, entities within 24 blocks now show as visible while waiting for the result. Previously the old "hidden" answer was used unconditionally, so rapidly-moving close entities could wink out for several frames.
  • Entities behind invisible blocks (barrier, light, structure void) are now visible** — The occlusion raycast treated these invisible blocks as solid, hiding any entity behind a barrier wall or inside a light-block setup. The raycast now steps past visually-passable blocks and retries, so only genuinely solid geometry counts as occlusion.

[1.7.3] FPSFlow 1.7.3 by McAffe13 on Jun 12, 2026
Download
## [1.7.3]

### Fixed
  • Particle cap now applies to total live particles, not just new spawns per tick** — The maxParticles limit previously reset to zero every tick, allowing up to 4096 new particles to be added each tick regardless of how many were already alive. On high-particle servers (texture-pack servers, firework effects, etc.) this caused thousands of particles to accumulate and be ticked every frame. The cap is now seeded from the real live-particle count at the start of each tick, so the budget is correctly enforced.
  • Per-particle spawn overhead eliminated** — The adaptive distance multiplier (derived from the smoothed FPS chain) was previously recomputed on every individual particle spawn attempt. It is now cached once per tick, reducing overhead proportional to the server's particle spawn rate.

[1.7.2] FPSFlow 1.7.2 by McAffe13 on Jun 11, 2026
Download
## [1.7.2]

### Fixed
  • Crash on NO_RENDER particle tick eliminated** — Particles of type NO_RENDER (internal server-side particles) can have a null SpriteProvider. In MC 1.21.11 the resulting NullPointerException escaped the safeParticleForEach guard because the restructured particle-tick pipeline (method_74282 → class_11938) caused it to propagate past the narrowly-typed catch (NullPointerException). The catch now covers Exception broadly, and e.toString() is logged instead of e.getMessage() so exceptions with no message text are still reported correctly.

[1.7.1] FPSFlow 1.7.1 by McAffe13 on Jun 09, 2026
Download
## [1.7.1]

### Fixed
  • Reproducible builds** — Gradle no longer embeds per-build timestamps inside the JAR. The same source code now always produces byte-for-byte identical output, so the SHA512 hash is stable across builds. This allows the Modrinth launcher to reliably identify locally-built JARs and track playtime correctly.

[1.7.0] FPSFlow 1.7.0 by McAffe13 on Jun 09, 2026
Download
## [1.7.0]

### Fixed
  • Entity flicker in hubs and lobbies eliminated** — Entity LOD now has a single distance threshold (Balanced: 96 b) instead of two zones. Entities within that distance always render every frame; beyond it they render every other tick. The previous two-zone system started throttling as close as 40 blocks, causing clearly visible flicker on any lobby NPC or minecart. The threshold is now well beyond typical hub visibility range, so flicker is gone in practice.
  • Server-NPC and cosmetic entity flicker eliminated** — Entities whose nametag is set always-visible by the server (isCustomNameVisible) are now fully exempt from **both** Entity LOD throttling **and** entity culling (occlusion + distance). This covers plugin NPCs, display minecarts, cosmetic vehicles, and any other entity a server marks as permanently visible.
  • Nameplate LOD exemption widened** — Any entity within the configured nameplate range is now exempt from LOD even when nameplate culling is globally disabled.
  • Small entity occlusion false-positives reduced** — The occlusion raycast now targets the entity's **eye position** instead of the geometric AABB centre, preventing floor-level false positives for small entities (floating mob heads, armor stands, item displays).

### Added
  • Menu/loading FPS cap** — When the Minecraft window is focused but no world is loaded (title screen, loading screen, server selection), the frame rate is now capped (default 120 FPS). This stops the GPU from spinning at thousands of FPS on a static menu, freeing thermal headroom for faster texture and world loading. Configurable via the Background FPS tab in the ModMenu config screen.
  • Singleplayer Boost** — New toggle in the config screen (General tab). When enabled, the adaptive renderer uses more aggressive culling multipliers in singleplayer to free CPU for chunk generation threads.
  • Nameplate distance slider** — The nameplate culling range is now adjustable directly in the ModMenu config screen (LOD & Labels tab, 8–128 blocks).
  • Tooltips on every config button** — Each toggle and slider in the ModMenu config screen now shows a short description on hover.

[1.6.2] FPSFlow 1.6.2 by McAffe13 on Jun 08, 2026
Download
## [1.6.2]

### Changed
  • ModMenu config screen redesigned as tabbed UI** — the settings screen is now split into four clearly labelled tabs so all options are easy to find without scrolling:
  • General** — profile cycling, save custom profile, update checker, join optimizer, GUI optimizer, particle optimizer
  • Culling** — entity culling, block entity culling, occlusion culling, async occlusion, painting backface culling
  • LOD & Labels** — entity LOD toggle, nameplate culling toggle, medium/far LOD distance sliders, map frame throttle
  • Background FPS** — background FPS toggle, unfocused FPS cap slider, minimized FPS cap slider

### Fixed
  • Nameplate flicker caused by Entity LOD throttling** — The Entity LOD system skips rendering distant entities every 2nd or 3rd tick to reduce GPU load. Because EntityRenderer.hasLabel() is only called during an entity's render pass, a throttled frame also skipped the nameplate, causing it to flash on/off at the LOD rate. FPSFlow now exempts any entity that is within the configured nameplate culling distance from LOD throttling, so the label is always rendered when it should be visible.
  • Redundant camera distance recalculation removed** — EntityLabelMixin previously re-computed the camera-to-entity squared distance instead of using the value already calculated and passed in by EntityRenderer.hasLabel. The mixin now uses the provided parameter directly, eliminating a redundant Vec3d allocation per label per frame.
  • Hysteresis dead-band widened from 15 % to 20 %** — Entities hovering just outside the nameplate range now need to move further away before their label hides, giving an additional buffer against brief visibility changes near the boundary.
  • Dead server-override bookkeeping removed** — NameplateCullingManager previously maintained a SERVER_FORCED_VISIBILITY map that was never populated (no mixin called markServerForcedVisibility). The map was always empty, so its checks were no-ops. The code has been removed; the active server-override protection (isCustomNameVisible() bypass) is unchanged.

[1.6.1] FPSFlow 1.6.1 by McAffe13 on Jun 08, 2026
Download
## [1.6.1]

### Added
  • ModMenu config screen updated** — all features introduced in 1.6.0 are now accessible without editing JSON:
  • Nameplate Culling** toggle (was previously missing from the screen)
  • Background FPS Limit** toggle
  • Unfocused FPS cap** slider (0–480 FPS)
  • Minimized FPS cap** slider (0–480 FPS)
  • Painting Backface Culling** toggle
  • Unlimited FPS cap** — setting either Background FPS cap to 0 (leftmost slider position, or "unfocusedFpsCap": 0 / "minimizedFpsCap": 0 in the config JSON) disables the frame rate limit for that state entirely. The slider label shows Unlimited when at 0.

### Fixed
  • GameRendererMixin parameter signature corrected for MC 1.21.11 — the render() method now takes a RenderTickCounter instead of (float tickDelta, long startTime), which previously caused a crash on launch.
[1.6.0] FPSFlow 1.6.0 by McAffe13 on Jun 08, 2026
Download
## [1.6.0]

### Fixed
  • NPC nameplate flickering** — Entities whose nameplate visibility has been set to always-on by the server (isCustomNameVisible = true, typical for plugin NPC systems) are now exempted from distance culling entirely. Previously the mod fought against the server metadata update on every view-distance change, causing persistent flickering.
  • Hysteresis reset every 200 ticks removed** — The periodic full cache wipe in NameplateCullingManager was resetting the hysteresis dead-band, causing a brief nameplate flicker roughly every 10 seconds for entities near the culling threshold. WeakHashMap garbage-collects despawned entity entries automatically, so the manual wipe was never needed.

### Added
  • Background FPS limiter** — When the Minecraft window loses focus the frame rate is capped at a configurable limit (default: 60 FPS unfocused, 30 FPS minimised) via a post-frame sleep on the render thread. Inspired by Dynamic FPS. Caps are profile-aware: Quality 30/10, Balanced 60/30, Performance 10/3, Ultra Performance 5/2. Toggle via backgroundFps.enabled in the config.
  • Painting back-face culling** — Paintings are never visible from behind, so the renderer now skips them entirely when the camera is on the back side. Uses a dot-product normal check against the painting's facing direction. Controlled by entityCulling.paintingBackfaceCulling (default: true).
  • Tiered particle density LOD** — Instead of a hard allow/block cutoff there are now three distance zones: near (< midDistance): 100 % of particles; mid (midDistance → maxDistance): ~50 % via a stable position-based hash — no per-tick flickering; far (> maxDistance): 0 %. The new midDistance value is configurable in all four built-in profiles and custom profiles.
  • FPS-adaptive LOD tightening** — When the adaptive renderer detects low FPS (< 30 FPS: 0.7× multiplier, < 15 FPS: 0.5×), entity LOD distance thresholds shrink automatically. At 20 FPS the Balanced thresholds (40/80 blocks) behave like 28/56 blocks without requiring a manual profile switch.
[1.5.2] FPSFlow 1.5.2 by McAffe13 on Jun 08, 2026
Download
## [1.5.2]

### Fixed
  • Game crash from stale entity reference in particles** — During rapid world/minigame transitions, NO_RENDER particles could crash with a NullPointerException ($$10 is null) when the entity they referenced was removed before their first tick. FPSFlow now catches this in ParticleManager.tick(), preventing the crash and logging a rate-limited warning (at most once every 5 seconds).

[1.5.1] FPSFlow 1.5.1 by McAffe13 on Jun 08, 2026
Download
## [1.5.1]

### Fixed
  • Server-forced nameplate visibility** — nameplate culling now respects when a server forces nametag visibility via game rules or plugins
  • Added detection for showDeathMessages and nameplate override packets
  • Nameplate culling gracefully backs off when the server mandates visibility, avoiding visual conflicts
  • Prevents nametag flickering caused by client/server visibility disagreement

### Changed
  • Nameplate culling is now more robust in multiplayer scenarios with varied server configurations
  • Server-side nameplate settings are now honored alongside client-side distance culling
  • Entity LOD distances are now configurable, so medium/far render skip thresholds can be tuned per profile or saved custom profile
  • Default Balanced Entity LOD distances widened to 40 / 80 blocks for smoother distant entity rendering

[1.5.0] FPSFlow 1.5.0 by McAffe13 on Jun 08, 2026
Download
## [1.5.0]

### Fixed
  • Preserve player rendering in PvP views** — other players are no longer subject to entity LOD throttling, so F5 and multiplayer combat remain crisp.
  • Avoid duplicate async occlusion checks** — the entity culling queue now deduplicates requests and limits backlog growth, reducing spikey workload when many entities are near the visibility threshold.
  • Faster entity-type override lookups** — entity type override checks are cached to avoid repeated string allocations during render traversal.

### Added
  • Low-FPS adaptive culling** — entity and block entity culling distances are reduced automatically when FPS drops, so busy scenes become smoother.

### Changed
  • mod_version bumped to 1.5.0.

### Notes
  • These changes target intermittent hangs and render stalls, especially during view changes and busy entity scenes.

Download FPSFlow
Select game version
Select platform