EnglishРусский Map

Ark

title
Ark
type
toolbox
summary
Архетипный ECS для Go с generic-запросами, встроенными связями между сущностями и без обязательного слоя систем
tags
golang, ecs, game-dev, data-oriented-design
language
Go
license
MIT / Apache-2.0
created
2026-04-10
updated
2026-04-10
lang
ru
translation_of
ark-ecs
source_updated
2026-04-10
translated
2026-09-01
translator
lllm/antigravity/gemini-3.7-flash-medium

Ark - это архетипная реализация Entity Component System для Go. Она повсеместно использует generic'и Go для типобезопасности: никаких приведений interface{}, никакой рефлексии во время запросов. Ноль внешних зависимостей, 100% покрытие тестами, документированные бенчмарки.

Основной API построен вокруг mapper'ов и filter'ов. Вы создаёте mapper для определённого кортежа компонентов, используете его для создания сущностей и назначения компонентов, а затем создаёте filter для того же кортежа и итерируетесь по нему:

world := ecs.NewWorld()
mapper := ecs.NewMap2[Position, Velocity](world)
filter := ecs.NewFilter2[Position, Velocity](world)

// Spawn an entity with both components
entity := mapper.NewEntity(&Position{X: 0, Y: 0}, &Velocity{DX: 1, DY: 2})

// Iterate over all entities matching the filter
query := filter.Query()
for query.Next() {
    pos, vel := query.Get()
    pos.X += vel.DX
    pos.Y += vel.DY
}

Mapper'ы и filter'ы создаются один раз и переиспользуются - это долгоживущие дескрипторы для нижележащего хранилища архетипов. Вызов query.Get() возвращает типизированные указатели прямо в массивы компонентов без каких-либо аллокаций.

Что делает Ark интересным помимо базового ECS:

Связи между сущностями первоклассны. Родитель-потомок, "targets", "owned by" - типы связей встроены в ядро, а не моделируются тег-компонентами и не реализуются в прикладном коде. Это значит, что система запросов может фильтровать напрямую по связям, а группировка по архетипам учитывает топологию связей.

Никакого обязательного слоя систем. В отличие от Unity DOTS или Bevy, Ark даёт сущности, компоненты, архетипы и запросы, но не навязывает планировщик систем. Вы сами пишете игровой цикл или шаг симуляции, вызывая запросы тогда и так, как вам нужно. Сопутствующая библиотека ark-tools добавляет опциональные планировщики и паттерны систем, если нужна готовая структура, но само ядро этого не требует.

Пакетные операции. Массовое создание сущностей, добавление и удаление компонентов оптимизированы отдельно от операций над одиночными сущностями. Для агентного моделирования или систем частиц, где за один тик создаются и уничтожаются тысячи сущностей, это имеет значение.

Система событий. Расширяемые события с фильтрацией и собственными типами. Добавление или удаление компонентов, создание или уничтожение сущностей могут вызывать слушателей. Это точка подключения для построения реактивных систем поверх ECS без постоянного опроса (polling).

Сериализация через ark-serde. Сопутствующая библиотека для сериализации мира: сохранение и загрузка всего состояния ECS. Полезна для сохранений в играх, чекпоинтов симуляции или отладки через снимки состояния.

В экосистему входят ark-tools (планировщики, паттерны систем), ark-serde (сериализация) и ark-pixel (интеграция рендеринга с игровым движком Pixel).

Ark отлично сочетается с go-bt для принятия решений ИИ на уровне отдельных сущностей: Ark отвечает за компоновку данных и пакетную обработку, а дерево поведения - за логику конкретной сущности. Обе библиотеки написаны на Go, имеют минимум зависимостей и схожий подход к проектированию: они компактны, компонуемы и не привязывают к конкретному фреймворку.

У проекта есть DOI для академического цитирования (Lange, M. & contributors, 2025, doi:10.5281/zenodo.14994239), что указывает на его происхождение из исследований в области агентного моделирования, а не из геймдева.

Repo: https://github.com/mlange-42/ark - 237 звёзд, двойная лицензия MIT/Apache-2.0, последняя версия v0.8.0 (апрель 2026 года).