(this is my first post on lemmy, I hope this works like I expect it does. critique and advice are very welcome and appreciated)
fennecs 🔗
Hello, I’m tiger (aka jupiter), and since earlier this year I’ve been working on a free, libre, and open source Entity-Component System in pure C# that aims to minimize boilerplate and dependencies, works without code generators, and give decent flexibility and performance.
Who is it for?
ECS are an architecture to apply game or other logic to large numbers (ballpark: tens and hundreds of thousands) of objects or actors in an interactive game or simulation, and ECS libraries usually enable expressive composition that go beyond the the intrinsic optimizations of keeping data close together in memory.
fennecs is lightweight and works well with Godot 4.x, The NuGet package is going into its 0.6.0 release soon (about 20 releases so far - see the roadmap)
fennecs is made to operate in just about any sufficiently advanced .NET environment (.NET 8 or later), sadly this precludes using it with Unity for about another two years - but it was created after I spent around five years working with DOTS and coming to the conclusion that it is just too heavy on boilerplate for small teams or solo developers.
There are two simple demos for Godot, a demo for the Stride engine, and when I or one of the other contributors get around to it, demos for raylib_cs, Flax, MonoGame, and others are coming, as well as more demos for Godot.
Possibly ShapeEngine and especially Murder Engine are first in line, though.
What would I like?
Easy - I’d love to hear your thoughts or questions about it if you find the time. It means the world to me to hear other viewpoints or discuss features and contributions with the wider public.
Performance?
Funny you should ask. Everywhere I post, somehow with ECS this appears to be the first question.
Even though top performance isn’t the focus (minimum boilerplate is!), thanks to its compact memory layout, fennecs is doing quite all right in Doraku’s synthetic C# ECS benchmarks; of which you can find an excerpt on fennecs’s github. Performance hardliners can rest assured that another optimization pass comes with the 0.7.x release cycle, after the SIMD interfaces are made available.
Unique traits
fennecs is relational, allowing grouping entities by data-backed relations with other entities (bob owes alice
) that are automatically cleaned on entity despawn; by link objects (in physics world P
); and soon by arbitrary typed secondary keys (version 0.6.x).
Its Stream Views
allow code to access the contiguous storage components are stored in in various ways (including just the raw memory to submit to GPUs or game engines),
Batch operations can modify whole groups of entities or components at once, in a fast and intuitive way.
The SIMD operators currently in development are likely to keep fennecs at the forefront for a wide variety of typical tasks, such as integrating positions and accelerations, matrix transforms, increments, etc.
SIMD ops internally use AVX2, SSE2, and AdvSIMD intrinsics to vectorize their operations where possible, and more complex operations can be composed by sequential ops.
This field is where fennecs’ “low boilerplate” design goal doesn’t clash with actual high performance and systems programming, and it is great for the optimization stages in game development.
Each release has close to 100% unit test coverage, and because it’s pure C#, debugging, inspection and refactoring tools work very well with it.
One last, hidden advantage of being pure C# is that fennecs keeps its data in the .NET domain. Potential performance drawbacks of this are compensated very well by having to marshal function calls and component data back and forth much less frequently than many native-code ECS with C# bindings would.
Damn, such cute mascot pics, great work on that!