Releases: MadMartian/hydrazine-path-finding
TLAB Pressure Relief
This release focuses on improving engine performance by relieving memory allocation pressure on Thread-Local Allocation Buffers (See issue #6 for context). The engine made excessive use of temporaries that incur significant performance costs that the JIT cannot optimize. This release has eliminated the use of most temporaries. This pressure manifested most often while attempting to retrieve A* nodes from the cache, but also during initial voxel world bitmap cache generation.
The image below illustrates the relative pressure that Hydrazine Path Engine was putting on TLABs in the context of a game that uses it.
Hydrazine Path Engine types have not been visible as hotspot contenders in new allocation profiling results since this release.
As a general reminder, Hydrazine Path Engine is not thread-safe, any unsynchronized execution of the engine will result in undefined behaviour.
Breaking Changes:
com.extollit.linalg.immutable.Vec3i
is no more,com.extollit.gaming.ai.path.model.Coords
is used in lieu where applicable- Contract of
com.extollit.gaming.ai.path.model.INodeCalculator
has changed
Gimme Log4Shelter
Plug Log4Shell vulnerability by removing dependency upon Log4j and leveraging SLF4J instead.
State Persistence for Troubleshooting
Primary new feature in this release is an API for saving the state (deeply) of path-finding information for an entity. This is useful for transmitting fine-grained technical troubleshooting data between machines, refer to com.extollit.gaming.ai.path.persistence.Persistence
to get started.
Other enhancements in this release:
- New medium path-finding scheduling priority introduced (sits between low and high)
- Hydrazine Path Engine is now available on Maven Central
- New property intractible used to describe doors that typically cannot be opened by NPCs but may by others somewhat frequently.
- BREAKING CHANGE: Heads-up! consumers of this API must now check for null in calls to
HydrazinePathFinder.updatePathFor
, a null return value means that no path was possible given the requested details (an empty path by comparison is for paths with the same source as destination) - Incomplete paths can be truncated, this aids developers that want to prematurely "cancel" paths.
Path Options Introduction
Introducing path options, control how to determine a destination that is reachable from an arbitrary selection, this makes it possible to choose a random target up in the air for ground-based entities and have the path-finder select the nearest reachable location below it as an alternative to the best effort algorithm.
Additionally, this release includes rudimentary support for handling path-finding for entities that are constrained by an external force (e.g. a pathing entity that is being hauled by some other entity via a rope or chain).
See the README for full details.
NOTE: This release introduces breaking changes:
- The
initiatePathTo
method variants now take aPathObject
instance instead of a boolean forbestEffort
, best effort is now defined inPathOptions
viatargetingStrategy(PathOptions.TargetingStrategy.bestEffort)
- The interface property
bound()
was introduced oncom.extollit.gaming.ai.path.model.IPathingEntity
, implement to returnfalse
to remain backward compatible.
February Finale
Some minor performance and edge-case improvements since the last release. The primary purpose of this release is to close off 1.5.x paving the way for 1.6.x.
Progressive A* Graph Retention
In this update more of the A* graph is retained as a pathing entity moves from point to point. This results in more accurate and timely path-finding behaviour particularly for entities with low scheduling priority. Additionally, handling of doors was fixed in this release for entities capable of traversing through closed doors.
Second Lazy Pigs Update
- Fixed an NPE caused by manually truncating path objects
- Pathing fault timeouts were being ignored
Lazy Pigs Update
There was a bug where an entity (e.g. a pig) would give-up path-finding if there was a rather long wall in the way instead of finding a path around it. This was analogous to a buffer under-run scenario, it was sometimes mitigated by choosing high
path-finding scheduling priority. This update requires a minor API consumer modification: change references to PathObject
concrete class with the IPath
interface instead.
- Engine no longer returns a done or null path if there is no new path data, it returns an interim object instead to indicate path-finding is still in-progress
- Fault timeout calculation was wrong causing entities to invalidate their caches more often than necessary
- Introduce a new higher scheduling priority
extreme
for special circumstances where near-perfect path-finding is required. - When an entity commits too many path-finding faults the path-finding operation is aborted.
- Minor performance improvements
Airborne and Aqueous Path-finding - API Update
Slight change to a couple APIs in this release, renamed a couple contracts.
Airborne and Aqueous Path-finding
This update includes path-finding for entities with flying and/or swimming (aqueous) capabilities. Additionally it provides new APIs for adding a graph node filter and a path processor for fine-grained path-finding tuning.