Skip to content

Arcadia Patch Create 1.4.3

Latest

Choose a tag to compare

@Blushister Blushister released this 05 Aug 10:55
· 7 commits to main since this release

Performance release targeting the hotspots measured on the production servers, plus a fix that made adaptive throttling inoperative.

Requires Create 6.0.10. Every patch is validated against an exact bytecode fingerprint and disables itself on any other build.

Performance

CreateHeatJS metadata cache — the addon rebuilt a recipe context on every basin heat check, and each context walked the entire recipe list to recover one identifier. This ran even with no custom heat provider configured.

Measured on server 1: 1.907 ms/tick → 0.002 ms/tick. Basin recipe handling dropped by 99%, mixers by 98%, presses by 89%. Only immutable recipe identifiers are cached; a fresh context is still built for every check, so predicates and custom heat levels are unaffected.

Mechanical Arm simulation reuse — while searching for an item, an arm probes every slot of every input and simulates insertion against every output for each one. Identical stacks ran the identical simulation repeatedly. Results are now memoized for the duration of a single search pass. simulateInsertion mutates nothing, so this is strictly equivalent.

Item Drain lookup reuse — Create resolved the same emptying recipe twice per processing call. The first positive result is reused for the simulation that immediately follows. Measured: 0.227 → 0.135 ms/tick.

Fluid pipes — the idle fast-path no longer inspects Create state reflectively, which cost up to 0.272 ms/tick on its own. The connection map moved from an IdentityHashMap to an EnumMap: at most six entries, iterated four times per pipe per tick, and profiling attributed 0.218 ms/tick to that iterator alone.

Belt fast-path anchor — moved after Create's own housekeeping. Injected at HEAD it could leave a stale lazyClientItem behind or miss the synchronization of an inversion on an empty belt.

Fixes

Adaptive throttling never engaged. The MSPT accessor was looked up under a single hardcoded name taken from the compile classpath, but the deployed server is remapped to official names. The lookup failed silently and the reading was always zero, so the 35 / 45 / 55 ms steps were never crossed — a server measured at 33.7 ms average and 42 ms at the 95th percentile stayed on interval 1.

Chute throttle removed. It cancelled the input probe before re-reading the capability, delaying a valid transfer by one to four ticks, and never targeted the real hotspot. Removing it costs nothing: chute tick time is unchanged at 0.86 ms/tick.

Administration

The panel moved to a six-row layout with modules grouped by family, and gained a health banner: current MSPT against the 50 ms budget, throttle mode and interval, and how many modules are effective versus how many had their target rejected. A patch disabled by a fingerprint mismatch was previously invisible without running a debug dump.

Each module now reports configured, available and effective as three distinct states, across the panel, the commands and the debug dump.

New: /arcadiapatchcreate arm status|enabled <bool>.

Still server-side only — vanilla menu type, no custom screen or packet, works the same in single player.

Notes

Measurements come from two 120-second Spark profiles taken four days apart on the same production server under comparable load. Observable was running during both captures, which inflates absolute values equally on each side; the comparisons hold.

Create's own block entity tick time dropped by 1.405 ms/tick overall. Note that on the observed server this gain was offset by unrelated content growth over the same period.

Build verification: ./gradlew.bat clean build, plus a dedicated server startup with and without CreateHeatJS installed.