Skip to content

CRASHES MY RUNELITE#29

Open
raysdigitalfootprint wants to merge 698 commits into
Runemoro:masterfrom
Skretzo:master
Open

CRASHES MY RUNELITE#29
raysdigitalfootprint wants to merge 698 commits into
Runemoro:masterfrom
Skretzo:master

Conversation

@raysdigitalfootprint

Copy link
Copy Markdown

For some reason when I set a path it will randomly increase my RAM useage to 1.5gb. Even if i clear the path and log out it fills my ram to 1.5gb and my frames drop to 1fps. All other apps still working fine. This happens randomly, maybe 1 in 3 paths I set. Paths can be simple, no obsticles ect and short path.

not sure if it matters;
PC 16gb ddr4 ram, i7 10700k, 3070ti, 2t nvme ssd

@Skretzo Skretzo deleted the branch Runemoro:master June 17, 2022 21:25
@Skretzo Skretzo deleted the master branch June 17, 2022 21:25
@Skretzo Skretzo deleted the branch Runemoro:master July 14, 2022 14:49
@Skretzo Skretzo deleted the branch Runemoro:master August 12, 2022 11:03
@Skretzo Skretzo deleted the branch Runemoro:master September 1, 2022 16:02
@Skretzo Skretzo deleted the branch Runemoro:master September 1, 2022 16:09
@Skretzo Skretzo deleted the branch Runemoro:master September 27, 2022 22:32
@Skretzo Skretzo deleted the branch Runemoro:master December 17, 2022 01:19
@Skretzo Skretzo deleted the branch Runemoro:master January 9, 2023 00:11
@Skretzo Skretzo deleted the branch Runemoro:master January 21, 2023 02:05
@Skretzo Skretzo deleted the branch Runemoro:master September 29, 2024 17:42
@Skretzo Skretzo deleted the branch Runemoro:master September 29, 2024 21:22
@Skretzo Skretzo deleted the branch Runemoro:master October 4, 2024 21:42
@Skretzo Skretzo deleted the branch Runemoro:master October 8, 2024 23:31
@Skretzo Skretzo deleted the branch Runemoro:master October 9, 2024 00:18
@Skretzo Skretzo deleted the branch Runemoro:master October 27, 2024 21:55
@Skretzo Skretzo deleted the branch Runemoro:master October 29, 2024 01:27
@Skretzo Skretzo deleted the branch Runemoro:master August 28, 2025 14:29
Skretzo and others added 12 commits September 13, 2025 02:13
7500 coins for no wilderness diary or only easy diary, 6000 coins for medium diary, 3750 coins for hard diary, and free for elite diary
The south rocks near the magical rocks mine cannot be used to go from east to west, because `You could climb down here, but it is too uneven to climb up.`
The dungeon access is assumed to be almost completion of the Zogre Flesh Eaters quest
pajlada and others added 30 commits May 11, 2026 02:32
* Added check for region override

* Added regional overrides for transports falling outside of the region locks.

* Added tests for the seasonal region override behaviour

* Updated regions and region overrides
* Fix costConsumableTeleportationItems not applied to Quetzal whistle (#468)

* Prevent labels from being drawn at the same spot

* Now showing quantities to pick up
* disable large doors in Castle Wars due to world distinction issues

* Remove the lines to be safe
* Add lumber yard fence
* Added conditionals for teleports on a sailing ship to display a message to embark to resume pathfinding

* Added a teleport filter when embarked
* Add region labels to all league teleport seasonal transports
Fixes #476
x

* Fix Evil Eye teleport coordinates for dungeon bosses
Fixes #478
* Store pathfinder nodes in parallel primitive arrays

Replace the per-tile Node/TransportNode objects with a structure-of-arrays store (NodeGraph) indexed by int ids, plus primitive int frontier structures (IntDeque, IntMinHeap). Heavy searches explore hundreds of thousands of tiles, and the old design allocated one object per tile. Packing the fields into shared arrays collapses that to a handful of arrays and removes the per-object header overhead, while releasing them once the search ends.

* Reuse empty requirement collections and skill arrays in transports

Most transports declare no quests, var requirements, or skill levels, yet each one allocated its own HashSet (plus backing HashMap) and a 26-int skill array. Default these to shared immutable empties and only allocate when a real requirement is present. Measured against the loaded data this removes ~80k objects (~22.6k empty sets and ~13.3k all-zero skill arrays) from the static transport graph.

* Intern shared transport requirement objects at load

Transports built from the wiki data very commonly share identical item and var requirements (every fairy ring needs the same staff; many shortcuts share one diary varbit), yet each transport held its own copy. A post-load pass with local interning pools now shares equal TransportItems and VarRequirement instances (and the int[] arrays inside item requirements). Measured on the full dataset this collapses ~4,900 requirement wrapper objects to ~470 distinct, plus the reclaimed backing arrays, with no search-time cost (interning runs once at load).

* Flatten collision map regions into shared arrays

Each of the ~2,664 collision regions held its own FlagMap + BitSet + long[] (~3 objects per region, ~8k total). Pack every region's bits into one shared long[] with a per-region word-offset table, read with the same word/bit math BitSet used. SplitFlagMap already routes a coordinate to the region that contains it, so FlagMap's per-region bounds checks were redundant and are dropped. Removes ~8k objects on the hottest read path with no behaviour change - the exact-path-length pathfinding tests pass unchanged - and slightly better cache locality.

* Open-address PrimitiveIntHashMap to drop per-entry nodes

Replace the IntNode-per-entry bucket design with two parallel arrays (int[] keys + Object[] values), using a non-null value as the occupancy marker so an int key of 0 needs no sentinel. The transport lookup map is the only user, and the two packed maps held one IntNode per origin tile (~11.5k each), so this removes ~23k node objects plus their bucket arrays at rest and improves lookup cache locality. The full PrimitiveIntHashMap test contract (collection-append on duplicate keys, edge keys, zero load factor, rehash, fullness) is preserved.

* Store transports per origin as flat arrays instead of Sets

TransportAvailability kept a HashSet per origin tile (shared between a boxed-key Map and the primitive packed map), one of the larger remaining at-rest object sources. Store the transports as flat Transport[] arrays instead; the per-origin HashSet/HashMap wrappers are now used only transiently while building and are not retained. Two views are kept, sharing their arrays: the pathfinding map (POH origin tiles preserved so a search from a POH tile still resolves) and the coarse display map used by overlays (POH origins collapsed to the canonical landing tile). This removes the per-origin Set/HashMap/HashMap-node layer from both availabilities.

* Flatten allTransports to a Transport array

PathfinderConfig.allTransports was a Map<Integer, Set<Transport>> retained for the plugin's lifetime - one HashSet (plus its HashMap, membership nodes, and a boxed Integer key) per origin tile, which profiling showed was roughly half of the remaining at-rest objects. But refreshTransports only iterates the transports flat (it re-derives each origin from the transport), and remapPohDestinations only touches values, so the map structure is unnecessary. Flatten it to a Transport[] at construction and let the loader's map be garbage collected. The loader still returns the map, which the tests rely on.

* Store transport quest requirements as an EnumSet

Quest requirements are keyed on the Quest enum, so a non-empty set is now a compact EnumSet (a single bitmask object) instead of a HashSet plus its backing HashMap and per-element nodes. Most transports have no quests and keep the shared empty set; the ~3.4k that do shed ~3 objects each. EnumSet is a Set<Quest>, so all callers and tests are unchanged.

* Deduplicate transport requirement sets at load

internRequirements already shared individual VarRequirement and TransportItems instances, but each transport still held its own Set wrapper for its var and quest requirements. Identical requirements are very common across the permuted transport rows, so intern the requirement Sets themselves too: transports with equal var/quest requirements now share one read-only Set (and EnumSet) instance instead of a per-transport copy. Runs in the existing post-load interning pass, so transport allocation order is unchanged.

* Intern transport display strings; consolidate interning pools

Extend the load-time interning to a transport's displayInfo/objectInfo labels, deduplicating strings repeated across transport rows along with their char[]/byte[] backing. The growing set of per-call dedup pools is consolidated behind a LoadInterner holder so internRequirements takes a single argument.

* Drop volatile from NodeGraph arrays to restore pathfinding speed

The structure-of-arrays refactor cut memory as intended, but marking the
six per-node arrays volatile made every accessor re-read the array
reference and blocked the JIT from caching the base or eliminating bounds
checks. The hot loop touches these hundreds of times per node, slowing a
143-step search from ~176ms to ~294ms (~1.6x).

The arrays don't need to be volatile: the partial path is published to the
render thread by the single volatile Pathfinder.bestLastNode handoff, and
the walk methods already snapshot references into locals and tolerate a
null or stale-but-valid (Arrays.copyOf preserves indices) array.

* Use multiplicative hash in PrimitiveIntHashMap to fix probe clustering

The open-addressed table used a cheap xor-shift hash. Packed world points
of nearby tiles differ only in a few low bits, so spatially-clustered
transport origins (agility shortcuts, boats, etc.) landed in clustered
table slots. With linear probing that primary clustering produced long
probe runs on the per-tile transport miss lookups, costing ~50ms on a
transport-heavy 657-step search.

Switching to a Fibonacci-style multiply plus xorshift avalanche spreads
the keys, bringing open addressing back in line with the old chained map
(167ms avg vs 161ms) while keeping its per-entry-object memory saving, and
faster than the original chained implementation on master (192ms).

* Hoist repeated node-field reads in pathfinder hot loop

When nodes were objects the JIT cached node.isTile()/node.packedPosition in
registers across the per-node checks for free. As int ids into the
structure-of-arrays NodeGraph, each graph.xxx(id) call re-indexes a backing
array (with a bounds check), and the main loop and addNeighbors read the same
node's tile-ness and position several times each.

Read each node's isTile/packedPosition once and pass them down, and read each
neighbour's fields once per iteration. This removes several array indexings
per node. The redundancy is absorbed by wide desktop CPUs but is costly on
narrower/smaller-cache machines; on a constrained -Xmx512m G1 heap this cut a
2.47M-node exhaustive search from ~394ms to ~355ms avg. Exploration is
unchanged (identical node count and path).

---------

Co-authored-by: Zoinkwiz <29153234+Zoinkwiz@users.noreply.github.com>
* Add legends guild crevice shortcut

Add legends guild crevice shortcut

* Add legends guild ladder

Add legends guild ladder

* Formatting fix

Formatting fix

* Fix tab formatting

Fix tab formatting
#255)

- Updated seasonal_transports.tsv and transports.tsv to improve formatting and add new entries.
- Introduced AgilityShortcutTest to verify that all AgilityShortcut enum constants have corresponding TSV entries.
- Added ObservatoryGrappleShortcutTest to validate the transport requirements and properties for the Observatory Grapple Shortcut.
- Enhanced transport data extraction methods to ensure comprehensive coverage of agility shortcuts and their requirements.
* Add PoH portal inside to outside entries

* Add entries for the non-default PoH teleports (inside is selected but we want to tele outside, or outside is selected but we want to tele inside)

* Add entries for the non-default PoH tablets.

* fix missing trailing tabs

* remove extra tab
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.