createtickcontroller-1.21.1-1.3.0.jar
Curse Maven Snippet
What's new
# Create Tick Controller 1.3.0
The biggest update so far, on **both sides of the wire** β and the first one shipped with **field-measured numbers**, profiled with spark on a production-scale Create base (NeoForge 1.21.1, Sodium 0.8, Iris, Flywheel).
## π Measured results (real base, spark-profiled)
| What | Before | After |
|---|---|---|
| **FPS in the base** | **6β10 FPS** | **60+ FPS** |
| Drawing Create machines (render thread) | 25.7% of the frame | **1.1%** |
| Full block entity render dispatcher | 24.1% | 8.0% (rest = chests/signs, optional slider) |
| Sound handling | ~16% of the frame | ~8% (remainder is genuinely audible din, capped) |
| Create client tick cost | reference | β71% at defaults, β93% on Potato (model) |
How these numbers happened is below β every claim traces to a profiler capture, and every option's tooltip in game now carries its measured gain.
## ποΈ One-click quality profiles β NEW
A single selector sets **every** client optimization at once: in Sodium's Video Settings (top of the "Tick Reduction" page) or via `/ctcclient quality <profile>`.
| Profile | Tick bands | Create render | Other BE render | For |
|---|---|---|---|---|
| **Ultra** | 48 / 96 / Γ·2 | 64 (vanilla) | 64 (vanilla) | max visuals, only lossless optimizations |
| **Normal** | 32 / 64 / Γ·4 | 48 | 64 | the defaults β imperceptible in normal play |
| **Light** | 24 / 48 / Γ·8 | 32 | 48 | big bases, visible only if you look for it |
| **Potato** | 4 / 16 / Γ·16 | 16 | 24 | FPS above all β the 6β60 FPS configuration |
All profiles keep behind-camera culling and sound culling on (they're lossless). The selector shows "Custom" when you've hand-tuned the sliders.
## π₯οΈ Client-side optimization suite β NEW
Every Create block entity also ticks and renders on the **client**. In a big base the F3 profiler showed `tick` eating 75% of the frame while the renderer starved β that was the starting point. Five independent systems, all in `createtickcontroller-client.toml`, the Sodium page, and `/ctcclient`:
### Distance tick reduction
Create block entities tick at full rate near the camera, every 2nd tick in the mid band, every Nth beyond. The loaded area grows with the *square* of distance, so ~97% of machinery sits beyond 32 blocks: the defaults remove **~71% of the Create client tick cost**, Potato ~93%. Kinetic rotation is computed at render time and stays perfectly smooth at any distance β this is why the reduction is invisible for shafts, wheels and fans. A per-position phase offset spreads remaining work so the saving never bunches into a stutter. Ponder scenes, contraptions (entities) and ambient sound range (with full-rate β₯ 32) are untouched.
### Create BE render distance β the 6β60 FPS lever
Vanilla draws every visible block entity's dynamic renderer out to 64 blocks; drawing machines was **25.7% of the frame**, the single biggest cost. This slider culls Create renderers beyond the chosen radius on both the vanilla and Sodium paths β cost falls with the radius squared (32 draws ~1/4 as many, 8 draws ~1/64). **Field-measured: 6β10 FPS at 64 β 60 FPS at 8.** With Flywheel's backend on, instanced machine bodies stay visible at any distance β only far dynamic details (belt items, dial needles) disappear, which is why the base still looks intact. With `/flywheel backend off`, whole machines vanish beyond the radius β keep the backend on.
### Behind-camera culling
Sodium culls whole 16Β³ sections, but standing *inside* a machine hall the surrounding sections stay visible while half their machines are behind you. This culls block entities whose **entire render bounding box** is behind the view plane β long machines like belts are tested by their full box (a controller behind you with the belt extending ahead keeps rendering), so nothing visible ever disappears. Automatically disabled during Iris shadow passes (reflection-detected, no dependency) so shader shadows stay intact. **Measured: combined with the render distance, near-machine rendering went from 19.6% to 1.1% of the frame.**
### Other-BE render distance
The same culling for non-Create block entities β vanilla chests, signs, banners, Sophisticated Storage containers (**measured ~4% of the frame combined**). Off by default (64): unlike Create machines these are entirely renderer-drawn, so beyond the radius they visibly disappear. 24β32 is the reasonable aggressive setting.
### Sound distance + spam culling
Decompiling vanilla revealed the hidden cost: `SoundEngine.play` **blocks the render thread on a CompletableFuture** to create an audio channel for *every* sound received β and vanilla never culls by distance, while servers broadcast sounds to 64 blocks that are audible at 16. **Measured: ~16% of the frame in a loud factory.** Three filters, all lossless or inaudible: positional sounds beyond `48 Γ max(1, volume)` blocks are dropped at the packet handler (3Γ the audible radius); at most 6 starts of the *same* sound per tick; at most 16 total server-sound starts per tick. **Measured after: ~8%**, the remainder being genuinely audible din. Client-local sounds (own footsteps, UI, music) untouched.
### Controls
- **Sodium Video Settings** β "Tick Reduction" page with the profile selector, 4 sliders and 2 toggles, every tooltip carrying its measured gain (localized en/fr). Sodium 0.8+ via the official Config API, Sodium 0.6 via an optional hook β no added dependency; exactly one activates.
- **`/ctcclient`** β status, `quality <ultra|normal|light|potato>`, tick presets, `render <8-64>`, `set <full> <reduced> <divisor>`. Works on any server (settings are local), persists to the client config.
- **Mods list β Config** β NeoForge's built-in config screen.
## π Server-side: exponential backoff for jammed logistics
Generalizes the Sophisticated Storage hopper backoff (1.1.1) to every remaining every-tick retry loop. Shared principle: each attempt that moves nothing doubles the wait (2, 4, 8β¦ ticks, capped); the first success or relevant change resets instantly. **Working blocks are never slowed β only ones stuck in a retry loop.** Config section `backoff`, all on by default.
- **Create belts** (cap 2s): a backed-up belt ran its complete per-item transport loop every tick β position bookkeeping, a block-state lookup per item, an end-of-belt insertion attempt β with no early-out. Skips when a tick changes nothing; wakes instantly on insertion, machine access (press/deployer/fan) or speed change; a freed container is polled within the cap.
- **Create funnels** (cap 2s): Create only starts the extraction cooldown on *success* β a funnel facing a jammed belt re-ran its whole activation path every tick. Failed attempts now write a doubling delay into the funnel's own cooldown; redstone resets instantly.
- **Create factory gauge panels** (cap 2s): every gauge polls the logistics network **every tick** (stock summary, promise queue, link state) even while satisfied, promise-covered, redstone-stopped or waiting on unloaded chunks β a wall of gauges multiplies that by hundreds. Two hard guarantees: panels counting down to a request are never slowed, and restocker promise ages keep ticking so expiry stays exact.
- **Vanilla hoppers** (cap 1s): vanilla repeats a full transfer scan (every hopper slot Γ every container slot + an item-entity sweep) **every tick, forever** when blocked. Hopper-to-hopper wake-ups preserved; hopper-clock builders can turn it off.
These buy **server TPS headroom** rather than FPS β the win scales with how much of the factory is idle-but-polling at any moment (in mature bases: most of it). Bonus for clients: fewer belt `notifyUpdate` syncs, which showed as ~4% of client frame time in packet handling.
## π¬ The method (reproduce it on your base)
Every optimization in this release came from a spark client profile: `/sparkc profiler start --timeout 30` in your base, then read the render-thread tree. The built-in A/B test takes ten seconds and no restart: `/ctcclient quality ultra` β note FPS β `/ctcclient quality potato` β compare. Findings from our reference base that were *not* this mod's job, in case they apply to you: animated GeckoLib gun icons (Scorched Guns) cost 11% of the frame just sitting in the hotbar (~30% with an inventory of them open β install GeckolibBetterFPS and keep guns out of visible slots), and HUD overlay mods can eat several percent.
## Upgrade notes
- Drop-in replacement for 1.1.x / unreleased 1.2.0 β no migration; new config sections (`backoff` server-side, `clientTicks` client-side) generate with safe defaults. The client half only activates for players who install the mod client-side; server-only installs get the backoffs.
- Defaults are the "Normal" profile: imperceptible. Tell players about `/ctcclient quality potato` β that's the 6β60 FPS setting.
- All mixin targets verified against Create 6.0.8 bytecode, vanilla 1.21.1 mojmap, and Sodium 0.6.13/0.8.12-13. Field-tested on a production-scale base with Sodium 0.8 + Iris + Flywheel.
- If a specific machine misbehaves server-side, each backoff has its own toggle in `backoff.*` β disable just that one and report it.
This mod has no additional files

