Поддержка обработки сущностей в несколько системных потоков.
ВАЖНО! АКТИВНАЯ РАЗРАБОТКА ПРЕКРАЩЕНА, ВОЗМОЖНО ТОЛЬКО ИСПРАВЛЕНИЕ ОБНАРУЖЕННЫХ ОШИБОК. СОСТОЯНИЕ СТАБИЛЬНОЕ, ИЗВЕСТНЫХ ОШИБОК НЕ ОБНАРУЖЕНО. ЗА НОВЫМ ПОКОЛЕНИЕМ ФРЕЙМВОРКА СТОИТ СЛЕДИТЬ В БЛОГЕ https://leopotam.com/
Проверено на Unity 2020.3 (не зависит от Unity) и содержит asmdef-описания для компиляции в виде отдельных сборок и уменьшения времени рекомпиляции основного проекта.
Поддерживается установка в виде unity-модуля через git-ссылку в PackageManager или прямое редактирование Packages/manifest.json
:
"com.leopotam.ecslite.threads": "https://github.com/Leopotam/ecslite-threads.git",
По умолчанию используется последняя релизная версия. Если требуется версия "в разработке" с актуальными изменениями - следует переключиться на ветку develop
:
"com.leopotam.ecslite.threads": "https://github.com/Leopotam/ecslite-threads.git#develop",
Код так же может быть склонирован или получен в виде архива со страницы релизов.
struct C1 {
public int Id;
}
class TestThreadSystem : EcsThreadSystem<TestThread, C1> {
protected override int GetChunkSize (IEcsSystems systems) {
// Минимальное количество сущностей, после которого
// произойдет разделение обработки на новый поток.
// Этот метод вызывается каждый цикл обновления.
return 1000;
}
protected override EcsWorld GetWorld (IEcsSystems systems) {
// Мир, в котором содержатся фильтры и компонентные пулы.
return systems.GetWorld ();
}
protected override EcsFilter GetFilter (EcsWorld world) {
// Фильтр, сущности из которого будут обрабатываться.
return world.Filter<C1> ().End ();
}
// Дополнительная (опциональная) инициализация данных,
// которые необходимы для расчетов в потоках.
protected override void SetData (IEcsSystems systems, ref TestThread thread) {
thread.DeltaTime = Time.deltaTime;
}
}
ВАЖНО! EcsThreadSystem поддерживает до 4 типов компонентов.
struct TestThread : IEcsThread<C1> {
public float DeltaTime;
int[] _entities;
C1[] _pool1;
int[] _indices1;
public void Init (int[] entities, C1[] pool1, int[] indices1) {
// Сохранение массива сущностей.
_entities = entities;
// Сохранение dense-массива пула компонентов.
_pool1 = pool1;
// Сохранение sparse-массива пула компонентов.
_indices1 = indices1;
}
public void Execute (int threadId, int fromIndex, int beforeIndex) {
for (int i = fromIndex; i < beforeIndex; i++) {
var e = _entities[i];
ref var c1 = ref _pool1[_indices1[e]];
c1.Id = (c1.Id + 1) % 10000;
}
}
}
ВАЖНО! Внутри обработчика запрещено изменять состояние мира: нельзя создавать / удалять сущности, нельзя добавлять / удалять компоненты на сущности. Допускается только модификация данных внутри существующих компонентов.
Пакет выпускается под MIT-Red лицензией.
В случаях лицензирования по условиям MIT-Red не стоит расчитывать на персональные консультации или какие-либо гарантии.