diff --git a/README.md b/README.md index 1799af5b..de29c7a0 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ ![DefaultEcs](https://github.com/Doraku/DefaultEcs/raw/master/image/DefaultEcsLogo.png) DefaultEcs is an Entity Component System framework which aims to be accessible with little constraints while retaining as much performance as possible for game development. -[![NuGet](https://img.shields.io/badge/nuget-v0.9.2-brightgreen.svg)](https://www.nuget.org/packages/DefaultEcs) +[![NuGet](https://img.shields.io/badge/nuget-v0.10.0-brightgreen.svg)](https://www.nuget.org/packages/DefaultEcs) - [Requirement](#Requirement) - [Release note](./documentation/RELEASENOTE.md 'Release note') @@ -18,6 +18,7 @@ DefaultEcs is an Entity Component System framework which aims to be accessible w - [AEntitySystem](#Overview_System_AEntitySystem) - [AComponentSystem](#Overview_System_AComponentSystem) - [SystemRunner](#Overview_System_SystemRunner) + - [Command](#Overview_Command) - [Message](#Overview_Message) - [Serialization](#Overview_Serialization) - [TextSerializer](#Overview_Serialization_TextSerializer) @@ -306,6 +307,39 @@ It is safe to run a system with multithreading when: * for an AComponentSystem * each component can be safely updated separately with no dependency to an other component + +## Command +Since it is not possible to make structural modification on an Entity in a multithreading context, the EntityCommandRecorder type is provided to adress this short-coming. +It is possible de record command on entities in a thread-safe way to later execute them when those structural modifications are safe to do. +```C# +// This creates an expandable recorder with a default capacity of 1Ko +EntityCommandRecorder recorder = new EntityCommandRecorder(); + +// This creates a fixed capacity recorder of 512Ko +EntityCommandRecorder recorder = new EntityCommandRecorder(512); + +// This creates an expandable recorder with a default capacity of .5Ko which can have a maximum capacity of 2Ko +EntityCommandRecorder recorder = new EntityCommandRecorder(512, 2048); +``` + +Note that a fixed capacity EntityCommandRecorder (or one which has expanded to its max capacity) has better performance. +When needed, an expandable EntityCommandRecorder will double its capacity so it is prefered to use a power of 2 as default capacity. + +```C# +// Create a new Entity defered and give an EntityRecord to record commands on it +EntityRecord newRecord = recorder.CreateEntity(); + +// Register an Entity and give an EntityRecord to record commands on it +EntityRecord record = recorder.Record(entity); + +// EntityRecord has the same API as Entity so all action expected are available to record as command this way +newRecord.Set(true); +record.SetAsParentOf(newRecord); + +// To execute all recorded commands +recorder.Execute(world); +``` + ## Message It is possible to send and receive message transiting in a World. diff --git a/documentation/RELEASENOTE.md b/documentation/RELEASENOTE.md index 3f99b2e7..2d0328f7 100644 --- a/documentation/RELEASENOTE.md +++ b/documentation/RELEASENOTE.md @@ -1,3 +1,16 @@ +## DefaultEcs 0.9.2 +fixed double Dispose in AResourceManager +fixed reference count in AResourceManager when World is disposed +fixed Entity.CopyTo to correctly copy enabled/disabled state +fixed non unmanaged struct serialization in BinarySerializer + +added IEntitySetObserver and basic implementation EntitySetObserverEvents to get add/remove operations on EntitySet +added EntityCommandRecorder to defer structural entity changes + +breaking change: SubscribeAction renamed ActionIn + +[nuget package](https://www.nuget.org/packages/DefaultEcs/0.10.0) + ## DefaultEcs 0.9.2 added IsAlive property on Entity added With(Type[]) and Without(Type[]) on EntitySetBuilder diff --git a/source/DefaultEcs/DefaultEcs.Package.csproj b/source/DefaultEcs/DefaultEcs.Package.csproj index 53b432ba..73285107 100644 --- a/source/DefaultEcs/DefaultEcs.Package.csproj +++ b/source/DefaultEcs/DefaultEcs.Package.csproj @@ -19,11 +19,12 @@ git gamedev game-development game-engine ecs entity-component-system - 0.10.0-alpha1 + 0.10.0 fixed double Dispose in AResourceManager fixed reference count in AResourceManager when World is disposed fixed Entity.CopyTo to correctly copy enabled/disabled state +fixed non unmanaged struct serialization in BinarySerializer added IEntitySetObserver and basic implementation EntitySetObserverEvents to get add/remove operations on EntitySet added EntityCommandRecorder to defer structural entity changes