promotional bannermobile promotional banner

Argon-Performance (Neoforge)

Lite structure-layout optimizer and frame cadence for Minecraft 26.x Neoforge.
Back to Files

argon-0.2.4-Neoforge-26.3

File nameargon-0.2.4.jar
Uploaded
Oct 2, 2026
Downloads
22
Size
47.8 KB
Mod Loaders
NeoForge
File ID
9037381
Type
R
Release
Supported game versions
  • 26.3

Curse Maven Snippet

NeoForge

implementation "curse.maven:argon-performance-neoforge-1714928:9037381"

Learn more about Curse Maven

What's new

Changelog

0.2.4

Performance

  • BoxOctree nodes hold their bounds as doubles instead of keeping an AABB, so a subdivision no longer allocates an AABB per octant. boundaryContains uses the same half-open comparison as AABB.contains
  • Octree leaves start at four boxes and grow by doubling instead of reserving sixteen up front and growing linearly, which cuts allocation for the many leaves that hold only a few pieces
  • TrojanVoxelShape shares one placeholder DiscreteVoxelShape across instances instead of building one per structure start

Fixed

  • The octree no longer answers differently depending on how full it is. A piece that never reaches the region the tree was built around was kept in the root's leaf array until the node subdivided, and a subdivision then pushed it into no octant, so the same piece was found before the split and lost after it. addBox now refuses a box that does not reach the node it is offered to, so the answer is the same at any size
  • The jigsaw @Local captures are named. targetBB in tryPlacingChildren is the fourth BoundingBox local in scope, and the implicit form was ambiguous against sourceBB, hackBox, and rawTargetBB. A mixin whose capture is ambiguous is dropped at apply time with the rest of the mixins, which would have left the piece-recording wrap unwrapped
  • LoaderNames.present catches LinkageError as well as ClassNotFoundException, so a mod whose class is present but fails to link is reported as absent instead of propagating out of the brand-line lookup
  • ArgonProfiler reports OCTREE_CHECKS_SAVED as a real counter, and ArgonDebugLines.isBrandLine recognises a full Argon brand line

Frame cadence

  • FrameCadence.release hands the clock back when Max Framerate returns to a cap vanilla keeps. Without it the interval cache still held the cap Argon last paced, so re-enabling that same cap compared against a clock from however long ago the setting was off and skipped the wait. CadenceMixin calls it on the uncapped path

Build

  • JUnit 5 is wired in, and argon.mainClasses and argon.mainResources are passed to the test JVM so tests read the compiled output rather than a re-derived path

  • MixinInjectionTest reads mixin annotations as CLASS-retained data and resolves handler @Local parameters against the target method's local variable table, so it validates the capture that MixinExtras will actually perform

  • The test logging syntax in build.gradle no longer uses the removed assignment form

  • Windows wrapper, license packed in the jar, NeoForge metadata displayTest

Every layout change in this entry was checked against the vanilla source of JigsawPlacement, JigsawBlock, BooleanOp, and Shapes, and the octree is verified candidate-for-candidate against vanilla's own free-space algebra.

  • JigsawBlock.canAttach now keeps vanilla's target.name() == null guard. A null child name means the connector matches anything. Vanilla templates never produce one because JigsawBlockInfo.parse defaults the name, but a mod that builds a JigsawBlockInfo directly does, and the name-first matcher used to reject those
  • Removed the rigid-child skip. It skipped a child when the parent connector faced outside the structure box or into a placed piece, on the claim that vanilla would reject it. The connector is only recorded when it sits inside the parent piece, and the parent piece is already in the octree, so the guard was true for every recorded connector and it dropped rigid children that vanilla places. Those candidates run vanilla now
  • Removed the tried-element identity list. In 26.3 the wrapped Lists.newArrayList is the candidate piece list, which is iterated but never contains-checked, so the identity map was written on every add and read never. Deduplicating it was rejected because dropping a repeated candidate changes which pieces are tried and therefore the random sequence
  • The octree query is named for the answer it gives. hasRoomFor is the accept case, and the overlap wrap stands in for the reject side of joinIsNotEmpty, so both agree with vanilla's !joinIsNotEmpty(free, deflated, ONLY_SECOND)
  • JigsawPlacement$Placer.tryPlacingChildren takes PoolElementStructurePiece, MutableObject, depth, the rigid flag, LevelHeightAccessor, RandomState, PoolAliasLookup, and LiquidSettings. The overlap and piece-recording wraps target that descriptor and capture the candidate piece BoundingBox as a local
  • A child attached inside its own parent piece runs against vanilla's per-piece sourceFree shape, which the octree does not model. Those calls are left alone, and pieces placed that way are always inside the parent box, which is in the octree, so the carrier path stays correct without them

Layout

  • Piece overlap uses a box octree. A candidate is tested against nearby pieces on the 0.25-deflated box, and the accept or reject answer matches vanilla AABB checks
  • Piece bounds are six doubles in one flat array per leaf, not AABB objects, so a scan walks contiguous memory and never dereferences a box. The duplicate check compares those doubles instead of boxing them through AABB.equals
  • An octant is only created once some piece reaches it. Empty octants cost no object and no boundary test per query, which is the common case when pieces are small against a large structure box
  • Inserting a piece and testing one allocate nothing. The AABB.of copy and the 0.25 deflate are computed straight off the piece BoundingBox
  • Octree nodes do not split when a half-extent is under 2 blocks
  • Accepted pieces are recorded on Shapes.joinUnoptimized (require = 1), the 26.3 accept path, and the carrier is returned so the octree keeps the same contents the VoxelShape would have carried
  • JigsawBlock.canAttach uses Argon's name-first matcher. Vanilla reads the front and the top out of two properties per block; both live in ORIENTATION, so one lookup per block yields both
  • Layout counters are LongAdder, not AtomicLong, because they are bumped once per candidate piece and worldgen runs that loop across chunk threads

Frame cadence

  • The interval is cached until Max Framerate changes, and the clock advances to the target time so the cap does not drift. A cap change or a stall longer than one frame resets it
  • Caps of 260 and above, and non-positive caps, stay on vanilla FramerateLimiter
  • The stretch that is parked and the stretch that is spun is no longer a fixed 1 ms. Park granularity belongs to the kernel and the scheduler, so a window that is too small means the park lands late and the frame goes out late, and one that is too large burns a core on the same deadline. The window starts at 1 ms, grows by however late a park came back, gives half of any unused stretch back, stays between 20 µs and 1 ms, and resets when the cap changes
  • The busy-spin is skipped if the park already woke at or past the target, and a spurious wakeup re-parks instead of spinning through the remaining interval

Debug line

  • F3 left column shows Argon-NeoForge (version). Colors stay aqua and green
  • F3 no longer stacks the brand line on every extractLines batch. Extra brand lines are stripped and only one is written per overlay pass
  • 26.3 calls extractLines more than once per frame and only the left batch can use the line, so the text is built when a brand slot is actually filled rather than on every call
  • The layout counters sit still across most frames, so the line is cached until one of them moves. The text and the counts it was built from are held together so a line can never disagree with its own numbers
  • Loader brand is resolved once at class init
  • The line is client-only

Build

  • BitwiseMath is now argon.util.Arithmetic. It is Argon's own integer helper set: ordering goes through Integer.compare, and the mask, branchless select, and floor and ceiling division helpers are documented against the overflow that subtract-then-shift runs into
  • The -Xlint:all -Werror build is clean, and build.gradle now passes both to every JavaCompile, so a warning is a build failure rather than something to notice later. The source carries no @SuppressWarnings and pulls in no MutableObject, so the deprecated commons-lang3 getter is out of the picture too
  • Source files end with a newline and carry no tabs or trailing whitespace
  • Homepage, sources, and issues point at https://github.com/hasaanamerravid-source/Argon-Performance-NeoForge

This mod has no additional files