- Serialization: Removed component key integer prefix in json.
- In case of collisions, adds an integer suffix to the key name.
- New
ArtemisPlugin
API - New
WorldConfigurationBuilder
convenience class. - Added
World.edit(int entityId)
- Added
World.create()
, returns int entityId - Managers' inserted/removed passes Entity, again.
- EntitySystem extends BaseEntitySystem, new BaseEntitySystems work directly on entityId:
IteratingSystem
:EntityProcessingSystem
.IntervalSystem
andIntervalIteratingSystem
:IntervalEntity*System
DelayedIteratingSystem
:DelayedEntityProcessingSystem
IteratingSystem
eligible for compile-time optimizations, like EntityProcessingSystem.- By convention,
@Wire
is now implied on all systems and managers. Use@SkipWire
to suppress. - new
IntBag
methods: addAll, removeValue. - Dropped EntityObserver methods taking single entityId.
- Removed flyweight entities
- No more bugs due to escaping flyweights.
- Removed artemis-odb-debug, as it's no longer needed.
Manager
now treated as a system.Manager
is now part of theBaseSystem
hierarchy.- EntityObserver removed, covered by EntitySubscriptions.
- Removed deprecated methods and classes
- Removed
@Mapper
- Removed UUID related accessors on Entity and World.
- Removed
@PackedWeaver
marked as deprecated until performance issues have been resolved.EntityManager#isNew
removed.- Passive flag on systems removed.
- SystemInvocationStrategy#initialize added.
- Fix: No longer possible to accidentally add multiple systems of the same type.
- Fix: Deleted entities no longer mess up subscriptions when edited in
SubscriptionListener#removed
. - Fix: Deleted entities retain components.
-
BREAKING CHANGES
World#getEntity(int)
can return inactive Entities, check state usingEntity#isActive
orEntitityManager.isActive(int)
.Entity.isActive
no longer works for checking whether an entity was just created, instead useEntityManager#isNew(int)
.
-
New additional serialization backend: json via libgdx.
- GWT support, works with libgdx's HTML5 backend.
- Supports more libgdx classes out of the box.
-
New
artemis-odb-debug
artifact- Replaces normal artemis-odb with this (remove artemis-odb from pom/gradle/IDE)
- Performs extra runtime checks; tries to catch run-away flyweights.
- Incurs a rather hefty performance penalty.
-
Fix: SubscriptionListeners#removed ids resolved to a lot of nulls.
- Fix: IntDeque resets beginIndex when growing.
- InvocationStrategy configurable via WorldConfiguration.
- Add @SkipWire annotation to exclude injection targets.
- Entities recycled in FIFO order.
- Change EntitySubscription order to deleted/added/changed.
- Change AspectSubscription order to removed/inserted.
- FIX: Resolved potential "markSupported() is undefined for the type InputStream" message when compiling for GWT.
- Fix: Excessive object creation when serializing entities.
- Fix: Components referencing other entities are implicitly included when serializing.
- Fix: SaveFileFormat should only enumerate required components.
- Fix: entity reference operations could fail when loading into a fresh World instance.
- Added boolean
WorldSerializationManager#alwaysLoadStreamMemory
, forces fully loading the stream into memory during loading, even if stream reports thatmark
is supported. Necessary when working with libgdx's FileHandles.- Enabled by default.
- Fix: Duplicate ComponentNameComparator in json module, causing failing android builds.
- Fix: Entities not registered as added to world during batch entity synchronization.
-
BREAKING CHANGES
- EntitySubscription's inserted/removed method pass an IntBag of entity ids, instead of a Bag of entities.
- EntityObserver's methods pass entity id.
-
Optionally customized injection strategies.
- Injector caches class members per default.
-
Serialize to json.
- New WorldSerializationManager.
- Customize output by extending SaveFileFormat.
- Uses JsonBeans behind the scenes.
-
ComponentMappers now also sport get(int)/has(int) methods.
-
Entity get/setUuid deprecated.
-
Add getTag method to TagManager
-
Bag does equality comparisons, always.
-
EntityManager counters stubbed and deprecated.
-
Fix: UuidEntityManager deleted reused UUID's entity reference if it was created/deleted during the same tick.
-
Fix:
@SafeVarargs
on Aspect - no more warnings. -
Fix: Replaced pooled components were not returned to pool.
- Fix: Transmuters didn't resolve flyweight instances.
- Fix: Reduced visibility of AspectionSubscriptionManager constructor.
- Fix: NPE related to
EntitySubscription#createSubscription
.
-
MINOR BREAKING CHANGES
- BaseSystem is now the most basic system type.
- World#getSystems returns Bag.
- EntitySystem constructor expects Aspect.Builder:
- Implies existing classes have to be recompiled against this release.
- Existing custom entity systems need to pass Aspect.Builder to EntitySystem.
- EntitySystem no longer implements EntityObserver.
- ArtemisProfiler#initialize now requires BaseSystem instead of EntitySystem.
- VoidEntitySystem no longer subclass of EntitySystem.
setSystem
andsetManager
now underWorldConfiguration
. This effectively removesWorld#initialize
, as initializations happens inside World's constructor.
- BaseSystem is now the most basic system type.
-
New internal EntitySubscription and accompanying AspectSubscriptionManager resulting in cleaner and more flexible EntitySystems.
-
SystemInvocationStrategy opening up for more granular control over system processing.
- Default strategy behaves as before.
-
Aspect split into Aspect and Aspect.Builder.
- Simplified static method names, mirroring Aspect's old instance methods.
-
EntityFactories support for enum values.
-
Children of EntitySystems can create flyweight entities.
-
Fix: Uninitialized worlds threw cryptic NPE when invoking #process.
-
Fix:
World#createFactory(Class<EntityFactory>)
was package local. -
Fix:
Entity#edit
used together with EntityTransmuters or Archetypes caused the wrong compositionId to be reported, if all changes took place during the same processing round..
-
MINOR BREAKING CHANGES
- Entity instances should never be compared by reference equality; always do
entity1.equals(entity2)
. - It is no longer valid to add additional managers or systems to initialized worlds.
- Entity instances should never be compared by reference equality; always do
-
MundaneWireException thrown by World#inject if class lacks @Wire. Previously, it silently failed to inject.
-
Systems' entity iteration speed slightly faster.
-
New EntityTransmuter class, an alternative but more efficient way of adding/removing components.
-
Optimized entity removal speed.
-
Adding and removing existing entities from systems is now considerably faster.
-
Add enablePackedWeaving to maven, gradle and CLI tool.
-
Reduced EntitySystem memory footprint by 2/3.
-
Fix: Entity systems can now subscribe to all entities when aspect is empty.
-
Fix: EntityFactory annotation processor sometimes failed generating the factory implementation when running from within Eclipse.
- CLI command for configuring eclipse projects with annotation processor (entity factories)
- Fix: Adding a component to an archetyped entity prior to it being added to the world
resulted in the component never being registered.
- Note that editing an entity created by an archetype voids the performance benefit of archetypes..
-
MINOR BREAKING CHANGES
- Archetype moved to
com.artemis
package.
- Archetype moved to
-
Auto-generate EntityFactories.
-
ArchetypeBuilder constructor accepts null passed as parent.
- Fix: Chaining Entity#edit caused the internal bitset to reset between component removals.
- Gradle plugin for bytecode weaving. See Weave Automation
- Faster removal of components.
-
MINOR BREAKING CHANGES
- Entity state changes aren't reflected until the next system starts processing
or a new
World#process
round begins, whichever comes first. - Removed initial parameter (type) from Aspect methods; this changes the method descriptor, requiring any project to be recompiled.
- Entity state changes aren't reflected until the next system starts processing
or a new
-
The GWT backend can now read values off annotations.
-
Bytecode optimizations: (invoked via maven plugin or the CLI tool)
- Automatically optimize entity processing systems.
@PackedWeaver
components no longer overwrite data in multi-World scenarios.
-
Removed
artemis-benchmark
, refer to entity-system-benchmarks instead. -
It's no longer necessary to call
Entity#changedInWorld
andEntity#addToWorld
- Use
Entity#edit
when adding or removing components.
- Use
-
Adding and removing entities to systems is now approximately 150% faster.
- Entity compositions are no longer primarily identified by BitSets, but instead have a compositionId - EntitySystems track which composition ids are of interest.
ArchetypeBuilder
andArchetype
precalculates compositionId, allowing for greatly increased insertion performance.- Optimized
EntitySystem#check
, entities are processed in bulk, less checks when removing entities, removed systemIndex.
-
@Profile entity systems with custom classes.
-
New WorldConfiguration class
- Set expected entity count
- Limit number of rebuilt active entities per system/tick. Rebuilt indices ensure entities are processed in sequential order.
-
New interface
PackedComponent.DisposedWithWorld
for freeing packed components' resources when disposing the world.- Automatically added to all
@PackedWeaver
components.
- Automatically added to all
-
World#inject(Object)
can inject normal java classes with artemis types.- Requires that the injected object is annotated with
@Wire
- Requires that the injected object is annotated with
-
Less bounds checking for PackedComponents.
-
Added
World#getManagers
method. -
Lots of methods now deprecated
- These will be removed when 1.0.0 is released.
- See the
@deprecated
notice for how things work in the new world.
-
maven plugin registered as "artemis-odb", ie
mvn artemis-odb:matrix
, ormvn artemis-odb:artemis
-
Fix:
@PooledWeaver
wasn't resetting components.- Additionaly, only primitive fields are reset - objects are left intact.
-
Fix:
EntityManager#getActiveEntityCount
could report the wrong number if entities were deleted before having been added to the world. -
Fix: Disabled entities are no longer added to systems.
-
Fix:
EntityManager#isActive
could throw an OOB exception.. -
FIX: Possible IOOB in
@PackedWeaver
components when accessing component data.
- Better support for multiple concurrent worlds in regards to memory usage.
- Smaller entity instances.
- Fix: Actually fixed GWT support, bumped gwt to 2.6.0.
- Fix: Potential IOOB exceptions in UuidEntityManager.
- UUID is now optional for entities.
- Add UuidEntityManager to automatically map UUID:s to entities.
- UUID:s are lazily instantiated.
- Fix: GWT build was broken in 0.6.1.
- New standalone
artemis-odb-cli
artifact:- Handles weaving (new in 0.6.1) and matrix generation.
- Replaces
artemis-odb-matrix-X.Y.Z-cli.jar
.
- Fix: OOB Exception in ComponentManager with componentsByType when component types > 64.
- Fix: Calling
Entity#changedInWorld
before an entity is added to the world yields null.
- GWT support (demo) sporting
libgdx's reflection wrapper code.
- This means that
@Mapper
and@Wire
works for GWT builds too. - Note:
@PooledWeaver
and@PackedWeaver
don't work under GWT, though the presence of the annotations doesn't break anything.
- This means that
- Automatically generate a bird's eye view of artemis: Component Dependency Matrix.
- Faux structs with @PackedWeaver`.
- Looks and behaves just like normal java classes.
- Direct field access works - no need to generate getters and setters - i.e.
position.x += 0.24f
is valid. - Contiguously stored in memory, internally backed by a shared
ByteBuffer.allocateDirect()
. - Works for all components composed of primitive types.
- Entity systems and managers can
@Wire
(inject) anything from the world: will eventually replace@Mapper
. No need to annotate each field - just annotate the class and artemis will take care of injecting applicable fields.@Wire
can inject parent classes too.@Wire
can resolve non-final references. Eg, AbstractEntityFactory is resolved as EntityFactory etc. See test/example.
- EntitySystems process entities in ascending id order.
- Considerably faster processing when memory access is aligned (potential biggest gains from PackedComponents).
- Slightly slower insert/remove (3-4% with 4096 entities)
- New optional
UuidEntityManager
, tracks entities by UUID. - Optional
expectedEntityCount
parameters inWorld
constructor. -DideFriendlyPacking
: If true, will leave field stubs to keep IDE:s happy after transformations. Defaults to false.-DenablePooledWeaving
: Enables weaving of pooled components (more viable on Android than JVM). Defaults to true.-DenableArtemisPlugin
: If set to false, no weaving will take place (useful for debugging).- Fix: Possible NPE when removing recently created entities.
- Fix:
Entity#getComponent
would sometimes throw anArrayIndexOutOfBoundsException
.
- Changed artemis to a multi-module project (the
artemis
folder is the old root). - Entity instances are recycled.
- New component types,
PooledComponent
andPackedComponent
.- Optionally transform components with
@PackedWeaver
and@PooledWeaver
by configuring theartemis-odb-maven-plugin
.
- Optionally transform components with
- New method
Entity#createComponent(Class<Component>)
. - Annotation processor validates pooled and packed component types.
- Managers support
@Mapper
annotation. - No longer necessary to stub
Manager#initialize()
. GroupManager#getGroups
returns an empty bag if entity isn't in any group.World#dispose
for disposing managers and systems with managed resources.- Fix: DelayedEntityProcessingSystem prematurely expired entities.
- Fix: Recycled entities would sometimes have their components cleared when recycled during the same round as the original entity was deleted.
- Fix: GroupManager avoids duplicate entities and removes them upon deletion.