Ark is an archetype-based Entity Component System (ECS) for Go. It is the successor of Arche.
——
Features • Installation • Usage • Tools
- Designed for performance and highly optimized.
- Well-documented, type-safe API.
- Entity relationships as first-class feature.
- Fast batch operations for mass manipulation.
- No systems. Just queries. Use your own structure (or the Tools).
- World serialization and deserialization with ark-serde.
To use Ark in a Go project, run:
go get github.com/mlange-42/ark
Below is the classical Position/Velocity example that every ECS shows in the docs.
See the User Guide, API docs and examples for details.
package main
import (
"math/rand/v2"
"github.com/mlange-42/ark/ecs"
)
// Position component
type Position struct {
X float64
Y float64
}
// Velocity component
type Velocity struct {
X float64
Y float64
}
func main() {
// Create a new World.
world := ecs.NewWorld()
// Create a component mapper.
mapper := ecs.NewMap2[Position, Velocity](&world)
// Create entities.
for range 1000 {
// Create a new Entity with components.
_ = mapper.NewEntity(
&Position{X: rand.Float64() * 100, Y: rand.Float64() * 100},
&Velocity{X: rand.NormFloat64(), Y: rand.NormFloat64()},
)
}
// Create a filter.
filter := ecs.NewFilter2[Position, Velocity](&world)
// Time loop.
for range 5000 {
// Get a fresh query.
query := filter.Query()
// Iterate it
for query.Next() {
// Component access through the Query.
pos, vel := query.Get()
// Update component fields.
pos.X += vel.X
pos.Y += vel.Y
}
}
}
- ark-serde provides JSON serialization and deserialization for Ark's World.
- ark-tools provides systems, a scheduler, and other useful stuff for Ark.
This project is distributed under the MIT license.