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": nullin 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
- Install Fabric Loader for Minecraft 1.21.11
- Download and install Fabric API
- Drop the FPSFlow
.jarinto yourmods/folder - (Optional) Install ModMenu for the in-game settings screen
- 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
🎨 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
How to Install FPSFlow (Mod)
FPSFlow by McAffe13 is verified for Fabric across Minecraft versions 1.21.11, 26.1, 26.1.1, 26.1.2, 26.2 (latest release: 1.8.3, file size: 272 KB). Follow the steps below to install it safely from ModCraft.tv:
- Click the Download button above and select your Minecraft version (1.21.11, 26.1, 26.1.1, 26.1.2, 26.2) and platform (Fabric).
- Make sure you have the compatible loader or environment installed for Fabric.
- Move the downloaded FPSFlow file into your Minecraft
.minecraft/modsfolder and launch the game.
All Versions
+ Add Version| Name | Game version | Platforms | Published | Downloads | Actions |
|---|---|---|---|---|---|
| 3mo ago | 1 | ||||
| 3mo ago | 1 | ||||
| 3mo ago | 1 | ||||
| 3mo ago | 1 | ||||
| 3mo ago | 1 | ||||
| 3mo ago | 1 | ||||
| 3mo ago | 1 | ||||
| 3mo ago | 1 | ||||
| 4mo ago | 1 | ||||
| 4mo ago | 1 | ||||
| 4mo ago | 1 | ||||
| 5mo ago | 1 | ||||
| 5mo ago | 1 | ||||
| 5mo ago | 1 | ||||
| 5mo ago | 1 | ||||
| 5mo ago | 1 | ||||
| 5mo ago | 1 | ||||
| 5mo ago | 1 | ||||
| 5mo ago | 1 | ||||
| 5mo ago | 1 | ||||
| 5mo ago | 1 | ||||
| 5mo ago | 1 | ||||
| 5mo ago | 1 | ||||
| 5mo ago | 1 | ||||
| 5mo ago | 1 | ||||
| 5mo ago | 1 | ||||
| 5mo ago | 1 | ||||
| 5mo ago | 1 | ||||
| 5mo ago | 1 | ||||
| 5mo ago | 1 | ||||
| 5mo ago | 1 | ||||
| 5mo ago | 1 | ||||
| 5mo ago | 1 | ||||
| 5mo ago | 1 | ||||
| 5mo ago | 1 | ||||
| 5mo ago | 1 |
### 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_versionupdated from1.8.3to1.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_versionupdated from1.8.2to1.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_versionupdated from1.8.3to1.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_versionupdated from1.8.2to1.8.3.
### 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.1for Minecraft,>=0.155.1for Fabric API) infabric.mod.json. A singlegradle buildModernproduces one JAR that works on both Minecraft 26.1.2 and 26.2 without separate artifacts. - Build system improvements** — Added
minecraft_depandfabric_depproperties tobuild.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.2prevented the mod from loading on 26.1.2. The runtime dependency is now>=26.1, accepting all 26.x releases.
### 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.1for Minecraft,>=0.155.1for Fabric API) infabric.mod.json. A singlegradle buildModernproduces one JAR that works on both Minecraft 26.1.2 and 26.2 without separate artifacts. - Build system improvements** — Added
minecraft_depandfabric_depproperties tobuild.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.2prevented the mod from loading on 26.1.2. The runtime dependency is now>=26.1, accepting all 26.x releases.
### 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 fromDirection.values()in hot code paths by providing cached references. Every call toEnum.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
@seereferences andInspired bycomments linking to the upstream Lithium repository.
### Changed
- Version bumped to 1.8.1** — Gradle property
mod_versionupdated from1.8to1.8.1. - OptimizationManager module list extended** — New lightweight utility modules are registered on startup (no tick overhead, no Minecraft class dependencies).
### Fixed
- None.
### 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 fromDirection.values()in hot code paths by providing cached references. Every call toEnum.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
@seereferences andInspired bycomments linking to the upstream Lithium repository.
### Changed
- Version bumped to 1.8.1** — Gradle property
mod_versionupdated from1.8to1.8.1. - OptimizationManager module list extended** — New lightweight utility modules are registered on startup (no tick overhead, no Minecraft class dependencies).
### Fixed
- None.
### Changed
- Configurable Java target** — The Java version is no longer hardcoded in
build.gradle.kts. It is now read from thejava_versionproperty ingradle.properties(default:21). Setjava_version=25to build with Java 25. The Mixin compatibility level (JAVA_21/JAVA_25) and theremapJarclassifier (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
targetJavaVersionswitch 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** — Theminecraft_version_java25,yarn_mappings_java25,loader_version_java25,fabric_version_java25, andmodmenu_version_java25properties 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.comtohttps://maven.terraformersmc.comfor correct dependency resolution. - Improved
fabric.mod.json** — Description updated to match the Modrinth page;fabricloaderandfabric-apidependency minimums tightened to>=0.19.3and>=0.141.4respectively. - Updated
how_to_build.md** — Rewritten for the single configurable Java build path; references to the removedbuildJava21/buildJava25tasks 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) to0.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.mddocumenting short-term (Yarn) and long-term (Mojang mappings) strategies.
### Fixed
- ModMenu integration was broken** —
FPSFlowModMenuIntegration.createConfigScreen()returnednull, causing aNullPointerExceptionwhen a player clicked the Config button in ModMenu. The class now properly implementsModMenuFactoryand returns aFPSFlowConfigScreeninstance. - Duplicate translation keys in
en_us.jsonandde_de.json** — Theentity_lodanditem_framekey 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.pai
### Changed
- Configurable Java target** — The Java version is no longer hardcoded in
build.gradle.kts. It is now read from thejava_versionproperty ingradle.properties(default:21). Setjava_version=25to build with Java 25. The Mixin compatibility level (JAVA_21/JAVA_25) and theremapJarclassifier (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
targetJavaVersionswitch 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** — Theminecraft_version_java25,yarn_mappings_java25,loader_version_java25,fabric_version_java25, andmodmenu_version_java25properties 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.comtohttps://maven.terraformersmc.comfor correct dependency resolution. - Improved
fabric.mod.json** — Description updated to match the Modrinth page;fabricloaderandfabric-apidependency minimums tightened to>=0.19.3and>=0.141.4respectively. - Updated
how_to_build.md** — Rewritten for the single configurable Java build path; references to the removedbuildJava21/buildJava25tasks 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) to0.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.mddocumenting short-term (Yarn) and long-term (Mojang mappings) strategies.
### Fixed
- ModMenu integration was broken** —
FPSFlowModMenuIntegration.createConfigScreen()returnednull, causing aNullPointerExceptionwhen a player clicked the Config button in ModMenu. The class now properly implementsModMenuFactoryand returns aFPSFlowConfigScreeninstance. - Duplicate translation keys in
en_us.jsonandde_de.json** — Theentity_lodanditem_framekey 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.pai
### 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_21to match the project/toolchain.
## [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]
### 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 asfpsflow-<version>-intermediary.jar. Maven publishing also uses the namedjarartifact, preventing accidental uploads of aclass_####-mapped build.
### 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 cancellingupdateRenderStatecalls during this window, leaving frames holding a stale render state that referenced invalidated texture handles — causing visible flickering. A newResourcePackReloadTrackerregisters 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.HUDCacheis also reset on reload, so the hotbar dirty-flag system re-evaluates every slot on the first post-reload frame. - Hotbar cache miss for
CustomModelDataitems** —itemStackHashonly covered item type, count, damage, and enchantment presence. Texture-pack servers commonly assign thecustom_model_datacomponent to items to drive custom model selection; two visually different items sharing the same base data but differentCustomModelDatavalues produced identical hashes, causing incorrect "nothing changed" cache hits. The hash now includesCustomModelData.
### Fixed
- Crash in ParticleManagerMixin on servers with many entities** — Minecraft 1.21.11 changed the value type of the internal
particlesmap fromQueue<Particle>to an internal collection class (class_11940) that does not implementQueue. The@Shadowfield declaration and the per-tick particle count loop now use a rawMapwith aninstanceof Collection<?>check, which is compatible with both the old and new type.
### 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 returnsfalseimmediately when the squared distance between endpoints is below 1 × 10⁻⁶, and adds a secondary NaN guard after each passable-block step.
### Fixed
- Update checker never detected new releases** — The Modrinth API URL contained unencoded
[,], and"characters (loaders=["fabric"]). Java'sURI.create()rejects these with anIllegalArgumentExceptionthat 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 viaClientPlayConnectionEvents.JOIN.
